2005-07-17 Yoshinori Okuji <okuji@enbug.org>

* 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.
This commit is contained in:
okuji 2005-07-16 22:06:33 +00:00
parent 654fc59fe4
commit ebedfd0003
5 changed files with 44 additions and 35 deletions

View file

@ -1,3 +1,15 @@
2005-07-17 Yoshinori Okuji <okuji@enbug.org>
* 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 <okuji@enbug.org> 2005-07-16 Yoshinori K. Okuji <okuji@enbug.org>
* kern/i386/pc/startup.S (grub_gate_a20): Rewritten for * kern/i386/pc/startup.S (grub_gate_a20): Rewritten for

View file

@ -1,7 +1,6 @@
/* -*-Asm-*- */
/* /*
* GRUB -- GRand Unified Bootloader * 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 * 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 * it under the terms of the GNU General Public License as published by
@ -16,28 +15,22 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <grub/boot.h>
#include <grub/machine/boot.h>
/*
* defines for the code go here
*/ */
.file "pxeboot.S" .file "pxeboot.S"
.text .text
/* Tell GAS to generate 16-bit instructions so that this code works /* Start with the prehistoric environment... */
in real mode. */
.code16 .code16
/* Let's go */
.globl _start; _start: .globl _start; _start:
/*
* _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00 /* Jump to the real world */
*/
ljmp $0, $0x8200 ljmp $0, $0x8200
. = 0x8000 - 0x7C00 -1 /* 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 .byte 0

View file

@ -48,7 +48,7 @@ pxeboot_img-boot_i386_pc_pxeboot.d: boot/i386/pc/pxeboot.S
-include pxeboot_img-boot_i386_pc_pxeboot.d -include pxeboot_img-boot_i386_pc_pxeboot.d
pxeboot_img_ASFLAGS = $(COMMON_ASFLAGS) pxeboot_img_ASFLAGS = $(COMMON_ASFLAGS)
pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8000 pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
# For diskboot.img. # For diskboot.img.
diskboot_img_SOURCES = boot/i386/pc/diskboot.S diskboot_img_SOURCES = boot/i386/pc/diskboot.S

View file

@ -14,7 +14,7 @@ boot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
# For pxeboot.img # For pxeboot.img
pxeboot_img_SOURCES = boot/i386/pc/pxeboot.S pxeboot_img_SOURCES = boot/i386/pc/pxeboot.S
pxeboot_img_ASFLAGS = $(COMMON_ASFLAGS) pxeboot_img_ASFLAGS = $(COMMON_ASFLAGS)
pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,8000 pxeboot_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
# For diskboot.img. # For diskboot.img.
diskboot_img_SOURCES = boot/i386/pc/diskboot.S diskboot_img_SOURCES = boot/i386/pc/diskboot.S

View file

@ -396,7 +396,7 @@ gate_a20_test_current_state:
gate_a20_try_bios: gate_a20_try_bios:
/* second, try a BIOS call */ /* second, try a BIOS call */
pushl %ebp pushl %ebp
call EXT_C(prot_to_real) call prot_to_real
.code16 .code16
movw $0x2400, %ax movw $0x2400, %ax
@ -405,7 +405,7 @@ gate_a20_try_bios:
incw %ax incw %ax
1: int $0x15 1: int $0x15
DATA32 call EXT_C(real_to_prot) DATA32 call real_to_prot
.code32 .code32
popl %ebp popl %ebp
@ -484,27 +484,31 @@ gate_a20_check_state:
pushl %ebx pushl %ebx
pushl %ecx pushl %ecx
xorl %eax, %eax 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 movl $GRUB_BOOT_MACHINE_KERNEL_ADDR, %ebx
pushl %ebx pushl %ebx
/* save the original byte in CL */ /* save the original byte in CL */
movb (%ebx), %cl movb (%ebx), %cl
/* store the value at 0x102000 in AL */ /* store the value at 0x108000 in AL */
addl $0x100000, %ebx addl $0x100000, %ebx
movb (%ebx), %al movb (%ebx), %al
/* try to set one less value at 0x2000 */ /* try to set one less value at 0x8000 */
popl %ebx popl %ebx
movb %al, %ch movb %al, %ch
decb %ch decb %ch
movb %ch, (%ebx) movb %ch, (%ebx)
/* serialize */ /* serialize */
outb $0x80 outb %al, $0x80
outb $0x80 outb %al, $0x80
/* store the value at 0x2000 in CH */ /* obtain the value at 0x108000 in CH */
pushl %ebx
addl $0x100000, %ebx
movb (%ebx), %ch movb (%ebx), %ch
/* this result is 1 if A20 is on or 0 if it is off */ /* this result is 1 if A20 is on or 0 if it is off */
subb %ch, %al subb %ch, %al
xorb $1, %al
/* restore the original */ /* restore the original */
popl %ebx
movb %cl, (%ebx) movb %cl, (%ebx)
popl %ecx popl %ecx
popl %ebx popl %ebx