xref: /haiku/src/system/kernel/arch/ppc/arch_asm.S (revision 2ae568931fcac7deb9f1e6ff4e47213fbfe4029b)
1/*
2** Copyright 2003, Travis Geiselbrecht. All rights reserved.
3** Distributed under the terms of the NewOS License.
4*/
5
6#define FUNCTION(x) .global x; .type x,@function; x
7
8#define MSR_EXCEPTIONS_ENABLED 15
9
10.text
11
12// ToDo: fixme
13FUNCTION(reboot):
14    b   .
15
16
17/* void arch_int_enable_interrupts(void) */
18FUNCTION(arch_int_enable_interrupts):
19	mfmsr	%r3							// load msr
20
21	li		%r4, 1
22	insrwi  %r3, %r4, 1, 31 - MSR_EXCEPTIONS_ENABLED
23		// sets bit 15, EE
24
25	mtmsr	%r3							// put it back into the msr
26	blr
27
28
29/* int arch_int_disable_interrupts(void)
30 * r3
31 */
32FUNCTION(arch_int_disable_interrupts):
33	mfmsr	%r4							// load msr
34
35	mr		%r3, %r4					// save old state
36	rlwinm  %r4, %r4, 0, 32 - MSR_EXCEPTIONS_ENABLED, 30 - MSR_EXCEPTIONS_ENABLED
37		// clears bit 15, EE
38
39	mtmsr	%r4							// put it back into the msr
40	blr
41
42
43/* void arch_int_restore_interrupts(int oldState)
44 *									r3
45 */
46FUNCTION(arch_int_restore_interrupts):
47	mfmsr	%r4
48
49	rlwimi  %r4, %r3, 0, 31 - MSR_EXCEPTIONS_ENABLED, 31 - MSR_EXCEPTIONS_ENABLED
50		// clear or set bit 15, EE to the same state as in r3, oldState
51
52	mtmsr	%r4
53	blr
54
55/* bool arch_int_are_interrupts_enabled(void) */
56FUNCTION(arch_int_are_interrupts_enabled):
57	mfmsr	%r3							// load msr
58	extrwi	%r3, %r3, 1, 31 - MSR_EXCEPTIONS_ENABLED
59		// mask out the EE bit
60	blr
61
62
63// ToDo: fixme
64FUNCTION(dbg_save_registers):
65	blr
66
67/* long long get_time_base(void) */
68FUNCTION(get_time_base):
691:
70	mftbu	%r3							// get the upper time base register
71	mftb	%r4							// get the lower time base register
72	mftbu	%r5							// get the upper again
73	cmpw	%r5, %r3					// see if it changed while we were reading the lower
74	bne-	1b							// if so, repeat
75	blr
76
77/* void getibats(int bats[8]); */
78FUNCTION(getibats):
79	mfibatu 	%r0,0
80	stw     	%r0,0(%r3)
81	mfibatl 	%r0,0
82	stwu		%r0,4(%r3)
83	mfibatu 	%r0,1
84	stwu		%r0,4(%r3)
85	mfibatl 	%r0,1
86	stwu		%r0,4(%r3)
87	mfibatu 	%r0,2
88	stwu		%r0,4(%r3)
89	mfibatl 	%r0,2
90	stwu		%r0,4(%r3)
91	mfibatu 	%r0,3
92	stwu		%r0,4(%r3)
93	mfibatl 	%r0,3
94	stwu		%r0,4(%r3)
95	blr
96
97// void setibats(int bats[8]);
98FUNCTION(setibats):
99	lwz			%r0,0(%r3)
100	mtibatu 	0,%r0
101	isync
102	lwzu		%r0,4(%r3)
103	mtibatl 	0,%r0
104	isync
105	lwzu		%r0,4(%r3)
106	mtibatu 	1,%r0
107	isync
108	lwzu		%r0,4(%r3)
109	mtibatl 	1,%r0
110	isync
111	lwzu		%r0,4(%r3)
112	mtibatu 	2,%r0
113	isync
114	lwzu		%r0,4(%r3)
115	mtibatl 	2,%r0
116	isync
117	lwzu		%r0,4(%r3)
118	mtibatu 	3,%r0
119	isync
120	lwzu		%r0,4(%r3)
121	mtibatl 	3,%r0
122	isync
123
124	blr
125
126// void getdbats(int bats[8]);
127FUNCTION(getdbats):
128	mfdbatu 	%r0,0
129	stw     	%r0,0(%r3)
130	mfdbatl 	%r0,0
131	stwu		%r0,4(%r3)
132	mfdbatu 	%r0,1
133	stwu		%r0,4(%r3)
134	mfdbatl 	%r0,1
135	stwu		%r0,4(%r3)
136	mfdbatu 	%r0,2
137	stwu		%r0,4(%r3)
138	mfdbatl 	%r0,2
139	stwu		%r0,4(%r3)
140	mfdbatu		%r0,3
141	stwu		%r0,4(%r3)
142	mfdbatl 	%r0,3
143	stwu		%r0,4(%r3)
144	blr
145
146// void setdbats(int bats[8]);
147FUNCTION(setdbats):
148	lwz			%r0,0(%r3)
149	mtdbatu 	0,%r0
150	lwzu		%r0,4(%r3)
151	mtdbatl 	0,%r0
152	lwzu		%r0,4(%r3)
153	mtdbatu 	1,%r0
154	lwzu		%r0,4(%r3)
155	mtdbatl 	1,%r0
156	lwzu		%r0,4(%r3)
157	mtdbatu 	2,%r0
158	lwzu		%r0,4(%r3)
159	mtdbatl 	2,%r0
160	lwzu		%r0,4(%r3)
161	mtdbatu 	3,%r0
162	lwzu		%r0,4(%r3)
163	mtdbatl 	3,%r0
164	sync
165
166	blr
167
168// unsigned int gethid0();
169FUNCTION(gethid0):
170	mfspr		%r3, 1008
171	blr
172
173// void sethid0(unsigned int val);
174FUNCTION(sethid0):
175	mtspr		1008, %r3
176	blr
177
178// unsigned int getl2cr();
179FUNCTION(getl2cr):
180	mfspr		%r3, 1017
181	blr
182
183// void setl2cr(unsigned int val);
184FUNCTION(setl2cr):
185	mtspr		1017, %r3
186	blr
187
188// void ppc_context_switch(addr_t *old_sp, addr_t new_sp);
189FUNCTION(ppc_context_switch):
190
191	// regs to push on the stack: r13-r31, cr, r2, lr
192#define SAVE_FRAME_SIZE (((31 - 13 + 1) + 1 + 1 + 1) * 4)
193
194	// push the old regs we need to save on the stack
195	addi		%sp, %sp, -SAVE_FRAME_SIZE
196	stmw		%r13, 12(%sp)
197	stw			%r2, 8(%sp)
198	mfcr		%r0
199	stw			%r0, 4(%sp)
200	mflr		%r0
201	stw			%r0, 0(%sp)
202
203	// save the old stack pointer
204	stw			%sp, 0(%r3)
205
206	// restore the new stack pointer
207	mr			%sp, %r4
208
209	// restore the new regs
210	lwz			%r0, 0(%sp)
211	mtlr		%r0
212	lwz			%r0, 4(%sp)
213	mtcr		%r0
214	lwz			%r2, 8(%sp)
215	lmw			%r13, 12(%sp)
216	addi		%sp, %sp, SAVE_FRAME_SIZE
217
218	blr
219
220// void arch_thread_switch_kstack_and_call(addr_t new_kstack, void (*func)(void *), void *arg)
221FUNCTION(arch_thread_switch_kstack_and_call):
222	mr			%sp, %r3	// set the new stack pointer
223	mtctr		%r4			// move the target function into CTR
224	mr			%r3, %r5	// move the arg to this func to the new arg
225	bctr
226
227