diff options
Diffstat (limited to 'src/kernel/start.S')
-rw-r--r-- | src/kernel/start.S | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/kernel/start.S b/src/kernel/start.S index a97fd484f..e8b19b4f5 100644 --- a/src/kernel/start.S +++ b/src/kernel/start.S @@ -302,15 +302,19 @@ _other_thread_spinlock_complete: or 2,2,2 ;// Raise thread priority. isync ;// Get CPU object from thread ID. - mfspr r1, PIR lis r2, _ZN10CpuManager7cv_cpusE@h ori r2, r2, _ZN10CpuManager7cv_cpusE@l - ld r2, 0(r2) ;// Dereference cv_cpus to get array. - muli r3, r1, 8 - add r2, r3, r2 - ld r3, 0(r2) ;// Load CPU object. + mfspr r1, PIR ;// Extract node id. + extrwi r1, r1, 3, 19 + sldi r1, r1, 3 + ldx r2, r1, r2 ;// Dereference to get on-node CPUs array. + cmpi cr0, r2, 0 ;// Check for NULL node array. + beq- 1f + mfspr r1, PIR ;// Extract on-node CPU id. + clrlslwi r1, r1, 22, 3 + ldx r3, r1, r2 ;// Load CPU object. cmpi cr0, r3, 0 ;// Check for NULL CPU object. - beq- cr0, 1f ;// Jump to handling if no CPU object found. + beq- 1f ld r1, CPU_KERNEL_STACK(r3) ;// Load initial stack. lis r2, smp_slave_main@h ;// Load TOC base. @@ -589,11 +593,16 @@ intvect_system_reset: ;// Get CPU object from thread ID, check for NULL which implies not ;// started yet. - mfspr r1, PIR lis r2, _ZN10CpuManager7cv_cpusE@h ori r2, r2, _ZN10CpuManager7cv_cpusE@l - ld r2, 0(r2) ;// Dereference cv_cpus to get array. - muli r1, r1, 8 + mfspr r1, PIR ;// Extract node id. + extrwi r1, r1, 3, 19 + sldi r1, r1, 3 + ldx r2, r1, r2 ;// Dereference to get on-node CPUs array. + cmpi cr0, r2, 0 ;// Check for NULL node array. + beq- _start + mfspr r1, PIR ;// Extract on-node CPU id. + clrlslwi r1, r1, 22, 3 ldx r2, r1, r2 ;// Load CPU object. cmpi cr0, r2, 0 ;// Check for NULL CPU object. beq- _start |