| version 1.44.2.1, 2010/12/10 22:14:57 |
version 1.45, 2007/02/09 21:55:04 |
|
|
| pushl %eax |
pushl %eax |
| lret |
lret |
| |
|
| |
NENTRY(x86_flush) |
| |
/* Reload code selector by doing intersegment return. */ |
| |
popl %eax |
| |
pushl $GSEL(GCODE_SEL, SEL_KPL) |
| |
pushl %eax |
| |
lret |
| |
|
| /*****************************************************************************/ |
/*****************************************************************************/ |
| |
|
| /* |
/* |
| Line 879 ENTRY(cpu_switch) |
|
| Line 886 ENTRY(cpu_switch) |
|
| xorl %esi,%esi |
xorl %esi,%esi |
| sti |
sti |
| idle_unlock: |
idle_unlock: |
| #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG) |
|
| call _C_LABEL(sched_unlock_idle) |
call _C_LABEL(sched_unlock_idle) |
| #endif |
|
| /* Interrupts are okay again. */ |
/* Interrupts are okay again. */ |
| pushl $IPL_NONE # spl0() |
pushl $IPL_NONE # spl0() |
| call _C_LABEL(Xspllower) # process pending interrupts |
call _C_LABEL(spllower) # process pending interrupts |
| addl $4,%esp |
addl $4,%esp |
| jmp idle_start |
jmp idle_start |
| idle_zero: |
idle_zero: |
|
|
| idle_exit: |
idle_exit: |
| movl $IPL_HIGH,CPUVAR(ILEVEL) # splhigh |
movl $IPL_HIGH,CPUVAR(ILEVEL) # splhigh |
| sti |
sti |
| #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG) |
|
| call _C_LABEL(sched_lock_idle) |
call _C_LABEL(sched_lock_idle) |
| #endif |
|
| movl _C_LABEL(sched_whichqs),%ecx |
movl _C_LABEL(sched_whichqs),%ecx |
| bsfl %ecx,%ebx |
bsfl %ecx,%ebx |
| jz idle_unlock |
jz idle_unlock |
|
|
| * we're running at splhigh(), but it's otherwise okay to take |
* we're running at splhigh(), but it's otherwise okay to take |
| * interrupts here. |
* interrupts here. |
| */ |
*/ |
| /*sti -- no it isn't! */ |
sti |
| leal _C_LABEL(sched_qs)(,%ebx,8),%eax # select q |
leal _C_LABEL(sched_qs)(,%ebx,8),%eax # select q |
| |
|
| movl L_FORW(%eax),%edi # unlink from front of process q |
movl L_FORW(%eax),%edi # unlink from front of process q |
| Line 1049 switch_restored: |
|
| Line 1052 switch_restored: |
|
| SET_CURPCB(%esi) |
SET_CURPCB(%esi) |
| |
|
| /* Interrupts are okay again. */ |
/* Interrupts are okay again. */ |
| /*sti -- nope, not yet! */ |
sti |
| |
|
| /* |
/* |
| * Check for restartable atomic sequences (RAS) |
* Check for restartable atomic sequences (RAS) |
| Line 1062 switch_restored: |
|
| Line 1065 switch_restored: |
|
| movl $1,%ebx |
movl $1,%ebx |
| |
|
| switch_return: |
switch_return: |
| #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG) |
|
| call _C_LABEL(sched_unlock_idle) |
call _C_LABEL(sched_unlock_idle) |
| #endif |
|
| sti /* NOW we can do this, after releasing sched_lock */ |
|
| cmpl $0,CPUVAR(IPENDING) |
cmpl $0,CPUVAR(IPENDING) |
| jz 3f |
jz 3f |
| pushl $IPL_NONE # spl0() |
pushl $IPL_NONE # spl0() |
| call _C_LABEL(Xspllower) # process pending interrupts |
call _C_LABEL(spllower) # process pending interrupts |
| addl $4,%esp |
addl $4,%esp |
| 3: |
3: |
| movl $IPL_HIGH,CPUVAR(ILEVEL) # splhigh() |
movl $IPL_HIGH,CPUVAR(ILEVEL) # splhigh() |
| Line 1130 ENTRY(cpu_switchto) |
|
| Line 1130 ENTRY(cpu_switchto) |
|
| * We're running at splhigh(), but it's otherwise okay to take |
* We're running at splhigh(), but it's otherwise okay to take |
| * interrupts here. |
* interrupts here. |
| */ |
*/ |
| /*sti -- no it isn't! */ |
sti |
| |
|
| /* Jump into the middle of cpu_switch */ |
/* Jump into the middle of cpu_switch */ |
| xorl %eax,%eax |
xorl %eax,%eax |
| Line 1156 ENTRY(cpu_exit) |
|
| Line 1156 ENTRY(cpu_exit) |
|
| movl CPUVAR(IDLE_PCB),%esi |
movl CPUVAR(IDLE_PCB),%esi |
| movl CPUVAR(IDLE_TSS_SEL),%edx |
movl CPUVAR(IDLE_TSS_SEL),%edx |
| #endif |
#endif |
| /* In case we fault... */ |
|
| movl $0,CPUVAR(CURLWP) |
|
| |
|
| /* Restore the idle context. */ |
/* Restore the idle context. */ |
| cli |
cli |
| Line 1188 ENTRY(cpu_exit) |
|
| Line 1186 ENTRY(cpu_exit) |
|
| /* Record new pcb. */ |
/* Record new pcb. */ |
| SET_CURPCB(%esi) |
SET_CURPCB(%esi) |
| |
|
| |
/* Now off the CPU. */ |
| |
movl $0,CPUVAR(CURLWP) |
| |
|
| /* Interrupts are okay again. */ |
/* Interrupts are okay again. */ |
| sti |
sti |
| |
|
| /* |
|
| * Schedule the dead LWP's stack to be freed. |
|
| */ |
|
| pushl %edi |
|
| call _C_LABEL(lwp_exit2) |
|
| addl $4,%esp |
|
| |
|
| /* Jump into cpu_switch() with the right state. */ |
/* Jump into cpu_switch() with the right state. */ |
| xorl %esi,%esi |
xorl %esi,%esi |
| movl %esi,CPUVAR(CURLWP) |
|
| jmp idle_start |
jmp idle_start |
| |
|
| /* |
/* |