]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2005-07-17 Yoshinori Okuji <okuji@enbug.org>
authorokuji <okuji@localhost>
Sat, 16 Jul 2005 22:06:33 +0000 (22:06 +0000)
committerokuji <okuji@localhost>
Sat, 16 Jul 2005 22:06:33 +0000 (22:06 +0000)
* 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
boot/i386/pc/pxeboot.S
conf/i386-pc.mk
conf/i386-pc.rmk
kern/i386/pc/startup.S

index 2ba78b61d7fbea88dba5bdffd524b10f4d37ece8..70771a39715bd103429117a7861b61e7ade02d26 100644 (file)
--- a/ChangeLog
+++ b/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>
 
        * kern/i386/pc/startup.S (grub_gate_a20): Rewritten for
index 2a255fbd1020e13da12277cf8e42d40da6a96bae..79bde4528916b8a0d42e04b22f73e444d039be89 100644 (file)
@@ -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
  *  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
index d5d545b56668fb135bb5cbdbce0734cae31c5491..13f572f32e8c23c790f20b23948a11f97a087d94 100644 (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
 
 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
index 93e558b3bec3c51b62315e384d2ec5b49be3abfc..cbe77d803c012878c8148b44d3f67109c93f9820 100644 (file)
@@ -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
index 3385e2ca254e4e82168c53702b84c5e079c22938..177c86501d6102f20cadaec33ce60abc5266e35f 100644 (file)
@@ -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"