* 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>
+
+ 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
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
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 = {
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 = {
*/
#include "../realmode.S"
+#include "../int.S"
--- /dev/null
+/*
+ * 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
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"
#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+");
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
{
#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>
#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;
#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 */
#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);
+++ /dev/null
-/*
- * 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 */