]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Coreboot video support.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 27 Jun 2011 06:54:55 +0000 (08:54 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 27 Jun 2011 06:54:55 +0000 (08:54 +0200)
* grub-core/Makefile.core.def (vga): Extend to coreboot and multiboot.
(vbe): Likewise.
* grub-core/kern/i386/coreboot/startup.S: Include int.S.
* grub-core/kern/i386/pc/startup.S (grub_bios_interrupt): Moved from
here ...
* grub-core/kern/i386/int.S: ... here.
* grub-core/video/i386/pc/vbe.c: Updated includes.
* grub-core/video/i386/pc/vga.c: Likewise.
* include/grub/i386/coreboot/memory.h
(GRUB_MEMORY_MACHINE_SCRATCH_ADDR): New definition.
(GRUB_MEMORY_MACHINE_SCRATCH_SEG): Likewise.
(GRUB_MEMORY_MACHINE_SCRATCH_SIZE): Likewise.
* include/grub/i386/pc/int.h (GRUB_CPU_INT_FLAGS_DEFAULT) [!PCBIOS]:
Disable interrupts.
* include/grub/i386/pc/vga.h: Removed. All users updated.

ChangeLog
grub-core/Makefile.am
grub-core/Makefile.core.def
grub-core/kern/i386/coreboot/startup.S
grub-core/kern/i386/int.S [new file with mode: 0644]
grub-core/kern/i386/pc/startup.S
grub-core/video/i386/pc/vbe.c
grub-core/video/i386/pc/vga.c
include/grub/i386/coreboot/memory.h
include/grub/i386/pc/int.h
include/grub/i386/pc/vga.h [deleted file]

index df640a0ef8f8679a1ce11edf764339a42775c3e7..311e65b050ddce9113db15c58e097f3b1e526b4a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2011-06-27  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Coreboot video support.
+
+       * grub-core/Makefile.core.def (vga): Extend to coreboot and multiboot.
+       (vbe): Likewise.
+       * grub-core/kern/i386/coreboot/startup.S: Include int.S.
+       * grub-core/kern/i386/pc/startup.S (grub_bios_interrupt): Moved from
+       here ...
+       * grub-core/kern/i386/int.S: ... here.
+       * grub-core/video/i386/pc/vbe.c: Updated includes.
+       * grub-core/video/i386/pc/vga.c: Likewise.
+       * include/grub/i386/coreboot/memory.h
+       (GRUB_MEMORY_MACHINE_SCRATCH_ADDR): New definition.
+       (GRUB_MEMORY_MACHINE_SCRATCH_SEG): Likewise.
+       (GRUB_MEMORY_MACHINE_SCRATCH_SIZE): Likewise.
+       * include/grub/i386/pc/int.h (GRUB_CPU_INT_FLAGS_DEFAULT) [!PCBIOS]:
+       Disable interrupts.
+       * include/grub/i386/pc/vga.h: Removed. All users updated.
+
 2011-06-27  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/disk/ahci.c (grub_ahci_readwrite_real): Use proper
index a8862b30987f88b0f57c8a84ac53b83dd24ca6d4..c3ecba9cf90eeb34c6ffef370449dcdd0e25da0c 100644 (file)
@@ -100,10 +100,12 @@ endif
 
 if COND_i386_coreboot
 KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/i386/pc/int.h
 endif
 
 if COND_i386_multiboot
 KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/i386/pc/int.h
 endif
 
 if COND_i386_qemu
index 927718359f53ea63f83eee0a2b0f9e03ce10d6ee..7a0536b978fbcad6a93f17b53e69fda5ff74412c 100644 (file)
@@ -1454,8 +1454,10 @@ module = {
 
 module = {
   name = vga;
-  i386_pc = video/i386/pc/vga.c;
+  common = video/i386/pc/vga.c;
   enable = i386_pc;
+  enable = i386_coreboot;
+  enable = i386_multiboot;
 };
 
 module = {
@@ -1533,8 +1535,10 @@ module = {
 
 module = {
   name = vbe;
-  i386_pc = video/i386/pc/vbe.c;
+  common = video/i386/pc/vbe.c;
   enable = i386_pc;
+  enable = i386_coreboot;
+  enable = i386_multiboot;
 };
 
 module = {
index cac023ddffa32b6dd30e387c438aa8e389108a7d..07c5437c07efd5cffc0231d561675f1bc6bc9991 100644 (file)
@@ -87,3 +87,4 @@ codestart:
  */
 #include "../realmode.S"
 
+#include "../int.S"
diff --git a/grub-core/kern/i386/int.S b/grub-core/kern/i386/int.S
new file mode 100644 (file)
index 0000000..58ccfda
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2010,2011 Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+FUNCTION(grub_bios_interrupt)
+       pushf
+       cli
+#ifndef GRUB_MACHINE_PCBIOS
+       sidt protidt
+#endif
+       popf
+       pushl    %ebp
+       pushl    %ecx
+       pushl    %eax
+       pushl    %ebx
+       pushl    %esi
+       pushl    %edi   
+       pushl    %edx
+       
+       movb     %al, intno
+       movl     (%edx), %eax
+       movl     %eax, LOCAL(bios_register_eax)
+       movw     4(%edx), %ax
+       movw     %ax, LOCAL(bios_register_es)
+       movw     6(%edx), %ax
+       movw     %ax, LOCAL(bios_register_ds)
+       movw     8(%edx), %ax
+       movw     %ax, LOCAL(bios_register_flags)
+
+       movl    12(%edx), %ebx
+       movl    16(%edx), %ecx
+       movl    20(%edx), %edi
+       movl    24(%edx), %esi
+       movl    28(%edx), %edx
+
+       call    prot_to_real
+       .code16
+       pushf
+       cli
+#ifndef GRUB_MACHINE_PCBIOS
+       lidt realidt
+#endif
+       
+       mov     %ds, %ax
+       push    %ax
+
+       /* movw imm16, %ax*/
+       .byte   0xb8
+LOCAL(bios_register_es):
+       .short  0
+       movw    %ax, %es
+       /* movw imm16, %ax*/
+       .byte   0xb8
+LOCAL(bios_register_ds):
+       .short  0
+       movw    %ax, %ds
+
+       /* movw imm16, %ax*/
+       .byte   0xb8
+LOCAL(bios_register_flags):
+       .short  0
+       push    %ax
+       popf
+
+       /* movl imm32, %eax*/
+       .byte   0x66, 0xb8
+LOCAL(bios_register_eax):
+       .long   0
+       
+       /* int imm8.  */
+       .byte   0xcd
+intno: 
+       .byte   0
+
+       movl    %eax, %cs:LOCAL(bios_register_eax)
+       movw    %ds, %ax
+       movw    %ax, %cs:LOCAL(bios_register_ds)
+       pop     %ax
+       mov     %ax, %ds
+       pushf
+       pop     %ax
+       movw    %ax, LOCAL(bios_register_flags)
+       mov     %es, %ax
+       movw    %ax, LOCAL(bios_register_es)
+
+       popf
+       DATA32  call    real_to_prot
+       .code32
+
+       popl    %eax
+
+       movl    %ebx, 12(%eax)
+       movl    %ecx, 16(%eax)
+       movl    %edi, 20(%eax)
+       movl    %esi, 24(%eax)
+       movl    %edx, 28(%eax)
+
+       movl     %eax, %edx
+
+       movl     LOCAL(bios_register_eax), %eax
+       movl     %eax, (%edx)
+       movw     LOCAL(bios_register_es), %ax
+       movw     %ax, 4(%edx)
+       movw     LOCAL(bios_register_ds), %ax
+       movw     %ax, 6(%edx)
+       movw     LOCAL(bios_register_flags), %ax
+       movw     %ax, 8(%edx)
+
+       popl    %edi
+       popl    %esi
+       popl    %ebx
+       popl    %eax
+       popl    %ecx
+       popl    %ebp
+#ifndef GRUB_MACHINE_PCBIOS
+       lidt protidt
+#endif
+       ret
+#ifndef GRUB_MACHINE_PCBIOS
+realidt:
+       .word 0x100
+       .long 0
+protidt:
+       .word 0
+       .long 0
+#endif
index e78a0aa9aacb5a7cb429c66ce2e7b4811275b480..0fe114add47aaa724c722a9eda577604954b10b6 100644 (file)
@@ -910,102 +910,4 @@ FUNCTION(grub_pxe_call)
        popl    %ebp
        ret
 
-FUNCTION(grub_bios_interrupt)
-       pushl    %ebp
-       pushl    %ecx
-       pushl    %eax
-       pushl    %ebx
-       pushl    %esi
-       pushl    %edi   
-       pushl    %edx
-       
-       movb     %al, intno
-       movl     (%edx), %eax
-       movl     %eax, LOCAL(bios_register_eax)
-       movw     4(%edx), %ax
-       movw     %ax, LOCAL(bios_register_es)
-       movw     6(%edx), %ax
-       movw     %ax, LOCAL(bios_register_ds)
-       movw     8(%edx), %ax
-       movw     %ax, LOCAL(bios_register_flags)
-
-       movl    12(%edx), %ebx
-       movl    16(%edx), %ecx
-       movl    20(%edx), %edi
-       movl    24(%edx), %esi
-       movl    28(%edx), %edx
-
-       call    prot_to_real
-       .code16
-
-       mov     %ds, %ax
-       push    %ax
-
-       /* movw imm16, %ax*/
-       .byte   0xb8
-LOCAL(bios_register_es):
-       .short  0
-       movw    %ax, %es
-       /* movw imm16, %ax*/
-       .byte   0xb8
-LOCAL(bios_register_ds):
-       .short  0
-       movw    %ax, %ds
-
-       /* movw imm16, %ax*/
-       .byte   0xb8
-LOCAL(bios_register_flags):
-       .short  0
-       push    %ax
-       popf
-
-       /* movl imm32, %eax*/
-       .byte   0x66, 0xb8
-LOCAL(bios_register_eax):
-       .long   0
-       
-       /* int imm8.  */
-       .byte   0xcd
-intno: 
-       .byte   0
-
-       movl    %eax, %cs:LOCAL(bios_register_eax)
-       movw    %ds, %ax
-       movw    %ax, %cs:LOCAL(bios_register_ds)
-       pop     %ax
-       mov     %ax, %ds
-       pushf
-       pop     %ax
-       movw    %ax, LOCAL(bios_register_flags)
-       mov     %es, %ax
-       movw    %ax, LOCAL(bios_register_es)
-
-       DATA32  call    real_to_prot
-       .code32
-
-       popl    %eax
-
-       movl    %ebx, 12(%eax)
-       movl    %ecx, 16(%eax)
-       movl    %edi, 20(%eax)
-       movl    %esi, 24(%eax)
-       movl    %edx, 28(%eax)
-
-       movl     %eax, %edx
-
-       movl     LOCAL(bios_register_eax), %eax
-       movl     %eax, (%edx)
-       movw     LOCAL(bios_register_es), %ax
-       movw     %ax, 4(%edx)
-       movw     LOCAL(bios_register_ds), %ax
-       movw     %ax, 6(%edx)
-       movw     LOCAL(bios_register_flags), %ax
-       movw     %ax, 8(%edx)
-
-       popl    %edi
-       popl    %esi
-       popl    %ebx
-       popl    %eax
-       popl    %ecx
-       popl    %ebp
-       ret
+#include "../int.S"
index a109bcf432361de29d0e7908dbff3a65f6303389..c11b9a627aaf9ba21122948a5c002921c118a24c 100644 (file)
 
 #include <grub/err.h>
 #include <grub/machine/memory.h>
-#include <grub/machine/vga.h>
-#include <grub/machine/vbe.h>
+#include <grub/i386/pc/vbe.h>
 #include <grub/video_fb.h>
 #include <grub/types.h>
 #include <grub/dl.h>
 #include <grub/misc.h>
 #include <grub/mm.h>
 #include <grub/video.h>
-#include <grub/machine/int.h>
+#include <grub/i386/pc/int.h>
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
@@ -377,7 +376,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode,
   if (vbe_mode < 0x100)
     {
       /* If this is not a VESA mode, guess address.  */
-      framebuffer.ptr = (grub_uint8_t *) GRUB_MEMORY_MACHINE_VGA_ADDR;
+      framebuffer.ptr = (grub_uint8_t *) 0xa0000;
     }
   else
     {
index fe387a26b9957dd5b64a87357dab222b2ae9ead6..08c9ca37df70383d6164b49e7995787a3e97eac2 100644 (file)
@@ -18,8 +18,7 @@
 
 #define grub_video_render_target grub_video_fbrender_target
 
-#include <grub/machine/vga.h>
-#include <grub/machine/int.h>
+#include <grub/i386/pc/int.h>
 #include <grub/machine/console.h>
 #include <grub/cpu/io.h>
 #include <grub/mm.h>
@@ -34,7 +33,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
 
 #define VGA_WIDTH      640
 #define VGA_HEIGHT     350
-#define VGA_MEM                ((grub_uint8_t *) GRUB_MEMORY_MACHINE_VGA_ADDR)
+#define VGA_MEM                ((grub_uint8_t *) 0xa0000)
 #define PAGE_OFFSET(x) ((x) * (VGA_WIDTH * VGA_HEIGHT / 8))
 
 static unsigned char text_mode;
index 0642280b9a828b34e1bbe84e40a7ea96137b45f9..2859b1d7c7fcd044430709d6ffa0a8fc2b1c28b9 100644 (file)
 #include <grub/memory.h>
 #endif
 
+#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR       0x68000
+#define GRUB_MEMORY_MACHINE_SCRATCH_SEG        (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4)
+#define GRUB_MEMORY_MACHINE_SCRATCH_SIZE       0x10000
+
 #define GRUB_MEMORY_MACHINE_LOWER_USABLE               0x9fc00         /* 640 kiB - 1 kiB */
 
 #define GRUB_MEMORY_MACHINE_UPPER_START                        0x100000        /* 1 MiB */
index de23775d08206d660345450c71dcf1ef1ed1389d..3377525874d2d8bdce641a17a71049a55a59b507 100644 (file)
@@ -45,7 +45,12 @@ struct grub_bios_int_registers
 #define  GRUB_CPU_INT_FLAGS_INTERRUPT 0x200
 #define  GRUB_CPU_INT_FLAGS_DIRECTION 0x400
 #define  GRUB_CPU_INT_FLAGS_OVERFLOW  0x800
+#ifdef GRUB_MACHINE_PCBIOS
 #define  GRUB_CPU_INT_FLAGS_DEFAULT   GRUB_CPU_INT_FLAGS_INTERRUPT
+#else
+#define  GRUB_CPU_INT_FLAGS_DEFAULT   0
+#endif
+
 
 void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
                                        struct grub_bios_int_registers *regs);
diff --git a/include/grub/i386/pc/vga.h b/include/grub/i386/pc/vga.h
deleted file mode 100644 (file)
index ecc1690..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2003,2007,2008  Free Software Foundation, Inc.
- *
- *  GRUB is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  GRUB is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef GRUB_VGA_MACHINE_HEADER
-#define GRUB_VGA_MACHINE_HEADER        1
-
-#include <grub/symbol.h>
-#include <grub/machine/memory.h>
-
-/* The VGA (at the beginning of upper memory).  */
-#define GRUB_MEMORY_MACHINE_VGA_ADDR           GRUB_MEMORY_MACHINE_UPPER
-
-#endif /* ! GRUB_VGA_MACHINE_HEADER */