PERFORCE change 47996 for review
Peter Wemm
peter at FreeBSD.org
Tue Mar 2 10:42:01 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=47996
Change 47996 by peter at peter_daintree on 2004/03/02 10:41:06
check in some uncommitted changes
Affected files ...
.. //depot/projects/hammer/sys/amd64/amd64/cpu_switch.S#20 edit
.. //depot/projects/hammer/sys/amd64/amd64/genassym.c#31 edit
.. //depot/projects/hammer/sys/amd64/include/pcb.h#16 edit
Differences ...
==== //depot/projects/hammer/sys/amd64/amd64/cpu_switch.S#20 (text+ko) ====
@@ -42,6 +42,12 @@
#include "assym.s"
+#ifdef SMP
+#define LK lock ;
+#else
+#define LK
+#endif
+
/*****************************************************************************/
/* Scheduling */
/*****************************************************************************/
@@ -66,10 +72,7 @@
/* release bit from old pm_active */
movq TD_PROC(%rdi), %rdx /* oldtd->td_proc */
movq P_VMSPACE(%rdx), %rdx /* proc->p_vmspace */
-#ifdef SMP
- lock
-#endif
- btrl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* clear old */
+ LK btrl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* clear old */
1:
movq TD_PCB(%rsi),%rdx /* newtd->td_proc */
movq PCB_CR3(%rdx),%rdx
@@ -77,10 +80,7 @@
/* set bit in new pm_active */
movq TD_PROC(%rsi),%rdx
movq P_VMSPACE(%rdx), %rdx
-#ifdef SMP
- lock
-#endif
- btsl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* set new */
+ LK btsl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* set new */
jmp sw1
/*
@@ -92,13 +92,7 @@
* %rsi = newtd
*/
ENTRY(cpu_switch)
-
/* Switch to new thread. First, save context. */
-#ifdef INVARIANTS
- testq %rdi,%rdi /* no thread? */
- jz badsw2 /* no, panic */
-#endif
-
movq TD_PCB(%rdi),%r8
movq (%rsp),%rax /* Hardware registers */
@@ -113,6 +107,17 @@
pushfq /* PSL */
popq PCB_RFLAGS(%r8)
+ testl $PCB_32BIT,PCB_FLAGS(%r8)
+ jz 1f /* no, skip over */
+
+ /* Save segment selector numbers */
+ movl %ds,PCB_DS(%r8)
+ movl %es,PCB_ES(%r8)
+ movl %fs,PCB_FS(%r8)
+ movl %gs,PCB_GS(%r8)
+ jmp 2f
+1:
+
/* Save userland %fs */
movl $MSR_FSBASE,%ecx
rdmsr
@@ -124,13 +129,8 @@
rdmsr
movl %eax,PCB_GSBASE(%r8)
movl %edx,PCB_GSBASE+4(%r8)
+2:
- /* Save segment selector numbers */
- movl %ds,PCB_DS(%r8)
- movl %es,PCB_ES(%r8)
- movl %fs,PCB_FS(%r8)
- movl %gs,PCB_GS(%r8)
-
/* Test if debug registers should be saved. */
testl $PCB_DBREGS,PCB_FLAGS(%r8)
jz 1f /* no, skip over */
@@ -164,10 +164,6 @@
1:
/* Save is done. Now fire up new thread. Leave old vmspace. */
-#ifdef INVARIANTS
- testq %rsi,%rsi /* no thread? */
- jz badsw3 /* no, panic */
-#endif
movq TD_PCB(%rsi),%r8
/* switch address space */
@@ -185,18 +181,12 @@
/* Release bit from old pmap->pm_active */
movq TD_PROC(%rdi), %rdx /* oldproc */
movq P_VMSPACE(%rdx), %rdx
-#ifdef SMP
- lock
-#endif
- btrl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* clear old */
+ LK btrl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* clear old */
/* Set bit in new pmap->pm_active */
movq TD_PROC(%rsi),%rdx /* newproc */
movq P_VMSPACE(%rdx), %rdx
-#ifdef SMP
- lock
-#endif
- btsl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* set new */
+ LK btsl %eax, VM_PMAP+PM_ACTIVE(%rdx) /* set new */
sw1:
/*
@@ -205,6 +195,9 @@
*/
movq TD_PCB(%rsi),%r8
+ testl $PCB_32BIT,PCB_FLAGS(%r8)
+ jz 1f /* no, skip over */
+
/* Restore segment selector numbers */
movl PCB_DS(%r8),%ds
movl PCB_ES(%r8),%es
@@ -215,6 +208,8 @@
rdmsr
movl PCB_GS(%r8),%gs
wrmsr
+ jmp 2f
+1:
/* Restore userland %fs */
movl $MSR_FSBASE,%ecx
@@ -227,6 +222,7 @@
movl PCB_GSBASE(%r8),%eax
movl PCB_GSBASE+4(%r8),%edx
wrmsr
+2:
/* Update the TSS_RSP0 pointer for the next interrupt */
movq PCPU(TSSP), %rax
@@ -272,79 +268,8 @@
orq %rcx,%rax
movq %rax,%dr7
1:
-
ret
-#ifdef INVARIANTS
-badsw1:
- pushq %rax
- pushq %rcx
- pushq %rdx
- pushq %rbx
- pushq %rbp
- pushq %rsi
- pushq %rdi
- pushq %r8
- pushq %r9
- pushq %r10
- pushq %r11
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
- movq $0,%rdi
- movq $0,%rsi
- leaq sw0_1,%rdx
- call __panic
-sw0_1: .asciz "cpu_throw: no newthread supplied"
-
-badsw2:
- pushq %rax
- pushq %rcx
- pushq %rdx
- pushq %rbx
- pushq %rbp
- pushq %rsi
- pushq %rdi
- pushq %r8
- pushq %r9
- pushq %r10
- pushq %r11
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
- movq $0,%rdi
- movq $0,%rsi
- leaq sw0_2,%rdx
- call __panic
-sw0_2: .asciz "cpu_switch: no curthread supplied"
-
-badsw3:
- pushq %rax
- pushq %rcx
- pushq %rdx
- pushq %rbx
- pushq %rbp
- pushq %rsi
- pushq %rdi
- pushq %r8
- pushq %r9
- pushq %r10
- pushq %r11
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
- movq $0,%rdi
- movq $0,%rsi
- leaq sw0_3,%rdx
- call __panic
-sw0_3: .asciz "cpu_switch: no newthread supplied"
-#endif
-
-noswitch: .asciz "cpu_switch: called!"
-nothrow: .asciz "cpu_throw: called!"
/*
* savectx(pcb)
* Update pcb, saving current processor state.
==== //depot/projects/hammer/sys/amd64/amd64/genassym.c#31 (text+ko) ====
@@ -142,6 +142,7 @@
ASSYM(PCB_DR6, offsetof(struct pcb, pcb_dr6));
ASSYM(PCB_DR7, offsetof(struct pcb, pcb_dr7));
ASSYM(PCB_DBREGS, PCB_DBREGS);
+ASSYM(PCB_32BIT, PCB_32BIT);
ASSYM(PCB_FLAGS, offsetof(struct pcb, pcb_flags));
ASSYM(PCB_FULLCTX, PCB_FULLCTX);
==== //depot/projects/hammer/sys/amd64/include/pcb.h#16 (text+ko) ====
@@ -75,6 +75,7 @@
u_long pcb_flags;
#define PCB_DBREGS 0x02 /* process using debug registers */
#define PCB_FPUINITDONE 0x08 /* fpu state is initialized */
+#define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */
#define PCB_FULLCTX 0x80 /* full context restore on sysret */
caddr_t pcb_onfault; /* copyin/out fault recovery */
More information about the p4-projects
mailing list