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