merge mainline into net

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2011-07-06 01:35:41 +02:00
commit d53bf34924
14 changed files with 264 additions and 11 deletions

View file

@ -1,3 +1,45 @@
2011-07-05 Vladimir Serbinenko <phcoder@gmail.com>
VGA text support in qemu-mips
* grub-core/Makefile.core.def (kernel): Add term/i386/pc/vga_text.c,
term/i386/vga_common.c and kern/vga_init.c on qemu-mips.
* grub-core/kern/mips/qemu_mips/init.c (grub_machine_init): Init vga
text.
* grub-core/kern/i386/qemu/init.c: Renamed to ...
* grub-core/kern/vga_init.c: ... this.
* grub-core/kern/vga_init.c (VGA_ADDR) [__mips__]: Adjust.
(grub_qemu_init_cirrus) [__mips__]: Skip PCI and adjust the I/O base.
* grub-core/term/i386/pc/vga_text.c (VGA_TEXT_SCREEN) [__mips__]:
Adjust.
* include/grub/vga.h [GRUB_MACHINE_MIPS_QEMU_MIPS]: Declare
GRUB_MACHINE_PCI_IO_BASE.
2011-07-05 Vladimir Serbinenko <phcoder@gmail.com>
MIPS qemu flash support.
* grub-core/boot/mips/startup_raw.S [GRUB_MACHINE_MIPS_QEMU_MIPS]: Check
magic.
* grub-core/kern/mips/qemu_mips/init.c (probe_mem): New function.
(grub_machine_init): Probe memory if its size isn't known.
* util/grub-mkimage.c (image_targets): Add flash targets.
(generate_image): Handle flash targets.
2011-07-05 Vladimir Serbinenko <phcoder@gmail.com>
MIPS qemu at_keyboard support.
* gentpl.py (videoinkernel): Add qemu-mips.
* grub-core/Makefile.am (KERNEL_HEADER_FILES): Add necessary headers.
* grub-core/Makefile.core.def (kernel): Add at_keyboard and layout.
* grub-core/kern/mips/qemu_mips/init.c (grub_machine_init): Init new
modules.
* grub-core/term/at_keyboard.c (grub_keyboard_controller_init)
[GRUB_MACHINE_MIPS_QEMU_MIPS]: Don't consider original set.
* grub-core/term/serial.c (grub_serial_register)
[GRUB_MACHINE_MIPS_QEMU_MIPS]: Make com0 explicitly active.
2011-07-05 Vladimir Serbinenko <phcoder@gmail.com> 2011-07-05 Vladimir Serbinenko <phcoder@gmail.com>
CMOS support on sparc. CMOS support on sparc.

View file

@ -37,7 +37,7 @@ GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"]
GROUPS["usb"] = GROUPS["pci"] GROUPS["usb"] = GROUPS["pci"]
# If gfxterm is main output console integrate it into kernel # If gfxterm is main output console integrate it into kernel
GROUPS["videoinkernel"] = ["mips_loongson"] GROUPS["videoinkernel"] = ["mips_loongson", "mips_qemu_mips"]
GROUPS["videomodules"] = GRUB_PLATFORMS[:]; GROUPS["videomodules"] = GRUB_PLATFORMS[:];
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i) for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)

View file

@ -144,7 +144,20 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arc/arc.h
endif endif
if COND_mips_qemu_mips if COND_mips_qemu_mips
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/cache.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bitmap.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bitmap_scale.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/serial.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
endif endif
if COND_mips_loongson if COND_mips_loongson

View file

@ -144,7 +144,7 @@ kernel = {
i386_pc = term/i386/pc/console.c; i386_pc = term/i386/pc/console.c;
i386_qemu = bus/pci.c; i386_qemu = bus/pci.c;
i386_qemu = kern/i386/qemu/init.c; i386_qemu = kern/vga_init.c;
i386_qemu = kern/i386/qemu/mmap.c; i386_qemu = kern/i386/qemu/mmap.c;
i386_qemu = kern/i386/tsc.c; i386_qemu = kern/i386/tsc.c;
@ -161,6 +161,11 @@ kernel = {
mips_qemu_mips = kern/mips/qemu_mips/init.c; mips_qemu_mips = kern/mips/qemu_mips/init.c;
mips_qemu_mips = term/ns8250.c; mips_qemu_mips = term/ns8250.c;
mips_qemu_mips = term/serial.c; mips_qemu_mips = term/serial.c;
mips_qemu_mips = term/at_keyboard.c;
mips_qemu_mips = commands/keylayouts.c;
mips_qemu_mips = term/i386/pc/vga_text.c;
mips_qemu_mips = term/i386/vga_common.c;
mips_qemu_mips = kern/vga_init.c;
mips_arc = kern/mips/arc/init.c; mips_arc = kern/mips/arc/init.c;
mips_arc = term/arc/console.c; mips_arc = term/arc/console.c;

View file

@ -54,8 +54,22 @@ codestart:
/* Parse arguments. Has to be done before relocation. /* Parse arguments. Has to be done before relocation.
So need to do it in asm. */ So need to do it in asm. */
#ifdef GRUB_MACHINE_MIPS_QEMU_MIPS #ifdef GRUB_MACHINE_MIPS_QEMU_MIPS
lui $t0, %hi (((16 << 20) - 264 + 4) | 0x80000000)
lw $t1, %lo (((16 << 20) - 264 + 4) | 0x80000000) ($t0)
lui $t2, 0x1234
ori $t2, 0x5678
bne $t1, $t2, 1f
nop
lui $t0, %hi (((16 << 20) - 264) | 0x80000000) lui $t0, %hi (((16 << 20) - 264) | 0x80000000)
lw $s4, %lo (((16 << 20) - 264) | 0x80000000) ($t0) b 2f
lw $s4, %lo (((16 << 20) - 264) | 0x80000000) ($t0)
1:
li $s4, 0
2:
#endif #endif
#ifdef GRUB_MACHINE_MIPS_LOONGSON #ifdef GRUB_MACHINE_MIPS_LOONGSON

View file

@ -7,17 +7,54 @@
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/time.h> #include <grub/time.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/machine/kernel.h>
#include <grub/cpu/memory.h> #include <grub/cpu/memory.h>
#include <grub/memory.h> #include <grub/memory.h>
extern void grub_serial_init (void); extern void grub_serial_init (void);
extern void grub_terminfo_init (void); extern void grub_terminfo_init (void);
extern void grub_at_keyboard_init (void);
extern void grub_video_init (void);
extern void grub_bitmap_init (void);
extern void grub_font_init (void);
extern void grub_gfxterm_init (void);
extern void grub_at_keyboard_init (void);
extern void grub_serial_init (void);
extern void grub_terminfo_init (void);
extern void grub_keylayouts_init (void);
extern void grub_boot_init (void);
extern void grub_vga_text_init (void);
static inline int
probe_mem (grub_addr_t addr)
{
volatile grub_uint8_t *ptr = (grub_uint8_t *) (0xa0000000 | addr);
grub_uint8_t c = *ptr;
*ptr = 0xAA;
if (*ptr != 0xAA)
return 0;
*ptr = 0x55;
if (*ptr != 0x55)
return 0;
*ptr = c;
return 1;
}
void void
grub_machine_init (void) grub_machine_init (void)
{ {
grub_addr_t modend; grub_addr_t modend;
if (grub_arch_memsize == 0)
{
int i;
for (i = 27; i >= 0; i--)
if (probe_mem (grub_arch_memsize | (1 << i)))
grub_arch_memsize |= (1 << i);
grub_arch_memsize++;
}
/* FIXME: measure this. */ /* FIXME: measure this. */
grub_arch_cpuclock = 64000000; grub_arch_cpuclock = 64000000;
@ -27,8 +64,22 @@ grub_machine_init (void)
grub_install_get_time_ms (grub_rtc_get_time_ms); grub_install_get_time_ms (grub_rtc_get_time_ms);
grub_video_init ();
grub_bitmap_init ();
grub_font_init ();
grub_keylayouts_init ();
grub_at_keyboard_init ();
grub_qemu_init_cirrus ();
grub_vga_text_init ();
grub_terminfo_init (); grub_terminfo_init ();
grub_serial_init (); grub_serial_init ();
grub_boot_init ();
grub_gfxterm_init ();
} }
void void

View file

@ -1,6 +1,6 @@
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 2010 Free Software Foundation, Inc. * Copyright (C) 2010,2011 Free Software Foundation, Inc.
* *
* GRUB is free software: you can redistribute it and/or modify * GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,7 +16,9 @@
* along with GRUB. If not, see <http://www.gnu.org/licenses/>. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __mips__
#include <grub/pci.h> #include <grub/pci.h>
#endif
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/vga.h> #include <grub/vga.h>
@ -43,7 +45,17 @@ static struct {grub_uint8_t r, g, b, a; } colors[] =
{0xFE, 0xFE, 0xFE, 0xFF} // 15 = white {0xFE, 0xFE, 0xFE, 0xFF} // 15 = white
}; };
#ifdef __mips__
extern unsigned char ascii_bitmaps[];
#else
#include <ascii.h> #include <ascii.h>
#endif
#ifdef __mips__
#define VGA_ADDR 0xb00a0000
#else
#define VGA_ADDR 0xa0000
#endif
static void static void
load_font (void) load_font (void)
@ -61,7 +73,7 @@ load_font (void)
grub_vga_gr_write (0xff, GRUB_VGA_GR_BITMASK); grub_vga_gr_write (0xff, GRUB_VGA_GR_BITMASK);
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
grub_memcpy ((void *) (0xa0000 + 32 * i), ascii_bitmaps + 16 * i, 16); grub_memcpy ((void *) (VGA_ADDR + 32 * i), ascii_bitmaps + 16 * i, 16);
} }
static void static void
@ -78,6 +90,7 @@ load_palette (void)
void void
grub_qemu_init_cirrus (void) grub_qemu_init_cirrus (void)
{ {
#ifndef __mips__
auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid); auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused))) int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)))
{ {
@ -106,8 +119,10 @@ grub_qemu_init_cirrus (void)
} }
grub_pci_iterate (find_card); grub_pci_iterate (find_card);
#endif
grub_outb (GRUB_VGA_IO_MISC_COLOR, GRUB_VGA_IO_MISC_WRITE); grub_outb (GRUB_VGA_IO_MISC_COLOR,
GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_MISC_WRITE);
load_font (); load_font ();
@ -143,5 +158,5 @@ grub_qemu_init_cirrus (void)
grub_vga_cr_write (14, GRUB_VGA_CR_CURSOR_START); grub_vga_cr_write (14, GRUB_VGA_CR_CURSOR_START);
grub_vga_cr_write (15, GRUB_VGA_CR_CURSOR_END); grub_vga_cr_write (15, GRUB_VGA_CR_CURSOR_END);
grub_outb (0x20, 0x3c0); grub_outb (0x20, GRUB_MACHINE_PCI_IO_BASE + GRUB_VGA_IO_ARX);
} }

View file

@ -259,7 +259,7 @@ grub_keyboard_controller_write (grub_uint8_t c)
grub_outb (c, KEYBOARD_REG_DATA); grub_outb (c, KEYBOARD_REG_DATA);
} }
#if !defined (GRUB_MACHINE_MIPS_LOONGSON) && !defined (GRUB_MACHINE_QEMU) #if !defined (GRUB_MACHINE_MIPS_LOONGSON) && !defined (GRUB_MACHINE_QEMU) && !defined (GRUB_MACHINE_MIPS_QEMU_MIPS)
static grub_uint8_t static grub_uint8_t
grub_keyboard_controller_read (void) grub_keyboard_controller_read (void)
@ -569,7 +569,7 @@ grub_keyboard_controller_init (struct grub_term_input *term __attribute__ ((unus
keyboard_controller_wait_until_ready (); keyboard_controller_wait_until_ready ();
grub_inb (KEYBOARD_REG_DATA); grub_inb (KEYBOARD_REG_DATA);
} }
#if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_QEMU) #if defined (GRUB_MACHINE_MIPS_LOONGSON) || defined (GRUB_MACHINE_QEMU) || defined (GRUB_MACHINE_MIPS_QEMU_MIPS)
grub_keyboard_controller_orig = 0; grub_keyboard_controller_orig = 0;
grub_keyboard_orig_set = 2; grub_keyboard_orig_set = 2;
#else #else

View file

@ -18,7 +18,7 @@
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/i386/vga_common.h> #include <grub/i386/vga_common.h>
#include <grub/i386/io.h> #include <grub/cpu/io.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/vga.h> #include <grub/vga.h>
@ -29,7 +29,11 @@ GRUB_MOD_LICENSE ("GPLv3+");
static int grub_curr_x, grub_curr_y; static int grub_curr_x, grub_curr_y;
#ifdef __mips__
#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb00b8000)
#else
#define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb8000) #define VGA_TEXT_SCREEN ((grub_uint16_t *) 0xb8000)
#endif
static void static void
screen_write_char (int x, int y, short c) screen_write_char (int x, int y, short c)

View file

@ -313,6 +313,17 @@ grub_serial_register (struct grub_serial_port *port)
grub_term_register_input_inactive ("serial_*", in); grub_term_register_input_inactive ("serial_*", in);
grub_term_register_output_inactive ("serial_*", out); grub_term_register_output_inactive ("serial_*", out);
} }
#elif defined (GRUB_MACHINE_MIPS_QEMU_MIPS)
if (grub_strcmp (port->name, "com0") == 0)
{
grub_term_register_input_active ("serial_*", in);
grub_term_register_output_active ("serial_*", out);
}
else
{
grub_term_register_input_inactive ("serial_*", in);
grub_term_register_output_inactive ("serial_*", out);
}
#else #else
grub_term_register_input ("serial_*", in); grub_term_register_input ("serial_*", in);
grub_term_register_output ("serial_*", out); grub_term_register_output ("serial_*", out);

View file

@ -0,0 +1,25 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2007,2008,2009 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_MACHINE_AT_KEYBOARD_HEADER
#define GRUB_MACHINE_AT_KEYBOARD_HEADER 1
#define KEYBOARD_REG_DATA 0xb4000060
#define KEYBOARD_REG_STATUS 0xb4000064
#endif

View file

@ -25,6 +25,7 @@
void EXPORT_FUNC (grub_reboot) (void); void EXPORT_FUNC (grub_reboot) (void);
void EXPORT_FUNC (grub_halt) (void); void EXPORT_FUNC (grub_halt) (void);
void grub_qemu_init_cirrus (void);
#endif #endif

View file

@ -19,7 +19,12 @@
#ifndef GRUB_VGA_HEADER #ifndef GRUB_VGA_HEADER
#define GRUB_VGA_HEADER 1 #define GRUB_VGA_HEADER 1
#ifndef GRUB_MACHINE_MIPS_QEMU_MIPS
#include <grub/pci.h> #include <grub/pci.h>
#else
#include <grub/cpu/io.h>
#define GRUB_MACHINE_PCI_IO_BASE 0xb4000000
#endif
enum enum
{ {

View file

@ -67,7 +67,8 @@ struct image_target_desc
IMAGE_I386_PC, IMAGE_EFI, IMAGE_COREBOOT, IMAGE_I386_PC, IMAGE_EFI, IMAGE_COREBOOT,
IMAGE_SPARC64_AOUT, IMAGE_SPARC64_RAW, IMAGE_I386_IEEE1275, IMAGE_SPARC64_AOUT, IMAGE_SPARC64_RAW, IMAGE_I386_IEEE1275,
IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH, IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH,
IMAGE_FULOONG_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC IMAGE_FULOONG_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC,
IMAGE_QEMU_MIPS_FLASH
} id; } id;
enum enum
{ {
@ -466,6 +467,50 @@ struct image_target_desc image_targets[] =
.link_align = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN, .link_align = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN,
.default_compression = COMPRESSION_NONE .default_compression = COMPRESSION_NONE
}, },
{
.dirname = "mips-qemu_mips",
.names = { "mips-qemu_mips-flash", NULL },
.voidp_sizeof = 4,
.bigendian = 1,
.id = IMAGE_QEMU_MIPS_FLASH,
.flags = PLATFORM_FLAGS_DECOMPRESSORS,
.prefix = GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX,
.prefix_end = GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX_END,
.raw_size = 0,
.total_module_size = GRUB_KERNEL_MIPS_QEMU_MIPS_TOTAL_MODULE_SIZE,
.compressed_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.section_align = 1,
.vaddr_offset = 0,
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
.link_addr = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ADDR,
.elf_target = EM_MIPS,
.link_align = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN,
.default_compression = COMPRESSION_NONE
},
{
.dirname = "mipsel-qemu_mips",
.names = { "mipsel-qemu_mips-flash", NULL },
.voidp_sizeof = 4,
.bigendian = 0,
.id = IMAGE_QEMU_MIPS_FLASH,
.flags = PLATFORM_FLAGS_DECOMPRESSORS,
.prefix = GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX,
.prefix_end = GRUB_KERNEL_MIPS_QEMU_MIPS_PREFIX_END,
.raw_size = 0,
.total_module_size = GRUB_KERNEL_MIPS_QEMU_MIPS_TOTAL_MODULE_SIZE,
.compressed_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.section_align = 1,
.vaddr_offset = 0,
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
.link_addr = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ADDR,
.elf_target = EM_MIPS,
.link_align = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN,
.default_compression = COMPRESSION_NONE
},
{ {
.dirname = "mips-qemu_mips", .dirname = "mips-qemu_mips",
.names = { "mips-qemu_mips-elf", NULL }, .names = { "mips-qemu_mips-elf", NULL },
@ -1390,6 +1435,28 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
core_size = rom_size; core_size = rom_size;
} }
break; break;
case IMAGE_QEMU_MIPS_FLASH:
{
char *rom_img;
size_t rom_size;
if (core_size > 512 * 1024)
grub_util_error ("firmware image is too big");
rom_size = 512 * 1024;
rom_img = xmalloc (rom_size);
memset (rom_img, 0, rom_size);
memcpy (rom_img, core_img, core_size);
memset (rom_img + core_size, 0,
rom_size - core_size);
free (core_img);
core_img = rom_img;
core_size = rom_size;
}
break;
case IMAGE_MIPS_ARC: case IMAGE_MIPS_ARC:
{ {
char *ecoff_img; char *ecoff_img;