Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Copyright (C) 1998-2003 Hewlett-Packard Co | |
3 | * David Mosberger-Tang <davidm@hpl.hp.com> | |
4 | */ | |
5 | ||
6 | #include <asm/asmmacro.h> | |
dc90e95f | 7 | #include <asm/pal.h> |
1da177e4 LT |
8 | |
9 | .bss | |
10 | .align 16 | |
11 | stack_mem: | |
12 | .skip 16834 | |
13 | ||
14 | .text | |
15 | ||
16 | /* This needs to be defined because lib/string.c:strlcat() calls it in case of error... */ | |
17 | GLOBAL_ENTRY(printk) | |
18 | break 0 | |
19 | END(printk) | |
20 | ||
21 | GLOBAL_ENTRY(_start) | |
22 | .prologue | |
23 | .save rp, r0 | |
24 | .body | |
25 | movl gp = __gp | |
a4cce104 | 26 | movl sp = stack_mem+16384-16 |
1da177e4 LT |
27 | bsw.1 |
28 | br.call.sptk.many rp=start_bootloader | |
5d36aa9b | 29 | 0: nop 0 /* dummy nop to make unwinding work */ |
1da177e4 LT |
30 | END(_start) |
31 | ||
32 | /* | |
33 | * Set a break point on this function so that symbols are available to set breakpoints in | |
34 | * the kernel being debugged. | |
35 | */ | |
36 | GLOBAL_ENTRY(debug_break) | |
37 | br.ret.sptk.many b0 | |
38 | END(debug_break) | |
39 | ||
40 | GLOBAL_ENTRY(ssc) | |
41 | .regstk 5,0,0,0 | |
42 | mov r15=in4 | |
43 | break 0x80001 | |
44 | br.ret.sptk.many b0 | |
45 | END(ssc) | |
46 | ||
47 | GLOBAL_ENTRY(jmp_to_kernel) | |
48 | .regstk 2,0,0,0 | |
49 | mov r28=in0 | |
50 | mov b7=in1 | |
51 | br.sptk.few b7 | |
52 | END(jmp_to_kernel) | |
53 | ||
dc90e95f PC |
54 | /* |
55 | * r28 contains the index of the PAL function | |
56 | * r29--31 the args | |
57 | * Return values in ret0--3 (r8--11) | |
58 | */ | |
1da177e4 LT |
59 | GLOBAL_ENTRY(pal_emulator_static) |
60 | mov r8=-1 | |
61 | mov r9=256 | |
62 | ;; | |
63 | cmp.gtu p6,p7=r9,r28 /* r28 <= 255? */ | |
64 | (p6) br.cond.sptk.few static | |
65 | ;; | |
66 | mov r9=512 | |
67 | ;; | |
68 | cmp.gtu p6,p7=r9,r28 | |
69 | (p6) br.cond.sptk.few stacked | |
70 | ;; | |
dc90e95f | 71 | static: cmp.eq p6,p7=PAL_PTCE_INFO,r28 |
1da177e4 LT |
72 | (p7) br.cond.sptk.few 1f |
73 | ;; | |
74 | mov r8=0 /* status = 0 */ | |
75 | movl r9=0x100000000 /* tc.base */ | |
76 | movl r10=0x0000000200000003 /* count[0], count[1] */ | |
77 | movl r11=0x1000000000002000 /* stride[0], stride[1] */ | |
78 | br.cond.sptk.few rp | |
dc90e95f | 79 | 1: cmp.eq p6,p7=PAL_FREQ_RATIOS,r28 |
1da177e4 LT |
80 | (p7) br.cond.sptk.few 1f |
81 | mov r8=0 /* status = 0 */ | |
82 | movl r9 =0x100000064 /* proc_ratio (1/100) */ | |
83 | movl r10=0x100000100 /* bus_ratio<<32 (1/256) */ | |
84 | movl r11=0x100000064 /* itc_ratio<<32 (1/100) */ | |
85 | ;; | |
dc90e95f | 86 | 1: cmp.eq p6,p7=PAL_RSE_INFO,r28 |
1da177e4 LT |
87 | (p7) br.cond.sptk.few 1f |
88 | mov r8=0 /* status = 0 */ | |
89 | mov r9=96 /* num phys stacked */ | |
90 | mov r10=0 /* hints */ | |
91 | mov r11=0 | |
92 | br.cond.sptk.few rp | |
dc90e95f | 93 | 1: cmp.eq p6,p7=PAL_CACHE_FLUSH,r28 /* PAL_CACHE_FLUSH */ |
1da177e4 LT |
94 | (p7) br.cond.sptk.few 1f |
95 | mov r9=ar.lc | |
96 | movl r8=524288 /* flush 512k million cache lines (16MB) */ | |
97 | ;; | |
98 | mov ar.lc=r8 | |
99 | movl r8=0xe000000000000000 | |
100 | ;; | |
101 | .loop: fc r8 | |
102 | add r8=32,r8 | |
103 | br.cloop.sptk.few .loop | |
104 | sync.i | |
105 | ;; | |
106 | srlz.i | |
107 | ;; | |
108 | mov ar.lc=r9 | |
109 | mov r8=r0 | |
110 | ;; | |
dc90e95f | 111 | 1: cmp.eq p6,p7=PAL_PERF_MON_INFO,r28 |
1da177e4 LT |
112 | (p7) br.cond.sptk.few 1f |
113 | mov r8=0 /* status = 0 */ | |
114 | movl r9 =0x08122f04 /* generic=4 width=47 retired=8 cycles=18 */ | |
115 | mov r10=0 /* reserved */ | |
116 | mov r11=0 /* reserved */ | |
117 | mov r16=0xffff /* implemented PMC */ | |
118 | mov r17=0x3ffff /* implemented PMD */ | |
119 | add r18=8,r29 /* second index */ | |
120 | ;; | |
121 | st8 [r29]=r16,16 /* store implemented PMC */ | |
122 | st8 [r18]=r0,16 /* clear remaining bits */ | |
123 | ;; | |
124 | st8 [r29]=r0,16 /* clear remaining bits */ | |
125 | st8 [r18]=r0,16 /* clear remaining bits */ | |
126 | ;; | |
127 | st8 [r29]=r17,16 /* store implemented PMD */ | |
128 | st8 [r18]=r0,16 /* clear remaining bits */ | |
129 | mov r16=0xf0 /* cycles count capable PMC */ | |
130 | ;; | |
131 | st8 [r29]=r0,16 /* clear remaining bits */ | |
132 | st8 [r18]=r0,16 /* clear remaining bits */ | |
133 | mov r17=0xf0 /* retired bundles capable PMC */ | |
134 | ;; | |
135 | st8 [r29]=r16,16 /* store cycles capable */ | |
136 | st8 [r18]=r0,16 /* clear remaining bits */ | |
137 | ;; | |
138 | st8 [r29]=r0,16 /* clear remaining bits */ | |
139 | st8 [r18]=r0,16 /* clear remaining bits */ | |
140 | ;; | |
141 | st8 [r29]=r17,16 /* store retired bundle capable */ | |
142 | st8 [r18]=r0,16 /* clear remaining bits */ | |
143 | ;; | |
144 | st8 [r29]=r0,16 /* clear remaining bits */ | |
145 | st8 [r18]=r0,16 /* clear remaining bits */ | |
146 | ;; | |
dc90e95f PC |
147 | 1: cmp.eq p6,p7=PAL_VM_SUMMARY,r28 |
148 | (p7) br.cond.sptk.few 1f | |
149 | mov r8=0 /* status = 0 */ | |
150 | movl r9=0x2044040020F1865 /* num_tc_levels=2, num_unique_tcs=4 */ | |
151 | /* max_itr_entry=64, max_dtr_entry=64 */ | |
152 | /* hash_tag_id=2, max_pkr=15 */ | |
153 | /* key_size=24, phys_add_size=50, vw=1 */ | |
154 | movl r10=0x183C /* rid_size=24, impl_va_msb=60 */ | |
155 | ;; | |
156 | 1: cmp.eq p6,p7=PAL_MEM_ATTRIB,r28 | |
157 | (p7) br.cond.sptk.few 1f | |
158 | mov r8=0 /* status = 0 */ | |
159 | mov r9=0x80|0x01 /* NatPage|WB */ | |
160 | ;; | |
1da177e4 LT |
161 | 1: br.cond.sptk.few rp |
162 | stacked: | |
163 | br.ret.sptk.few rp | |
164 | END(pal_emulator_static) |