From ebedfd00031a8ecf9e294e15b70094a59f6238f0 Mon Sep 17 00:00:00 2001 From: okuji Date: Sat, 16 Jul 2005 22:06:33 +0000 Subject: [PATCH] 2005-07-17 Yoshinori Okuji * conf/i386-pc.rmk (pxeboot_img_LDFLAGS): The text address should be 0x7C00 instead of 0x8000. * boot/i386/pc/pxeboot.S: Rewritten. * kern/i386/pc/startup.S (gate_a20_try_bios): No need to specify EXT_C. (gate_a20_check_state): Read a byte from 0x108000. Invert the result. --- ChangeLog | 12 ++++++++++++ boot/i386/pc/pxeboot.S | 37 +++++++++++++++---------------------- conf/i386-pc.mk | 2 +- conf/i386-pc.rmk | 2 +- kern/i386/pc/startup.S | 26 +++++++++++++++----------- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2ba78b61d..70771a397 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-07-17 Yoshinori Okuji + + * conf/i386-pc.rmk (pxeboot_img_LDFLAGS): The text address should + be 0x7C00 instead of 0x8000. + + * boot/i386/pc/pxeboot.S: Rewritten. + + * kern/i386/pc/startup.S (gate_a20_try_bios): No need to specify + EXT_C. + (gate_a20_check_state): Read a byte from 0x108000. Invert the + result. + 2005-07-16 Yoshinori K. Okuji * kern/i386/pc/startup.S (grub_gate_a20): Rewritten for diff --git a/boot/i386/pc/pxeboot.S b/boot/i386/pc/pxeboot.S index 2a255fbd1..79bde4528 100644 --- a/boot/i386/pc/pxeboot.S +++ b/boot/i386/pc/pxeboot.S @@ -1,7 +1,6 @@ -/* -*-Asm-*- */ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 1999,2000,2001,2002,2004 Free Software Foundation, Inc. + * Copyright (C) 2000,2005 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,26 +17,20 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include -#include - -/* -* defines for the code go here -*/ - - .file "pxeboot.S" - - .text - - /* Tell GAS to generate 16-bit instructions so that this code works - in real mode. */ - .code16 + .file "pxeboot.S" + .text + /* Start with the prehistoric environment... */ + .code16 + + /* Let's go */ .globl _start; _start: - /* - * _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00 - */ - ljmp $0, $0x8200 - . = 0x8000 - 0x7C00 -1 - .byte 0 + /* Jump to the real world */ + ljmp $0, $0x8200 + + /* This region is a junk. Do you say that this is wasteful? + But I like that the memory layout of the body is consistent + among different kernels rather than scamping just for 1.5KB. */ + . = _start + 0x8200 - 0x7C00 - 0x200 - 1 + .byte 0 diff --git a/conf/i386-pc.mk b/conf/i386-pc.mk index d5d545b56..13f572f32 100644 --- a/conf/i386-pc.mk +++ b/conf/i386-pc.mk @@ -48,7 +48,7 @@ pxeboot_img-boot_i386_pc_pxeboot.d: boot/i386/pc/pxeboot.S -include pxeboot_img-boot_i386_pc_pxeboot.d pxeboot_img_ASFLAGS = $(COMMON_ASFLAGS) -pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8000 +pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 # For diskboot.img. diskboot_img_SOURCES = boot/i386/pc/diskboot.S diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 93e558b3b..cbe77d803 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -14,7 +14,7 @@ boot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 # For pxeboot.img pxeboot_img_SOURCES = boot/i386/pc/pxeboot.S pxeboot_img_ASFLAGS = $(COMMON_ASFLAGS) -pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8000 +pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00 # For diskboot.img. diskboot_img_SOURCES = boot/i386/pc/diskboot.S diff --git a/kern/i386/pc/startup.S b/kern/i386/pc/startup.S index 3385e2ca2..177c86501 100644 --- a/kern/i386/pc/startup.S +++ b/kern/i386/pc/startup.S @@ -396,7 +396,7 @@ gate_a20_test_current_state: gate_a20_try_bios: /* second, try a BIOS call */ pushl %ebp - call EXT_C(prot_to_real) + call prot_to_real .code16 movw $0x2400, %ax @@ -405,7 +405,7 @@ gate_a20_try_bios: incw %ax 1: int $0x15 - DATA32 call EXT_C(real_to_prot) + DATA32 call real_to_prot .code32 popl %ebp @@ -413,7 +413,7 @@ gate_a20_try_bios: cmpb %al, %dl jnz gate_a20_try_keyboard_controller ret - + gate_a20_flush_keyboard_buffer: inb $0x64 andb $0x02, %al @@ -449,7 +449,7 @@ gate_a20_try_keyboard_controller: movb $0xff, %al outb $0x64 call gate_a20_flush_keyboard_buffer - + call gate_a20_check_state cmpb %al, %dl jnz gate_a20_try_system_control_port_a @@ -484,32 +484,36 @@ gate_a20_check_state: pushl %ebx pushl %ecx xorl %eax, %eax - /* compare the byte at 0x2000 with that at 0x102000 */ + /* compare the byte at 0x8000 with that at 0x108000 */ movl $GRUB_BOOT_MACHINE_KERNEL_ADDR, %ebx pushl %ebx /* save the original byte in CL */ movb (%ebx), %cl - /* store the value at 0x102000 in AL */ + /* store the value at 0x108000 in AL */ addl $0x100000, %ebx movb (%ebx), %al - /* try to set one less value at 0x2000 */ + /* try to set one less value at 0x8000 */ popl %ebx movb %al, %ch decb %ch movb %ch, (%ebx) /* serialize */ - outb $0x80 - outb $0x80 - /* store the value at 0x2000 in CH */ + outb %al, $0x80 + outb %al, $0x80 + /* obtain the value at 0x108000 in CH */ + pushl %ebx + addl $0x100000, %ebx movb (%ebx), %ch /* this result is 1 if A20 is on or 0 if it is off */ subb %ch, %al + xorb $1, %al /* restore the original */ + popl %ebx movb %cl, (%ebx) popl %ecx popl %ebx ret - + #include "lzo1x.S"