+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>
* kern/i386/pc/startup.S (grub_gate_a20): Rewritten for
-/* -*-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
* 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"
-
- .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
-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
# 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
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
incw %ax
1: int $0x15
- DATA32 call EXT_C(real_to_prot)
+ DATA32 call real_to_prot
.code32
popl %ebp
cmpb %al, %dl
jnz gate_a20_try_keyboard_controller
ret
-
+
gate_a20_flush_keyboard_buffer:
inb $0x64
andb $0x02, %al
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
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"