/* * Copyright (C) 1998-2003 Hewlett-Packard Co * David Mosberger-Tang */ #include #include .bss .align 16 stack_mem: .skip 16834 .text /* This needs to be defined because lib/string.c:strlcat() calls it in case of error... */ GLOBAL_ENTRY(printk) break 0 END(printk) GLOBAL_ENTRY(_start) .prologue .save rp, r0 .body movl gp = __gp movl sp = stack_mem+16384-16 bsw.1 br.call.sptk.many rp=start_bootloader 0: nop 0 /* dummy nop to make unwinding work */ END(_start) /* * Set a break point on this function so that symbols are available to set breakpoints in * the kernel being debugged. */ GLOBAL_ENTRY(debug_break) br.ret.sptk.many b0 END(debug_break) GLOBAL_ENTRY(ssc) .regstk 5,0,0,0 mov r15=in4 break 0x80001 br.ret.sptk.many b0 END(ssc) GLOBAL_ENTRY(jmp_to_kernel) .regstk 2,0,0,0 mov r28=in0 mov b7=in1 br.sptk.few b7 END(jmp_to_kernel) /* * r28 contains the index of the PAL function * r29--31 the args * Return values in ret0--3 (r8--11) */ GLOBAL_ENTRY(pal_emulator_static) mov r8=-1 mov r9=256 ;; cmp.gtu p6,p7=r9,r28 /* r28 <= 255? */ (p6) br.cond.sptk.few static ;; mov r9=512 ;; cmp.gtu p6,p7=r9,r28 (p6) br.cond.sptk.few stacked ;; static: cmp.eq p6,p7=PAL_PTCE_INFO,r28 (p7) br.cond.sptk.few 1f ;; mov r8=0 /* status = 0 */ movl r9=0x100000000 /* tc.base */ movl r10=0x0000000200000003 /* count[0], count[1] */ movl r11=0x1000000000002000 /* stride[0], stride[1] */ br.cond.sptk.few rp 1: cmp.eq p6,p7=PAL_FREQ_RATIOS,r28 (p7) br.cond.sptk.few 1f mov r8=0 /* status = 0 */ movl r9 =0x100000064 /* proc_ratio (1/100) */ movl r10=0x100000100 /* bus_ratio<<32 (1/256) */ movl r11=0x100000064 /* itc_ratio<<32 (1/100) */ ;; 1: cmp.eq p6,p7=PAL_RSE_INFO,r28 (p7) br.cond.sptk.few 1f mov r8=0 /* status = 0 */ mov r9=96 /* num phys stacked */ mov r10=0 /* hints */ mov r11=0 br.cond.sptk.few rp 1: cmp.eq p6,p7=PAL_CACHE_FLUSH,r28 /* PAL_CACHE_FLUSH */ (p7) br.cond.sptk.few 1f mov r9=ar.lc movl r8=524288 /* flush 512k million cache lines (16MB) */ ;; mov ar.lc=r8 movl r8=0xe000000000000000 ;; .loop: fc r8 add r8=32,r8 br.cloop.sptk.few .loop sync.i ;; srlz.i ;; mov ar.lc=r9 mov r8=r0 ;; 1: cmp.eq p6,p7=PAL_PERF_MON_INFO,r28 (p7) br.cond.sptk.few 1f mov r8=0 /* status = 0 */ movl r9 =0x08122f04 /* generic=4 width=47 retired=8 cycles=18 */ mov r10=0 /* reserved */ mov r11=0 /* reserved */ mov r16=0xffff /* implemented PMC */ mov r17=0x3ffff /* implemented PMD */ add r18=8,r29 /* second index */ ;; st8 [r29]=r16,16 /* store implemented PMC */ st8 [r18]=r0,16 /* clear remaining bits */ ;; st8 [r29]=r0,16 /* clear remaining bits */ st8 [r18]=r0,16 /* clear remaining bits */ ;; st8 [r29]=r17,16 /* store implemented PMD */ st8 [r18]=r0,16 /* clear remaining bits */ mov r16=0xf0 /* cycles count capable PMC */ ;; st8 [r29]=r0,16 /* clear remaining bits */ st8 [r18]=r0,16 /* clear remaining bits */ mov r17=0xf0 /* retired bundles capable PMC */ ;; st8 [r29]=r16,16 /* store cycles capable */ st8 [r18]=r0,16 /* clear remaining bits */ ;; st8 [r29]=r0,16 /* clear remaining bits */ st8 [r18]=r0,16 /* clear remaining bits */ ;; st8 [r29]=r17,16 /* store retired bundle capable */ st8 [r18]=r0,16 /* clear remaining bits */ ;; st8 [r29]=r0,16 /* clear remaining bits */ st8 [r18]=r0,16 /* clear remaining bits */ ;; 1: cmp.eq p6,p7=PAL_VM_SUMMARY,r28 (p7) br.cond.sptk.few 1f mov r8=0 /* status = 0 */ movl r9=0x2044040020F1865 /* num_tc_levels=2, num_unique_tcs=4 */ /* max_itr_entry=64, max_dtr_entry=64 */ /* hash_tag_id=2, max_pkr=15 */ /* key_size=24, phys_add_size=50, vw=1 */ movl r10=0x183C /* rid_size=24, impl_va_msb=60 */ ;; 1: cmp.eq p6,p7=PAL_MEM_ATTRIB,r28 (p7) br.cond.sptk.few 1f mov r8=0 /* status = 0 */ mov r9=0x80|0x01 /* NatPage|WB */ ;; 1: br.cond.sptk.few rp stacked: br.ret.sptk.few rp END(pal_emulator_static)