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.
This commit is contained in:
parent
41bec7fec9
commit
9fc9ce3795
11 changed files with 184 additions and 136 deletions
20
ChangeLog
20
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>
|
2011-06-27 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/disk/ahci.c (grub_ahci_readwrite_real): Use proper
|
* grub-core/disk/ahci.c (grub_ahci_readwrite_real): Use proper
|
||||||
|
|
|
@ -100,10 +100,12 @@ endif
|
||||||
|
|
||||||
if COND_i386_coreboot
|
if COND_i386_coreboot
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/i386/pc/int.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_i386_multiboot
|
if COND_i386_multiboot
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pit.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/i386/pc/int.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_i386_qemu
|
if COND_i386_qemu
|
||||||
|
|
|
@ -1454,8 +1454,10 @@ module = {
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = vga;
|
name = vga;
|
||||||
i386_pc = video/i386/pc/vga.c;
|
common = video/i386/pc/vga.c;
|
||||||
enable = i386_pc;
|
enable = i386_pc;
|
||||||
|
enable = i386_coreboot;
|
||||||
|
enable = i386_multiboot;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -1533,8 +1535,10 @@ module = {
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = vbe;
|
name = vbe;
|
||||||
i386_pc = video/i386/pc/vbe.c;
|
common = video/i386/pc/vbe.c;
|
||||||
enable = i386_pc;
|
enable = i386_pc;
|
||||||
|
enable = i386_coreboot;
|
||||||
|
enable = i386_multiboot;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
|
|
@ -87,3 +87,4 @@ codestart:
|
||||||
*/
|
*/
|
||||||
#include "../realmode.S"
|
#include "../realmode.S"
|
||||||
|
|
||||||
|
#include "../int.S"
|
||||||
|
|
140
grub-core/kern/i386/int.S
Normal file
140
grub-core/kern/i386/int.S
Normal file
|
@ -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
|
|
@ -910,102 +910,4 @@ FUNCTION(grub_pxe_call)
|
||||||
popl %ebp
|
popl %ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
FUNCTION(grub_bios_interrupt)
|
#include "../int.S"
|
||||||
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
|
|
||||||
|
|
|
@ -20,15 +20,14 @@
|
||||||
|
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
#include <grub/machine/memory.h>
|
#include <grub/machine/memory.h>
|
||||||
#include <grub/machine/vga.h>
|
#include <grub/i386/pc/vbe.h>
|
||||||
#include <grub/machine/vbe.h>
|
|
||||||
#include <grub/video_fb.h>
|
#include <grub/video_fb.h>
|
||||||
#include <grub/types.h>
|
#include <grub/types.h>
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
#include <grub/video.h>
|
#include <grub/video.h>
|
||||||
#include <grub/machine/int.h>
|
#include <grub/i386/pc/int.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
@ -377,7 +376,7 @@ grub_vbe_set_video_mode (grub_uint32_t vbe_mode,
|
||||||
if (vbe_mode < 0x100)
|
if (vbe_mode < 0x100)
|
||||||
{
|
{
|
||||||
/* If this is not a VESA mode, guess address. */
|
/* 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
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,8 +18,7 @@
|
||||||
|
|
||||||
#define grub_video_render_target grub_video_fbrender_target
|
#define grub_video_render_target grub_video_fbrender_target
|
||||||
|
|
||||||
#include <grub/machine/vga.h>
|
#include <grub/i386/pc/int.h>
|
||||||
#include <grub/machine/int.h>
|
|
||||||
#include <grub/machine/console.h>
|
#include <grub/machine/console.h>
|
||||||
#include <grub/cpu/io.h>
|
#include <grub/cpu/io.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
|
@ -34,7 +33,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
#define VGA_WIDTH 640
|
#define VGA_WIDTH 640
|
||||||
#define VGA_HEIGHT 350
|
#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))
|
#define PAGE_OFFSET(x) ((x) * (VGA_WIDTH * VGA_HEIGHT / 8))
|
||||||
|
|
||||||
static unsigned char text_mode;
|
static unsigned char text_mode;
|
||||||
|
|
|
@ -28,6 +28,10 @@
|
||||||
#include <grub/memory.h>
|
#include <grub/memory.h>
|
||||||
#endif
|
#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_LOWER_USABLE 0x9fc00 /* 640 kiB - 1 kiB */
|
||||||
|
|
||||||
#define GRUB_MEMORY_MACHINE_UPPER_START 0x100000 /* 1 MiB */
|
#define GRUB_MEMORY_MACHINE_UPPER_START 0x100000 /* 1 MiB */
|
||||||
|
|
|
@ -45,7 +45,12 @@ struct grub_bios_int_registers
|
||||||
#define GRUB_CPU_INT_FLAGS_INTERRUPT 0x200
|
#define GRUB_CPU_INT_FLAGS_INTERRUPT 0x200
|
||||||
#define GRUB_CPU_INT_FLAGS_DIRECTION 0x400
|
#define GRUB_CPU_INT_FLAGS_DIRECTION 0x400
|
||||||
#define GRUB_CPU_INT_FLAGS_OVERFLOW 0x800
|
#define GRUB_CPU_INT_FLAGS_OVERFLOW 0x800
|
||||||
|
#ifdef GRUB_MACHINE_PCBIOS
|
||||||
#define GRUB_CPU_INT_FLAGS_DEFAULT GRUB_CPU_INT_FLAGS_INTERRUPT
|
#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,
|
void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
|
||||||
struct grub_bios_int_registers *regs);
|
struct grub_bios_int_registers *regs);
|
||||||
|
|
|
@ -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 */
|
|
Loading…
Reference in a new issue