diff options
author | jhb <jhb@FreeBSD.org> | 2000-01-27 21:06:13 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2000-01-27 21:06:13 +0000 |
commit | 30f3b614b3b18d86be7ff164b9aba2617637b9c6 (patch) | |
tree | b57e55a011be3e7dc854c76c7a4c98efef112081 /sys/boot | |
parent | ff0f07b53e923a318b213c4d31475b839e375cf7 (diff) | |
download | FreeBSD-src-30f3b614b3b18d86be7ff164b9aba2617637b9c6.zip FreeBSD-src-30f3b614b3b18d86be7ff164b9aba2617637b9c6.tar.gz |
Fix brokenness introduced with the PAGING conditional variable. The value
of %cr0 wasn't reloaded into %eax before being modified to turn protected
mode off if PAGING was not defined. The result was that the processor did
not exit protected mode, so when it tried to jump to segment 0x0 in the
next instruction to clear the prefetch cache like one should when leaving
protected mode, it actually tried to jump to a null selector, causing a
GPF.
Diffstat (limited to 'sys/boot')
-rw-r--r-- | sys/boot/i386/btx/btx/btx.S | 4 | ||||
-rw-r--r-- | sys/boot/i386/btx/btx/btx.s | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/sys/boot/i386/btx/btx/btx.S b/sys/boot/i386/btx/btx/btx.S index c315b56..6a00f63 100644 --- a/sys/boot/i386/btx/btx/btx.S +++ b/sys/boot/i386/btx/btx/btx.S @@ -249,11 +249,11 @@ init.9: pushb $0x0 # general # exit: cli # Disable interrupts movl $MEM_ESP0,%esp # Clear stack -ifdef(`PAGING',` # # Turn off paging. # movl %cr0,%eax # Get CR0 +ifdef(`PAGING',` andl $~0x80000000,%eax # Disable movl %eax,%cr0 # paging ') @@ -800,11 +800,13 @@ intx30: cmpl $SYS_EXEC,%eax # Exec system call? movl $MEM_USR,%eax # User base address addl 0xc(%esp,1),%eax # Change to user leal 0x4(%eax),%esp # stack +ifdef(`PAGING',` movl %cr0,%eax # Turn andl $~0x80000000,%eax # off movl %eax,%cr0 # paging xorl %eax,%eax # Flush movl %eax,%cr3 # TLB +') popl %eax # Call call *%eax # program intx30.1: incb %ss:btx_hdr+0x7 # Flag reboot diff --git a/sys/boot/i386/btx/btx/btx.s b/sys/boot/i386/btx/btx/btx.s index c315b56..6a00f63 100644 --- a/sys/boot/i386/btx/btx/btx.s +++ b/sys/boot/i386/btx/btx/btx.s @@ -249,11 +249,11 @@ init.9: pushb $0x0 # general # exit: cli # Disable interrupts movl $MEM_ESP0,%esp # Clear stack -ifdef(`PAGING',` # # Turn off paging. # movl %cr0,%eax # Get CR0 +ifdef(`PAGING',` andl $~0x80000000,%eax # Disable movl %eax,%cr0 # paging ') @@ -800,11 +800,13 @@ intx30: cmpl $SYS_EXEC,%eax # Exec system call? movl $MEM_USR,%eax # User base address addl 0xc(%esp,1),%eax # Change to user leal 0x4(%eax),%esp # stack +ifdef(`PAGING',` movl %cr0,%eax # Turn andl $~0x80000000,%eax # off movl %eax,%cr0 # paging xorl %eax,%eax # Flush movl %eax,%cr3 # TLB +') popl %eax # Call call *%eax # program intx30.1: incb %ss:btx_hdr+0x7 # Flag reboot |