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:
parent
654fc59fe4
commit
ebedfd0003
5 changed files with 44 additions and 35 deletions
12
ChangeLog
12
ChangeLog
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue