diff options
| author | Nate Williams <nate@FreeBSD.org> | 1996-03-11 06:48:57 +0000 |
|---|---|---|
| committer | Nate Williams <nate@FreeBSD.org> | 1996-03-11 06:48:57 +0000 |
| commit | f42e1448c8c0e2aec0ee38c5268f7086552e2d99 (patch) | |
| tree | f3645cd2f6be08eeedfda86ff7b725513302df03 | |
| parent | 7c9dcdde0061d7ccf5533cea90a3092dc981ef2b (diff) | |
Notes
| -rw-r--r-- | sys/i386/apm/apm.c | 4 | ||||
| -rw-r--r-- | sys/i386/apm/apm_init/apm_init.inc | 52 | ||||
| -rw-r--r-- | sys/i386/apm/apm_init/real_prot.S | 49 | ||||
| -rw-r--r-- | sys/i386/apm/apm_setup.s | 18 | ||||
| -rw-r--r-- | sys/i386/bios/apm.c | 4 | ||||
| -rw-r--r-- | sys/i386/bios/apm_init/apm_init.inc | 52 | ||||
| -rw-r--r-- | sys/i386/bios/apm_init/real_prot.S | 49 | ||||
| -rw-r--r-- | sys/i386/bios/apm_setup.s | 18 | ||||
| -rw-r--r-- | sys/i386/include/apm_segments.h | 13 |
9 files changed, 116 insertions, 143 deletions
diff --git a/sys/i386/apm/apm.c b/sys/i386/apm/apm.c index c0813403ed50..268755916e14 100644 --- a/sys/i386/apm/apm.c +++ b/sys/i386/apm/apm.c @@ -13,19 +13,17 @@ * * Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * - * $Id: apm.c,v 1.22 1995/12/25 07:38:26 bde Exp $ + * $Id: apm.c,v 1.23 1995/12/27 16:16:02 bde Exp $ */ #include "apm.h" #include <sys/param.h> -#include <conf.h> #include <sys/conf.h> #include <sys/kernel.h> #ifdef DEVFS #include <sys/devfsext.h> #endif /*DEVFS*/ -#include <sys/kernel.h> #include <sys/systm.h> #include <sys/malloc.h> #include <sys/ioctl.h> diff --git a/sys/i386/apm/apm_init/apm_init.inc b/sys/i386/apm/apm_init/apm_init.inc index 44fc01e743ee..82f476caacaf 100644 --- a/sys/i386/apm/apm_init/apm_init.inc +++ b/sys/i386/apm/apm_init/apm_init.inc @@ -2,55 +2,51 @@ /* Original file is 'apm_init' */ .byte 0xfa, 0x55, 0x66, 0x8c, 0xd8, 0x66, 0x8e, 0xe0 - .byte 0x66, 0xb8, 0xf0, 0x00, 0x66, 0x8e, 0xd8, 0x66 - .byte 0x8e, 0xc0, 0x66, 0x8e, 0xd0, 0x89, 0x25, 0x94 + .byte 0x66, 0xb8, 0xe8, 0x00, 0x66, 0x8e, 0xd8, 0x66 + .byte 0x8e, 0xc0, 0x66, 0x8e, 0xd0, 0x89, 0x25, 0x74 .byte 0x01, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x01, 0x00 - .byte 0x0f, 0x01, 0x0d, 0xb0, 0x01, 0x00, 0x00, 0xe8 - .byte 0x24, 0x01, 0x00, 0x00, 0xb4, 0x53, 0xb0, 0x00 + .byte 0x0f, 0x01, 0x0d, 0x90, 0x01, 0x00, 0x00, 0xe8 + .byte 0x14, 0x01, 0x00, 0x00, 0xb4, 0x53, 0xb0, 0x00 .byte 0x66, 0xbb, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xcd .byte 0x15, 0xfa, 0x73, 0x15, 0x66, 0xe8, 0xde, 0x00 - .byte 0x00, 0x00, 0xc7, 0x05, 0x98, 0x01, 0x00, 0x00 + .byte 0x00, 0x00, 0xc7, 0x05, 0x78, 0x01, 0x00, 0x00 .byte 0xff, 0xff, 0xff, 0xff, 0xe9, 0x92, 0x00, 0x00 .byte 0x00, 0x89, 0xc2, 0x66, 0xe8, 0xc7, 0x00, 0x00 .byte 0x00, 0x80, 0xff, 0x50, 0x75, 0x05, 0x80, 0xfb - .byte 0x4d, 0x74, 0x0c, 0xc7, 0x05, 0x98, 0x01, 0x00 + .byte 0x4d, 0x74, 0x0c, 0xc7, 0x05, 0x78, 0x01, 0x00 .byte 0x00, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x74, 0xf7 .byte 0xc1, 0x02, 0x00, 0x00, 0x00, 0x75, 0x0c, 0xc7 - .byte 0x05, 0x98, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff + .byte 0x05, 0x78, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff .byte 0xff, 0xeb, 0x60, 0x81, 0xe2, 0xff, 0xff, 0x00 - .byte 0x00, 0x89, 0x15, 0x98, 0x01, 0x00, 0x00, 0x81 - .byte 0xe1, 0xff, 0xff, 0x00, 0x00, 0x89, 0x0d, 0x9c - .byte 0x01, 0x00, 0x00, 0xe8, 0xb0, 0x00, 0x00, 0x00 + .byte 0x00, 0x89, 0x15, 0x78, 0x01, 0x00, 0x00, 0x81 + .byte 0xe1, 0xff, 0xff, 0x00, 0x00, 0x89, 0x0d, 0x7c + .byte 0x01, 0x00, 0x00, 0xe8, 0xa0, 0x00, 0x00, 0x00 .byte 0xb4, 0x53, 0xb0, 0x03, 0x66, 0xbb, 0x00, 0x00 .byte 0x00, 0x00, 0xfb, 0xcd, 0x15, 0xfa, 0x73, 0x12 .byte 0x66, 0xe8, 0x6a, 0x00, 0x00, 0x00, 0xc7, 0x05 - .byte 0x98, 0x01, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff + .byte 0x78, 0x01, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff .byte 0xeb, 0x21, 0x89, 0xc5, 0x66, 0xe8, 0x56, 0x00 .byte 0x00, 0x00, 0xb8, 0xff, 0xff, 0x00, 0x00, 0x21 .byte 0xc5, 0x21, 0xc1, 0x21, 0xc2, 0x21, 0xc6, 0x21 .byte 0xc7, 0xc1, 0xe5, 0x10, 0x09, 0xe9, 0xc1, 0xe7 - .byte 0x10, 0x09, 0xfe, 0xfa, 0x0f, 0x01, 0x1d, 0xb0 - .byte 0x01, 0x00, 0x00, 0x8b, 0x25, 0x94, 0x01, 0x00 - .byte 0x00, 0x8b, 0x2d, 0x98, 0x01, 0x00, 0x00, 0x8b - .byte 0x3d, 0x9c, 0x01, 0x00, 0x00, 0x66, 0x8c, 0xe0 + .byte 0x10, 0x09, 0xfe, 0xfa, 0x0f, 0x01, 0x1d, 0x90 + .byte 0x01, 0x00, 0x00, 0x8b, 0x25, 0x74, 0x01, 0x00 + .byte 0x00, 0x8b, 0x2d, 0x78, 0x01, 0x00, 0x00, 0x8b + .byte 0x3d, 0x7c, 0x01, 0x00, 0x00, 0x66, 0x8c, 0xe0 .byte 0x66, 0x8e, 0xd0, 0x66, 0x8e, 0xc0, 0x66, 0x8e .byte 0xd8, 0x31, 0xc0, 0x66, 0x8e, 0xe0, 0x89, 0xe8 .byte 0x5d, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0xfa, 0x0f, 0x20, 0xc0, 0x66, 0x83, 0xc8, 0x01 .byte 0x0f, 0x22, 0xc0, 0x66, 0xea, 0x33, 0x01, 0x00 - .byte 0x00, 0xe8, 0x00, 0xb8, 0xf0, 0x00, 0x00, 0x00 - .byte 0x66, 0x8e, 0xd8, 0x66, 0x8e, 0xd0, 0x66, 0x8e - .byte 0xc0, 0x0f, 0x01, 0x1d, 0xb0, 0x01, 0x00, 0x00 - .byte 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0xa1, 0x90, 0x01, 0x00, 0x00, 0xc1, 0xf8, 0x04 - .byte 0x66, 0x50, 0x66, 0xb8, 0x72, 0x01, 0x66, 0x50 - .byte 0xea, 0x67, 0x01, 0x00, 0x00, 0xf8, 0x00, 0x0f - .byte 0x20, 0xc0, 0x66, 0x83, 0xe0, 0xfe, 0x0f, 0x22 - .byte 0xc0, 0xcb, 0x66, 0x8c, 0xc8, 0x66, 0x8e, 0xd8 - .byte 0x66, 0x8e, 0xd0, 0x66, 0x8e, 0xc0, 0x67, 0x66 - .byte 0x0f, 0x01, 0x1d, 0xb6, 0x01, 0x00, 0x00, 0x66 - .byte 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0xe0, 0x00, 0x66, 0xb8, 0xe8, 0x00, 0x8e + .byte 0xd8, 0x8e, 0xd0, 0x8e, 0xc0, 0xc3, 0x00, 0x00 + .byte 0x66, 0xb8, 0xf8, 0x00, 0xea, 0x4b, 0x01, 0x00 + .byte 0x00, 0xf0, 0x00, 0x8e, 0xd8, 0x8e, 0xd0, 0x8e + .byte 0xc0, 0x0f, 0x20, 0xc0, 0x66, 0x83, 0xe0, 0xfe + .byte 0x0f, 0x22, 0xc0, 0x66, 0xea, 0x63, 0x01, 0x00 + .byte 0x00, 0x00, 0x80, 0x8c, 0xc8, 0x8e, 0xd8, 0x8e + .byte 0xd0, 0x8e, 0xc0, 0x66, 0xc3, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -58,4 +54,4 @@ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -/* Total size = 0x01c0 */ +/* Total size = 0x01a0 */ diff --git a/sys/i386/apm/apm_init/real_prot.S b/sys/i386/apm/apm_init/real_prot.S index d61a394bb763..cf1514affd1d 100644 --- a/sys/i386/apm/apm_init/real_prot.S +++ b/sys/i386/apm/apm_init/real_prot.S @@ -24,7 +24,7 @@ * the rights to redistribute these changes. * * from: Mach, Revision 2.2 92/04/04 11:34:13 rpd - * $Id: asm.S,v 1.2 1993/10/16 19:11:27 rgrimes Exp $ + * $Id: real_prot.S,v 1.1 1994/10/01 02:55:51 davidg Exp $ */ @@ -69,18 +69,19 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* * Modified for APM BIOS initializer by HOSOKAWA Tatsumi * - * See also locore.s. It supports these functions works correctly. + * See also locore.s. + * (This file is based directly on /sys/i386/boot/biosboot/asm.S) */ .file "real_prot.S" #include "real_prot.h" #include "apm_segments.h" +#include "apm_bios.h" CR0_PE_ON = 0x1 CR0_PE_OFF = 0xfffffffe -.globl _ouraddr .text /* @@ -117,19 +118,21 @@ ENTRY(real_to_prot) */ data32 ljmp $(APM_INIT_CS_SEL), $xprot - xprot: + /* * we are in USE32 mode now * set up the protected mode segment registers : DS, SS, ES */ - mov $(APM_INIT_DS_SEL), %eax - movw %ax, %ds - movw %ax, %ss - movw %ax, %es + movw $(APM_INIT_DS_SEL), %ax /* data segment */ + mov %ax, %ds /* gas would waste a prefix byte for movw */ + mov %ax, %ss + mov %ax, %es +#ifdef BDE_DEBUGGER /* load idtr so we can debug */ lidt EXT(Idtr_prot) +#endif ret @@ -142,17 +145,17 @@ xprot: ENTRY(prot_to_real) - /* set up a dummy stack frame for the second seg change. */ - movl _ouraddr, %eax - sarl $4, %eax - pushw %ax - movw $xreal, %ax /* gas botches pushw $xreal - extra bytes 0, 0*/ - pushw %ax /* decode to add %al, (%eax) (%al usually 0) */ + /* Prepare %ax while we're still in a mode that gas understands. */ + movw $(APM_INIT_DS16_SEL), %ax /* Change to use16 mode. */ ljmp $(APM_INIT_CS16_SEL), $x16 - x16: + + mov %ax, %ds + mov %ax, %ss + mov %ax, %es + /* clear the PE bit of CR0 */ mov %cr0, %eax data32 @@ -161,25 +164,27 @@ x16: /* * make intersegment jmp to flush the processor pipeline - * using the fake stack frame set up earlier * and reload CS register */ - lret - + data32 + ljmp $(APM_OURADDR>>4), $xreal xreal: + /* * we are in real mode now * set up the real mode segment registers : DS, SS, ES */ - movw %cs, %ax - movw %ax, %ds - movw %ax, %ss - movw %ax, %es + mov %cs, %ax + mov %ax, %ds + mov %ax, %ss + mov %ax, %es +#ifdef BDE_DEBUGGER /* load idtr so we can debug */ addr32 data32 lidt EXT(Idtr_real) +#endif data32 ret diff --git a/sys/i386/apm/apm_setup.s b/sys/i386/apm/apm_setup.s index b3ae77d26a56..e33260f59f1e 100644 --- a/sys/i386/apm/apm_setup.s +++ b/sys/i386/apm/apm_setup.s @@ -12,30 +12,20 @@ * * Sep., 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * - * $Id: apm_setup.s,v 1.4 1994/10/10 01:14:03 phk Exp $ + * $Id: apm_setup.s,v 1.5 1995/02/17 02:22:23 phk Exp $ */ #include "apm.h" #if NAPM > 0 -#ifdef __FreeBSD__ #define ASSEMBLER #include "assym.s" /* system definitions */ #include <machine/asmacros.h> /* miscellaneous asm macros */ #include <machine/apm_bios.h> #include <machine/apm_segments.h> #define PADDR(addr) addr-KERNBASE -#endif /* __FreeBSD__ */ -#ifdef MACH_KERNEL -#define ASSEMBLER -#include "assym.s" -#include "i386at/apm_bios.h" -#include "i386at/apm_segments.h" -#define PADDR(addr) addr-KERNELBASE -#endif /* MACH_KERNEL */ - .file "apm_setup.s" .data @@ -43,12 +33,7 @@ _apm_init_image: .globl _apm_init_image 1: -#ifdef __FreeBSD__ #include "i386/apm/apm_init/apm_init.inc" -#endif /* __FreeBSD__ */ -#ifdef MACH_KERNEL -#include "i386at/apm_init/apm_init.inc" -#endif /* MACH_KERNEL */ 2: _apm_init_image_size: @@ -168,6 +153,7 @@ _apm_setup: APM_SETUP_GDT(APM_INIT_CS_INDEX , CS32_ATTRIB) APM_SETUP_GDT(APM_INIT_DS_INDEX , DS32_ATTRIB) APM_SETUP_GDT(APM_INIT_CS16_INDEX, CS16_ATTRIB) + APM_SETUP_GDT(APM_INIT_DS16_INDEX, DS16_ATTRIB) /* * Call the initializer: diff --git a/sys/i386/bios/apm.c b/sys/i386/bios/apm.c index c0813403ed50..268755916e14 100644 --- a/sys/i386/bios/apm.c +++ b/sys/i386/bios/apm.c @@ -13,19 +13,17 @@ * * Sep, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * - * $Id: apm.c,v 1.22 1995/12/25 07:38:26 bde Exp $ + * $Id: apm.c,v 1.23 1995/12/27 16:16:02 bde Exp $ */ #include "apm.h" #include <sys/param.h> -#include <conf.h> #include <sys/conf.h> #include <sys/kernel.h> #ifdef DEVFS #include <sys/devfsext.h> #endif /*DEVFS*/ -#include <sys/kernel.h> #include <sys/systm.h> #include <sys/malloc.h> #include <sys/ioctl.h> diff --git a/sys/i386/bios/apm_init/apm_init.inc b/sys/i386/bios/apm_init/apm_init.inc index 44fc01e743ee..82f476caacaf 100644 --- a/sys/i386/bios/apm_init/apm_init.inc +++ b/sys/i386/bios/apm_init/apm_init.inc @@ -2,55 +2,51 @@ /* Original file is 'apm_init' */ .byte 0xfa, 0x55, 0x66, 0x8c, 0xd8, 0x66, 0x8e, 0xe0 - .byte 0x66, 0xb8, 0xf0, 0x00, 0x66, 0x8e, 0xd8, 0x66 - .byte 0x8e, 0xc0, 0x66, 0x8e, 0xd0, 0x89, 0x25, 0x94 + .byte 0x66, 0xb8, 0xe8, 0x00, 0x66, 0x8e, 0xd8, 0x66 + .byte 0x8e, 0xc0, 0x66, 0x8e, 0xd0, 0x89, 0x25, 0x74 .byte 0x01, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x01, 0x00 - .byte 0x0f, 0x01, 0x0d, 0xb0, 0x01, 0x00, 0x00, 0xe8 - .byte 0x24, 0x01, 0x00, 0x00, 0xb4, 0x53, 0xb0, 0x00 + .byte 0x0f, 0x01, 0x0d, 0x90, 0x01, 0x00, 0x00, 0xe8 + .byte 0x14, 0x01, 0x00, 0x00, 0xb4, 0x53, 0xb0, 0x00 .byte 0x66, 0xbb, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xcd .byte 0x15, 0xfa, 0x73, 0x15, 0x66, 0xe8, 0xde, 0x00 - .byte 0x00, 0x00, 0xc7, 0x05, 0x98, 0x01, 0x00, 0x00 + .byte 0x00, 0x00, 0xc7, 0x05, 0x78, 0x01, 0x00, 0x00 .byte 0xff, 0xff, 0xff, 0xff, 0xe9, 0x92, 0x00, 0x00 .byte 0x00, 0x89, 0xc2, 0x66, 0xe8, 0xc7, 0x00, 0x00 .byte 0x00, 0x80, 0xff, 0x50, 0x75, 0x05, 0x80, 0xfb - .byte 0x4d, 0x74, 0x0c, 0xc7, 0x05, 0x98, 0x01, 0x00 + .byte 0x4d, 0x74, 0x0c, 0xc7, 0x05, 0x78, 0x01, 0x00 .byte 0x00, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x74, 0xf7 .byte 0xc1, 0x02, 0x00, 0x00, 0x00, 0x75, 0x0c, 0xc7 - .byte 0x05, 0x98, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff + .byte 0x05, 0x78, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff .byte 0xff, 0xeb, 0x60, 0x81, 0xe2, 0xff, 0xff, 0x00 - .byte 0x00, 0x89, 0x15, 0x98, 0x01, 0x00, 0x00, 0x81 - .byte 0xe1, 0xff, 0xff, 0x00, 0x00, 0x89, 0x0d, 0x9c - .byte 0x01, 0x00, 0x00, 0xe8, 0xb0, 0x00, 0x00, 0x00 + .byte 0x00, 0x89, 0x15, 0x78, 0x01, 0x00, 0x00, 0x81 + .byte 0xe1, 0xff, 0xff, 0x00, 0x00, 0x89, 0x0d, 0x7c + .byte 0x01, 0x00, 0x00, 0xe8, 0xa0, 0x00, 0x00, 0x00 .byte 0xb4, 0x53, 0xb0, 0x03, 0x66, 0xbb, 0x00, 0x00 .byte 0x00, 0x00, 0xfb, 0xcd, 0x15, 0xfa, 0x73, 0x12 .byte 0x66, 0xe8, 0x6a, 0x00, 0x00, 0x00, 0xc7, 0x05 - .byte 0x98, 0x01, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff + .byte 0x78, 0x01, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff .byte 0xeb, 0x21, 0x89, 0xc5, 0x66, 0xe8, 0x56, 0x00 .byte 0x00, 0x00, 0xb8, 0xff, 0xff, 0x00, 0x00, 0x21 .byte 0xc5, 0x21, 0xc1, 0x21, 0xc2, 0x21, 0xc6, 0x21 .byte 0xc7, 0xc1, 0xe5, 0x10, 0x09, 0xe9, 0xc1, 0xe7 - .byte 0x10, 0x09, 0xfe, 0xfa, 0x0f, 0x01, 0x1d, 0xb0 - .byte 0x01, 0x00, 0x00, 0x8b, 0x25, 0x94, 0x01, 0x00 - .byte 0x00, 0x8b, 0x2d, 0x98, 0x01, 0x00, 0x00, 0x8b - .byte 0x3d, 0x9c, 0x01, 0x00, 0x00, 0x66, 0x8c, 0xe0 + .byte 0x10, 0x09, 0xfe, 0xfa, 0x0f, 0x01, 0x1d, 0x90 + .byte 0x01, 0x00, 0x00, 0x8b, 0x25, 0x74, 0x01, 0x00 + .byte 0x00, 0x8b, 0x2d, 0x78, 0x01, 0x00, 0x00, 0x8b + .byte 0x3d, 0x7c, 0x01, 0x00, 0x00, 0x66, 0x8c, 0xe0 .byte 0x66, 0x8e, 0xd0, 0x66, 0x8e, 0xc0, 0x66, 0x8e .byte 0xd8, 0x31, 0xc0, 0x66, 0x8e, 0xe0, 0x89, 0xe8 .byte 0x5d, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0xfa, 0x0f, 0x20, 0xc0, 0x66, 0x83, 0xc8, 0x01 .byte 0x0f, 0x22, 0xc0, 0x66, 0xea, 0x33, 0x01, 0x00 - .byte 0x00, 0xe8, 0x00, 0xb8, 0xf0, 0x00, 0x00, 0x00 - .byte 0x66, 0x8e, 0xd8, 0x66, 0x8e, 0xd0, 0x66, 0x8e - .byte 0xc0, 0x0f, 0x01, 0x1d, 0xb0, 0x01, 0x00, 0x00 - .byte 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0xa1, 0x90, 0x01, 0x00, 0x00, 0xc1, 0xf8, 0x04 - .byte 0x66, 0x50, 0x66, 0xb8, 0x72, 0x01, 0x66, 0x50 - .byte 0xea, 0x67, 0x01, 0x00, 0x00, 0xf8, 0x00, 0x0f - .byte 0x20, 0xc0, 0x66, 0x83, 0xe0, 0xfe, 0x0f, 0x22 - .byte 0xc0, 0xcb, 0x66, 0x8c, 0xc8, 0x66, 0x8e, 0xd8 - .byte 0x66, 0x8e, 0xd0, 0x66, 0x8e, 0xc0, 0x67, 0x66 - .byte 0x0f, 0x01, 0x1d, 0xb6, 0x01, 0x00, 0x00, 0x66 - .byte 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0xe0, 0x00, 0x66, 0xb8, 0xe8, 0x00, 0x8e + .byte 0xd8, 0x8e, 0xd0, 0x8e, 0xc0, 0xc3, 0x00, 0x00 + .byte 0x66, 0xb8, 0xf8, 0x00, 0xea, 0x4b, 0x01, 0x00 + .byte 0x00, 0xf0, 0x00, 0x8e, 0xd8, 0x8e, 0xd0, 0x8e + .byte 0xc0, 0x0f, 0x20, 0xc0, 0x66, 0x83, 0xe0, 0xfe + .byte 0x0f, 0x22, 0xc0, 0x66, 0xea, 0x63, 0x01, 0x00 + .byte 0x00, 0x00, 0x80, 0x8c, 0xc8, 0x8e, 0xd8, 0x8e + .byte 0xd0, 0x8e, 0xc0, 0x66, 0xc3, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -58,4 +54,4 @@ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -/* Total size = 0x01c0 */ +/* Total size = 0x01a0 */ diff --git a/sys/i386/bios/apm_init/real_prot.S b/sys/i386/bios/apm_init/real_prot.S index d61a394bb763..cf1514affd1d 100644 --- a/sys/i386/bios/apm_init/real_prot.S +++ b/sys/i386/bios/apm_init/real_prot.S @@ -24,7 +24,7 @@ * the rights to redistribute these changes. * * from: Mach, Revision 2.2 92/04/04 11:34:13 rpd - * $Id: asm.S,v 1.2 1993/10/16 19:11:27 rgrimes Exp $ + * $Id: real_prot.S,v 1.1 1994/10/01 02:55:51 davidg Exp $ */ @@ -69,18 +69,19 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* * Modified for APM BIOS initializer by HOSOKAWA Tatsumi * - * See also locore.s. It supports these functions works correctly. + * See also locore.s. + * (This file is based directly on /sys/i386/boot/biosboot/asm.S) */ .file "real_prot.S" #include "real_prot.h" #include "apm_segments.h" +#include "apm_bios.h" CR0_PE_ON = 0x1 CR0_PE_OFF = 0xfffffffe -.globl _ouraddr .text /* @@ -117,19 +118,21 @@ ENTRY(real_to_prot) */ data32 ljmp $(APM_INIT_CS_SEL), $xprot - xprot: + /* * we are in USE32 mode now * set up the protected mode segment registers : DS, SS, ES */ - mov $(APM_INIT_DS_SEL), %eax - movw %ax, %ds - movw %ax, %ss - movw %ax, %es + movw $(APM_INIT_DS_SEL), %ax /* data segment */ + mov %ax, %ds /* gas would waste a prefix byte for movw */ + mov %ax, %ss + mov %ax, %es +#ifdef BDE_DEBUGGER /* load idtr so we can debug */ lidt EXT(Idtr_prot) +#endif ret @@ -142,17 +145,17 @@ xprot: ENTRY(prot_to_real) - /* set up a dummy stack frame for the second seg change. */ - movl _ouraddr, %eax - sarl $4, %eax - pushw %ax - movw $xreal, %ax /* gas botches pushw $xreal - extra bytes 0, 0*/ - pushw %ax /* decode to add %al, (%eax) (%al usually 0) */ + /* Prepare %ax while we're still in a mode that gas understands. */ + movw $(APM_INIT_DS16_SEL), %ax /* Change to use16 mode. */ ljmp $(APM_INIT_CS16_SEL), $x16 - x16: + + mov %ax, %ds + mov %ax, %ss + mov %ax, %es + /* clear the PE bit of CR0 */ mov %cr0, %eax data32 @@ -161,25 +164,27 @@ x16: /* * make intersegment jmp to flush the processor pipeline - * using the fake stack frame set up earlier * and reload CS register */ - lret - + data32 + ljmp $(APM_OURADDR>>4), $xreal xreal: + /* * we are in real mode now * set up the real mode segment registers : DS, SS, ES */ - movw %cs, %ax - movw %ax, %ds - movw %ax, %ss - movw %ax, %es + mov %cs, %ax + mov %ax, %ds + mov %ax, %ss + mov %ax, %es +#ifdef BDE_DEBUGGER /* load idtr so we can debug */ addr32 data32 lidt EXT(Idtr_real) +#endif data32 ret diff --git a/sys/i386/bios/apm_setup.s b/sys/i386/bios/apm_setup.s index b3ae77d26a56..e33260f59f1e 100644 --- a/sys/i386/bios/apm_setup.s +++ b/sys/i386/bios/apm_setup.s @@ -12,30 +12,20 @@ * * Sep., 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * - * $Id: apm_setup.s,v 1.4 1994/10/10 01:14:03 phk Exp $ + * $Id: apm_setup.s,v 1.5 1995/02/17 02:22:23 phk Exp $ */ #include "apm.h" #if NAPM > 0 -#ifdef __FreeBSD__ #define ASSEMBLER #include "assym.s" /* system definitions */ #include <machine/asmacros.h> /* miscellaneous asm macros */ #include <machine/apm_bios.h> #include <machine/apm_segments.h> #define PADDR(addr) addr-KERNBASE -#endif /* __FreeBSD__ */ -#ifdef MACH_KERNEL -#define ASSEMBLER -#include "assym.s" -#include "i386at/apm_bios.h" -#include "i386at/apm_segments.h" -#define PADDR(addr) addr-KERNELBASE -#endif /* MACH_KERNEL */ - .file "apm_setup.s" .data @@ -43,12 +33,7 @@ _apm_init_image: .globl _apm_init_image 1: -#ifdef __FreeBSD__ #include "i386/apm/apm_init/apm_init.inc" -#endif /* __FreeBSD__ */ -#ifdef MACH_KERNEL -#include "i386at/apm_init/apm_init.inc" -#endif /* MACH_KERNEL */ 2: _apm_init_image_size: @@ -168,6 +153,7 @@ _apm_setup: APM_SETUP_GDT(APM_INIT_CS_INDEX , CS32_ATTRIB) APM_SETUP_GDT(APM_INIT_DS_INDEX , DS32_ATTRIB) APM_SETUP_GDT(APM_INIT_CS16_INDEX, CS16_ATTRIB) + APM_SETUP_GDT(APM_INIT_DS16_INDEX, DS16_ATTRIB) /* * Call the initializer: diff --git a/sys/i386/include/apm_segments.h b/sys/i386/include/apm_segments.h index c76df0787fad..ff966ccc36af 100644 --- a/sys/i386/include/apm_segments.h +++ b/sys/i386/include/apm_segments.h @@ -12,7 +12,7 @@ * * Sep., 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) * - * $Id: apm_segments.h,v 1.3 1995/02/17 02:22:46 phk Exp $ + * $Id: apm_segments.h,v 1.4 1995/05/30 08:00:25 rgrimes Exp $ */ #ifndef _MACHINE_APM_SEGMENTS_H @@ -21,15 +21,18 @@ #define SIZEOF_GDT 8 #define BOOTSTRAP_GDT_NUM 32 -#define APM_INIT_CS_INDEX (BOOTSTRAP_GDT_NUM - 3) -#define APM_INIT_DS_INDEX (BOOTSTRAP_GDT_NUM - 2) -#define APM_INIT_CS16_INDEX (BOOTSTRAP_GDT_NUM - 1) +#define APM_INIT_CS_INDEX (BOOTSTRAP_GDT_NUM - 4) +#define APM_INIT_DS_INDEX (BOOTSTRAP_GDT_NUM - 3) +#define APM_INIT_CS16_INDEX (BOOTSTRAP_GDT_NUM - 2) +#define APM_INIT_DS16_INDEX (BOOTSTRAP_GDT_NUM - 1) #define APM_INIT_CS_SEL (APM_INIT_CS_INDEX << 3) #define APM_INIT_DS_SEL (APM_INIT_DS_INDEX << 3) #define APM_INIT_CS16_SEL (APM_INIT_CS16_INDEX << 3) +#define APM_INIT_DS16_SEL (APM_INIT_DS16_INDEX << 3) #define CS32_ATTRIB 0x409e -#define CS16_ATTRIB 0x009e #define DS32_ATTRIB 0x4092 +#define CS16_ATTRIB 0x009e +#define DS16_ATTRIB 0x0092 #endif |
