mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-27 11:55:53 +00:00
5d36aa9bbe
Add a dummy nop at the end of _start() to maintain the invariant that the return-pointer (rp) always point to the calling function. This makes unwinding stop at the last frame, as it should. Signed-off-by: David Mosberger-Tang <dmosberger@gmail.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
165 lines
3.9 KiB
ArmAsm
165 lines
3.9 KiB
ArmAsm
/*
|
|
* Copyright (C) 1998-2003 Hewlett-Packard Co
|
|
* David Mosberger-Tang <davidm@hpl.hp.com>
|
|
*/
|
|
|
|
#include <asm/asmmacro.h>
|
|
#include <asm/pal.h>
|
|
|
|
.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)
|