| version 1.23, 2004/02/16 17:11:27 |
version 1.24, 2004/02/20 17:35:01 |
|
|
| |
|
| #define GET_CURPCB(reg) movl CPUVAR(CURPCB),reg |
#define GET_CURPCB(reg) movl CPUVAR(CURPCB),reg |
| #define SET_CURPCB(reg) movl reg,CPUVAR(CURPCB) |
#define SET_CURPCB(reg) movl reg,CPUVAR(CURPCB) |
| |
|
| #define CLEAR_RESCHED(reg) movl reg,CPUVAR(RESCHED) |
#define CLEAR_RESCHED(reg) movl reg,CPUVAR(RESCHED) |
| |
|
| /* XXX temporary kluge; these should not be here */ |
/* XXX temporary kluge; these should not be here */ |
| Line 701 NENTRY(proc_trampoline) |
|
| Line 701 NENTRY(proc_trampoline) |
|
| pushl %ebx |
pushl %ebx |
| call *%esi |
call *%esi |
| addl $4,%esp |
addl $4,%esp |
| |
DO_DEFERRED_SWITCH(%eax) |
| INTRFASTEXIT |
INTRFASTEXIT |
| /* NOTREACHED */ |
/* NOTREACHED */ |
| |
|
|
|
| pushl %edi |
pushl %edi |
| GET_CURPCB(%eax) # load curpcb into eax and set on-fault |
GET_CURPCB(%eax) # load curpcb into eax and set on-fault |
| pushl PCB_ONFAULT(%eax) |
pushl PCB_ONFAULT(%eax) |
| movl $_C_LABEL(copy_fault), PCB_ONFAULT(%eax) |
movl $_C_LABEL(kcopy_fault), PCB_ONFAULT(%eax) |
| |
|
| movl 16(%esp),%esi |
movl 16(%esp),%esi |
| movl 20(%esp),%edi |
movl 20(%esp),%edi |
| Line 871 _C_LABEL(copyin_func): |
|
| Line 872 _C_LABEL(copyin_func): |
|
| */ |
*/ |
| /* LINTSTUB: Func: int copyout(const void *kaddr, void *uaddr, size_t len) */ |
/* LINTSTUB: Func: int copyout(const void *kaddr, void *uaddr, size_t len) */ |
| ENTRY(copyout) |
ENTRY(copyout) |
| |
DO_DEFERRED_SWITCH(%eax) |
| jmp *_C_LABEL(copyout_func) |
jmp *_C_LABEL(copyout_func) |
| |
|
| #if defined(I386_CPU) |
#if defined(I386_CPU) |
| Line 1012 ENTRY(i486_copyout) |
|
| Line 1014 ENTRY(i486_copyout) |
|
| */ |
*/ |
| /* LINTSTUB: Func: int copyin(const void *uaddr, void *kaddr, size_t len) */ |
/* LINTSTUB: Func: int copyin(const void *uaddr, void *kaddr, size_t len) */ |
| ENTRY(copyin) |
ENTRY(copyin) |
| |
DO_DEFERRED_SWITCH(%eax) |
| jmp *_C_LABEL(copyin_func) |
jmp *_C_LABEL(copyin_func) |
| |
|
| #if defined(I386_CPU) || defined(I486_CPU) || defined(I586_CPU) || \ |
#if defined(I386_CPU) || defined(I486_CPU) || defined(I586_CPU) || \ |
| Line 1062 ENTRY(i386_copyin) |
|
| Line 1065 ENTRY(i386_copyin) |
|
| NENTRY(copy_efault) |
NENTRY(copy_efault) |
| movl $EFAULT,%eax |
movl $EFAULT,%eax |
| |
|
| |
/* |
| |
* kcopy_fault is used by kcopy and copy_fault is used by copyin/out. |
| |
* |
| |
* they're distinguished for lazy pmap switching. see trap(). |
| |
*/ |
| |
/* LINTSTUB: Ignore */ |
| |
NENTRY(kcopy_fault) |
| |
GET_CURPCB(%edx) |
| |
popl PCB_ONFAULT(%edx) |
| |
popl %edi |
| |
popl %esi |
| |
ret |
| |
|
| /* LINTSTUB: Ignore */ |
/* LINTSTUB: Ignore */ |
| NENTRY(copy_fault) |
NENTRY(copy_fault) |
| GET_CURPCB(%edx) |
GET_CURPCB(%edx) |
| Line 1083 ENTRY(copyoutstr) |
|
| Line 1099 ENTRY(copyoutstr) |
|
| pushl %esi |
pushl %esi |
| pushl %edi |
pushl %edi |
| |
|
| |
DO_DEFERRED_SWITCH(%eax) |
| |
|
| movl 12(%esp),%esi # esi = from |
movl 12(%esp),%esi # esi = from |
| movl 16(%esp),%edi # edi = to |
movl 16(%esp),%edi # edi = to |
| movl 20(%esp),%edx # edx = maxlen |
movl 20(%esp),%edx # edx = maxlen |
| Line 1200 ENTRY(copyoutstr) |
|
| Line 1218 ENTRY(copyoutstr) |
|
| ENTRY(copyinstr) |
ENTRY(copyinstr) |
| pushl %esi |
pushl %esi |
| pushl %edi |
pushl %edi |
| |
|
| |
DO_DEFERRED_SWITCH(%eax) |
| |
|
| GET_CURPCB(%ecx) |
GET_CURPCB(%ecx) |
| movl $_C_LABEL(copystr_fault),PCB_ONFAULT(%ecx) |
movl $_C_LABEL(copystr_fault),PCB_ONFAULT(%ecx) |
| |
|
|
|
| */ |
*/ |
| /* LINTSTUB: Func: long fuword(const void *base) */ |
/* LINTSTUB: Func: long fuword(const void *base) */ |
| ENTRY(fuword) |
ENTRY(fuword) |
| |
DO_DEFERRED_SWITCH(%eax) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-4,%edx |
cmpl $VM_MAXUSER_ADDRESS-4,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
|
|
| */ |
*/ |
| /* LINTSTUB: Func: int fusword(const void *base) */ |
/* LINTSTUB: Func: int fusword(const void *base) */ |
| ENTRY(fusword) |
ENTRY(fusword) |
| |
DO_DEFERRED_SWITCH(%eax) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-2,%edx |
cmpl $VM_MAXUSER_ADDRESS-2,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
|
|
| */ |
*/ |
| /* LINTSTUB: Func: int fuswintr(const void *base) */ |
/* LINTSTUB: Func: int fuswintr(const void *base) */ |
| ENTRY(fuswintr) |
ENTRY(fuswintr) |
| |
cmpl $TLBSTATE_VALID, CPUVAR(TLBSTATE) |
| |
jnz _C_LABEL(fusuaddrfault) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-2,%edx |
cmpl $VM_MAXUSER_ADDRESS-2,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
| Line 1361 ENTRY(fuswintr) |
|
| Line 1386 ENTRY(fuswintr) |
|
| */ |
*/ |
| /* LINTSTUB: Func: int fubyte(const void *base) */ |
/* LINTSTUB: Func: int fubyte(const void *base) */ |
| ENTRY(fubyte) |
ENTRY(fubyte) |
| |
DO_DEFERRED_SWITCH(%eax) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-1,%edx |
cmpl $VM_MAXUSER_ADDRESS-1,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
| Line 1405 NENTRY(fusuaddrfault) |
|
| Line 1431 NENTRY(fusuaddrfault) |
|
| */ |
*/ |
| /* LINTSTUB: Func: int suword(void *base, long c) */ |
/* LINTSTUB: Func: int suword(void *base, long c) */ |
| ENTRY(suword) |
ENTRY(suword) |
| |
DO_DEFERRED_SWITCH(%eax) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-4,%edx |
cmpl $VM_MAXUSER_ADDRESS-4,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
|
|
| */ |
*/ |
| /* LINTSTUB: Func: int susword(void *base, short c) */ |
/* LINTSTUB: Func: int susword(void *base, short c) */ |
| ENTRY(susword) |
ENTRY(susword) |
| |
DO_DEFERRED_SWITCH(%eax) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-2,%edx |
cmpl $VM_MAXUSER_ADDRESS-2,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
|
|
| */ |
*/ |
| /* LINTSTUB: Func: int suswintr(void *base, short c) */ |
/* LINTSTUB: Func: int suswintr(void *base, short c) */ |
| ENTRY(suswintr) |
ENTRY(suswintr) |
| |
cmpl $TLBSTATE_VALID, CPUVAR(TLBSTATE) |
| |
jnz _C_LABEL(fusuaddrfault) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-2,%edx |
cmpl $VM_MAXUSER_ADDRESS-2,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
| Line 1537 ENTRY(suswintr) |
|
| Line 1567 ENTRY(suswintr) |
|
| */ |
*/ |
| /* LINTSTUB: Func: int subyte(void *base, int c) */ |
/* LINTSTUB: Func: int subyte(void *base, int c) */ |
| ENTRY(subyte) |
ENTRY(subyte) |
| |
DO_DEFERRED_SWITCH(%eax) |
| movl 4(%esp),%edx |
movl 4(%esp),%edx |
| cmpl $VM_MAXUSER_ADDRESS-1,%edx |
cmpl $VM_MAXUSER_ADDRESS-1,%edx |
| ja _C_LABEL(fusuaddrfault) |
ja _C_LABEL(fusuaddrfault) |
| Line 1722 ENTRY(cpu_switch) |
|
| Line 1753 ENTRY(cpu_switch) |
|
| */ |
*/ |
| |
|
| pushl %esi |
pushl %esi |
| call _C_LABEL(pmap_deactivate) # pmap_deactivate(oldproc) |
call _C_LABEL(pmap_deactivate2) # pmap_deactivate(oldproc) |
| addl $4,%esp |
addl $4,%esp |
| |
|
| movl L_ADDR(%esi),%esi |
movl L_ADDR(%esi),%esi |
| Line 1749 ENTRY(cpu_switch) |
|
| Line 1780 ENTRY(cpu_switch) |
|
| movl PCB_ESP(%edi),%esp |
movl PCB_ESP(%edi),%esp |
| movl PCB_EBP(%edi),%ebp |
movl PCB_EBP(%edi),%ebp |
| |
|
| |
|
| /* Switch address space. */ |
|
| movl PCB_CR3(%edi),%ecx |
|
| movl %ecx,%cr3 |
|
| |
|
| /* Switch TSS. Reset "task busy" flag before loading. */ |
/* Switch TSS. Reset "task busy" flag before loading. */ |
| #ifdef MULTIPROCESSOR |
#ifdef MULTIPROCESSOR |
| movl CPUVAR(GDT),%eax |
movl CPUVAR(GDT),%eax |
|
|
| */ |
*/ |
| |
|
| pushl %esi |
pushl %esi |
| call _C_LABEL(pmap_deactivate) # pmap_deactivate(oldproc) |
call _C_LABEL(pmap_deactivate2) # pmap_deactivate(oldproc) |
| addl $4,%esp |
addl $4,%esp |
| |
|
| movl L_ADDR(%esi),%esi |
movl L_ADDR(%esi),%esi |
| Line 2066 ENTRY(cpu_exit) |
|
| Line 2092 ENTRY(cpu_exit) |
|
| movl _C_LABEL(gdt),%eax |
movl _C_LABEL(gdt),%eax |
| #endif |
#endif |
| |
|
| /* Switch address space. */ |
|
| movl PCB_CR3(%esi),%ecx |
|
| movl %ecx,%cr3 |
|
| |
|
| /* Switch TSS. */ |
/* Switch TSS. */ |
| andl $~0x0200,4-SEL_KPL(%eax,%edx,1) |
andl $~0x0200,4-SEL_KPL(%eax,%edx,1) |
| ltr %dx |
ltr %dx |
|
|
| INTRENTRY |
INTRENTRY |
| |
|
| #ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
| |
cmpl $0, CPUVAR(WANT_PMAPLOAD) |
| |
jz 1f |
| |
pushl $6f |
| |
call _C_LABEL(printf) |
| |
addl $4, %esp |
| |
1: |
| movl CPUVAR(ILEVEL),%ebx |
movl CPUVAR(ILEVEL),%ebx |
| testl %ebx,%ebx |
testl %ebx,%ebx |
| jz 1f |
jz 1f |
|
|
| pushl %esp |
pushl %esp |
| call *P_MD_SYSCALL(%edx) # get pointer to syscall() function |
call *P_MD_SYSCALL(%edx) # get pointer to syscall() function |
| addl $4,%esp |
addl $4,%esp |
| 2: /* Check for ASTs on exit to user mode. */ |
syscall_checkast: |
| |
/* Check for ASTs on exit to user mode. */ |
| cli |
cli |
| CHECK_ASTPENDING(%eax) |
CHECK_ASTPENDING(%eax) |
| je 1f |
je 1f |
|
|
| pushl %esp |
pushl %esp |
| call _C_LABEL(trap) |
call _C_LABEL(trap) |
| addl $4,%esp |
addl $4,%esp |
| jmp 2b |
jmp syscall_checkast /* re-check ASTs */ |
| |
1: CHECK_DEFERRED_SWITCH(%eax) |
| |
jnz 9f |
| #ifndef DIAGNOSTIC |
#ifndef DIAGNOSTIC |
| 1: INTRFASTEXIT |
INTRFASTEXIT |
| #else /* DIAGNOSTIC */ |
#else /* DIAGNOSTIC */ |
| 1: cmpl $IPL_NONE,CPUVAR(ILEVEL) |
cmpl $IPL_NONE,CPUVAR(ILEVEL) |
| jne 3f |
jne 3f |
| INTRFASTEXIT |
INTRFASTEXIT |
| 3: sti |
3: sti |
|
|
| jmp 2b |
jmp 2b |
| 4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n" |
4: .asciz "WARNING: SPL NOT LOWERED ON SYSCALL EXIT\n" |
| 5: .asciz "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n" |
5: .asciz "WARNING: SPL NOT ZERO ON SYSCALL ENTRY\n" |
| |
6: .asciz "WARNING: WANT PMAPLOAD ON SYSCALL ENTRY\n" |
| #endif /* DIAGNOSTIC */ |
#endif /* DIAGNOSTIC */ |
| |
9: sti |
| |
call _C_LABEL(pmap_load) |
| |
jmp syscall_checkast /* re-check ASTs */ |
| |
|
| #if NNPX > 0 |
#if NNPX > 0 |
| /* |
/* |