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