* [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
@ 2006-02-21 19:11 Thiemo Seufer
2006-02-22 15:28 ` Paul Brook
0 siblings, 1 reply; 8+ messages in thread
From: Thiemo Seufer @ 2006-02-21 19:11 UTC (permalink / raw)
To: qemu-devel
Hello All,
this adds to the MIPS system emulation:
- Harddisk emulation, including MSDOS partition labels.
- RTC support.
- (Untested) Audio, PC Keyboard, and PS/2 suport.
Thiemo
diff -urpN qemu-work/Makefile.target qemu/Makefile.target
--- qemu-work/Makefile.target 2006-02-18 00:40:53.000000000 +0000
+++ qemu/Makefile.target 2006-02-16 00:24:40.000000000 +0000
@@ -333,8 +333,11 @@ VL_OBJS+= ppc_prep.o ppc_chrp.o cuda.o a
DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_ARCH), mips)
-VL_OBJS+= mips_r4k.o dma.o vga.o serial.o i8254.o i8259.o
-#VL_OBJS+= #ide.o pckbd.o fdc.o m48t59.o
+VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
+VL_OBJS+= mc146818rtc.o serial.o i8259.o i8254.o mips_r4k.o
+VL_OBJS+= mixeng.o
+#VL_OBJS+= #fdc.o
+DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_BASE_ARCH), sparc)
ifeq ($(TARGET_ARCH), sparc64)
diff -urpN qemu-work/hw/mips_r4k.c qemu/hw/mips_r4k.c
--- qemu-work/hw/mips_r4k.c 2006-02-17 23:55:13.000000000 +0000
+++ qemu/hw/mips_r4k.c 2006-02-12 21:06:22.000000000 +0000
@@ -2,11 +2,13 @@
#define BIOS_FILENAME "mips_bios.bin"
-//#define BIOS_FILENAME "system.bin"
+#define LINUX_BOOT_FILENAME "linux_boot.bin"
+
#define KERNEL_LOAD_ADDR 0x80010000
#define INITRD_LOAD_ADDR 0x80800000
extern FILE *logfile;
+static RTCState *rtc_state;
static PITState *pit;
static void pic_irq_request(void *opaque, int level)
@@ -101,6 +104,35 @@ void cpu_mips_clock_init (CPUState *env)
cpu_mips_update_count(env, 1, 0);
}
+#define REG_EQUIPMENT_BYTE 0x14
+#define REG_IBM_CENTURY_BYTE 0x32
+#define REG_IBM_PS2_CENTURY_BYTE 0x37
+
+static inline int to_bcd(RTCState *s, int a)
+{
+ return ((a / 10) << 4) | (a % 10);
+}
+
+static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table)
+{
+ RTCState *s = rtc_state;
+ int val;
+ time_t ti;
+ struct tm *tm;
+
+ /* set the CMOS date */
+ time(&ti);
+ if (rtc_utc)
+ tm = gmtime(&ti);
+ else
+ tm = localtime(&ti);
+ rtc_set_date(s, tm);
+
+ val = to_bcd(s, (tm->tm_year / 100) + 19);
+ rtc_set_memory(s, REG_IBM_CENTURY_BYTE, val);
+ rtc_set_memory(s, REG_IBM_PS2_CENTURY_BYTE, val);
+}
+
static void io_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
{
#if 0
@@ -183,6 +215,10 @@ CPUReadMemoryFunc *io_read[] = {
&io_readl,
};
+static const int ide_iobase[2] = { 0x1f0, 0x170 };
+static const int ide_iobase2[2] = { 0x3f6, 0x376 };
+static const int ide_irq[2] = { 14, 15 };
+
void mips_r4k_init (int ram_size, int vga_ram_size, int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
@@ -195,16 +231,18 @@ void mips_r4k_init (int ram_size, int vg
int linux_boot;
int ret;
CPUState *env;
+ int i;
printf("%s: start\n", __func__);
linux_boot = (kernel_filename != NULL);
env = cpu_init();
register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
/* allocate RAM */
cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
bios_offset = ram_size + vga_ram_size;
+
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME);
printf("%s: load BIOS '%s' size %d\n", __func__, buf, BIOS_SIZE);
ret = load_image(buf, phys_ram_base + bios_offset);
@@ -221,6 +260,28 @@ void mips_r4k_init (int ram_size, int vg
env->PC = 0xBFC00004;
#endif
if (linux_boot) {
+ uint8_t bootsect[512];
+ uint8_t old_bootsect[512];
+
+ if (bs_table[0] == NULL) {
+ fprintf(stderr, "A disk image must be given for 'hda' when booting a Linux kernel\n");
+ exit(1);
+ }
+ snprintf(buf, sizeof(buf), "%s/%s", bios_dir, LINUX_BOOT_FILENAME);
+ ret = load_image(buf, bootsect);
+ if (ret != sizeof(bootsect)) {
+ fprintf(stderr, "qemu: could not load linux boot sector '%s'\n",
+ buf);
+ exit(1);
+ }
+
+ if (bdrv_read(bs_table[0], 0, old_bootsect, 1) >= 0) {
+ /* copy the MSDOS partition table */
+ memcpy(bootsect + 0x1be, old_bootsect + 0x1be, 0x40);
+ }
+
+ bdrv_set_boot_sector(bs_table[0], bootsect, sizeof(bootsect));
+
kernel_base = KERNEL_LOAD_ADDR;
/* now we can load the kernel */
kernel_size = load_image(kernel_filename,
@@ -230,6 +291,7 @@ void mips_r4k_init (int ram_size, int vg
kernel_filename);
exit(1);
}
+
/* load initrd */
if (initrd_filename) {
initrd_base = INITRD_LOAD_ADDR;
@@ -244,6 +306,7 @@ void mips_r4k_init (int ram_size, int vg
initrd_base = 0;
initrd_size = 0;
}
+
env->PC = KERNEL_LOAD_ADDR;
/* Store command line. */
strcpy (phys_ram_base + (16 << 20) - 256, kernel_cmdline);
@@ -261,6 +324,8 @@ void mips_r4k_init (int ram_size, int vg
cpu_mips_clock_init(env);
cpu_mips_irqctrl_init();
+ rtc_state = rtc_init(0x70, 8);
+
/* Register 64 KB of ISA IO space at 0x14000000 */
io_memory = cpu_register_io_memory(0, io_read, io_write, NULL);
cpu_register_physical_memory(0x14000000, 0x00010000, io_memory);
@@ -268,6 +333,7 @@ void mips_r4k_init (int ram_size, int vg
isa_pic = pic_init(pic_irq_request, env);
pit = pit_init(0x40, 0);
+
serial_init(&pic_set_irq_new, isa_pic, 0x3f8, 4, serial_hds[0]);
vga_initialize(NULL, ds, phys_ram_base + ram_size, ram_size,
vga_ram_size, 0, 0);
@@ -281,6 +347,16 @@ void mips_r4k_init (int ram_size, int vg
exit (1);
}
}
+
+ for(i = 0; i < 2; i++)
+ isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+ bs_table[2 * i], bs_table[2 * i + 1]);
+
+ kbd_init();
+ DMA_init(1);
+
+ cmos_init(ram_size, boot_device, bs_table);
+
}
QEMUMachine mips_machine = {
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-02-21 19:11 [Qemu-devel] [PATCH] Add more devices for MIPS system emulation Thiemo Seufer
@ 2006-02-22 15:28 ` Paul Brook
2006-02-22 17:35 ` Thiemo Seufer
0 siblings, 1 reply; 8+ messages in thread
From: Paul Brook @ 2006-02-22 15:28 UTC (permalink / raw)
To: qemu-devel
On Tuesday 21 February 2006 19:11, Thiemo Seufer wrote:
> Hello All,
>
> this adds to the MIPS system emulation:
> - Harddisk emulation, including MSDOS partition labels.
Why do you need the bootsector bits? IIUC this was an x86 specific hack to
make the x86 bios load the kernel passed with -kernel.
The MIPS emulation jumps directly to the loaded kernel, so this should not be
necessary.
Paul
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-02-22 15:28 ` Paul Brook
@ 2006-02-22 17:35 ` Thiemo Seufer
2006-02-23 19:24 ` Paul Brook
0 siblings, 1 reply; 8+ messages in thread
From: Thiemo Seufer @ 2006-02-22 17:35 UTC (permalink / raw)
To: Paul Brook; +Cc: qemu-devel
On Wed, Feb 22, 2006 at 03:28:04PM +0000, Paul Brook wrote:
> On Tuesday 21 February 2006 19:11, Thiemo Seufer wrote:
> > Hello All,
> >
> > this adds to the MIPS system emulation:
> > - Harddisk emulation, including MSDOS partition labels.
>
> Why do you need the bootsector bits? IIUC this was an x86 specific hack to
> make the x86 bios load the kernel passed with -kernel.
> The MIPS emulation jumps directly to the loaded kernel, so this should not be
> necessary.
That's the current state since there is no real mips firmware, but Qemu
should also be able to boot from an image. E.g. Linux/MIPS on
DECstations uses MSDOS disklabels.
Thiemo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-02-22 17:35 ` Thiemo Seufer
@ 2006-02-23 19:24 ` Paul Brook
2006-02-23 21:37 ` Thiemo Seufer
0 siblings, 1 reply; 8+ messages in thread
From: Paul Brook @ 2006-02-23 19:24 UTC (permalink / raw)
To: Thiemo Seufer; +Cc: qemu-devel
On Wednesday 22 February 2006 17:35, Thiemo Seufer wrote:
> On Wed, Feb 22, 2006 at 03:28:04PM +0000, Paul Brook wrote:
> > On Tuesday 21 February 2006 19:11, Thiemo Seufer wrote:
> > > Hello All,
> > >
> > > this adds to the MIPS system emulation:
> > > - Harddisk emulation, including MSDOS partition labels.
> >
> > Why do you need the bootsector bits? IIUC this was an x86 specific hack
> > to make the x86 bios load the kernel passed with -kernel.
> > The MIPS emulation jumps directly to the loaded kernel, so this should
> > not be necessary.
>
> That's the current state since there is no real mips firmware, but Qemu
> should also be able to boot from an image. E.g. Linux/MIPS on
> DECstations uses MSDOS disklabels.
I don't see how providing a fake an x86 boot sector would help this.
Presumably the DECstation firmware just knows how to load an image from disk.
Paul
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-02-23 19:24 ` Paul Brook
@ 2006-02-23 21:37 ` Thiemo Seufer
2006-02-23 21:44 ` Paul Brook
0 siblings, 1 reply; 8+ messages in thread
From: Thiemo Seufer @ 2006-02-23 21:37 UTC (permalink / raw)
To: Paul Brook; +Cc: qemu-devel
On Thu, Feb 23, 2006 at 07:24:06PM +0000, Paul Brook wrote:
> On Wednesday 22 February 2006 17:35, Thiemo Seufer wrote:
> > On Wed, Feb 22, 2006 at 03:28:04PM +0000, Paul Brook wrote:
> > > On Tuesday 21 February 2006 19:11, Thiemo Seufer wrote:
> > > > Hello All,
> > > >
> > > > this adds to the MIPS system emulation:
> > > > - Harddisk emulation, including MSDOS partition labels.
> > >
> > > Why do you need the bootsector bits? IIUC this was an x86 specific hack
> > > to make the x86 bios load the kernel passed with -kernel.
> > > The MIPS emulation jumps directly to the loaded kernel, so this should
> > > not be necessary.
> >
> > That's the current state since there is no real mips firmware, but Qemu
> > should also be able to boot from an image. E.g. Linux/MIPS on
> > DECstations uses MSDOS disklabels.
>
> I don't see how providing a fake an x86 boot sector would help this.
> Presumably the DECstation firmware just knows how to load an image from disk.
It loads a block sector list from the bootsector which points to
the second stage bootloader.
Thiemo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-02-23 21:37 ` Thiemo Seufer
@ 2006-02-23 21:44 ` Paul Brook
2006-03-06 14:50 ` Thiemo Seufer
0 siblings, 1 reply; 8+ messages in thread
From: Paul Brook @ 2006-02-23 21:44 UTC (permalink / raw)
To: Thiemo Seufer; +Cc: qemu-devel
> > > That's the current state since there is no real mips firmware, but Qemu
> > > should also be able to boot from an image. E.g. Linux/MIPS on
> > > DECstations uses MSDOS disklabels.
> >
> > I don't see how providing a fake an x86 boot sector would help this.
> > Presumably the DECstation firmware just knows how to load an image from
> > disk.
>
> It loads a block sector list from the bootsector which points to
> the second stage bootloader.
The existing linux.bin definitely won't do what you want then.
In any case until the MIPS emulation can emulate a DECstation and we have a
corresponding BIOS that we can distribute, your patch just breaks diskless
MIPS emulation for no apparent benefit.
Paul
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-02-23 21:44 ` Paul Brook
@ 2006-03-06 14:50 ` Thiemo Seufer
2006-03-11 21:25 ` Paul Brook
0 siblings, 1 reply; 8+ messages in thread
From: Thiemo Seufer @ 2006-03-06 14:50 UTC (permalink / raw)
To: Paul Brook; +Cc: qemu-devel
On Thu, Feb 23, 2006 at 09:44:20PM +0000, Paul Brook wrote:
> > > > That's the current state since there is no real mips firmware, but Qemu
> > > > should also be able to boot from an image. E.g. Linux/MIPS on
> > > > DECstations uses MSDOS disklabels.
> > >
> > > I don't see how providing a fake an x86 boot sector would help this.
> > > Presumably the DECstation firmware just knows how to load an image from
> > > disk.
> >
> > It loads a block sector list from the bootsector which points to
> > the second stage bootloader.
>
> The existing linux.bin definitely won't do what you want then.
>
> In any case until the MIPS emulation can emulate a DECstation and we have a
> corresponding BIOS that we can distribute, your patch just breaks diskless
> MIPS emulation for no apparent benefit.
I updated the patch to allow for that again, and added an ELF loader on
top to avoid hardcoded kernel load addresses/entry points. This is also
useful for stand-alone programs. The ramdisk and command line addresses
are still hardcoded.
Thiemo
Index: qemu-work/Makefile.target
===================================================================
--- qemu-work.orig/Makefile.target 2006-02-21 16:41:47.000000000 +0000
+++ qemu-work/Makefile.target 2006-03-06 02:03:38.000000000 +0000
@@ -333,8 +333,11 @@
DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_ARCH), mips)
-VL_OBJS+= mips_r4k.o dma.o vga.o serial.o i8254.o i8259.o
-#VL_OBJS+= #ide.o pckbd.o fdc.o m48t59.o
+VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
+VL_OBJS+= mc146818rtc.o serial.o i8259.o i8254.o mips_r4k.o
+VL_OBJS+= mixeng.o
+#VL_OBJS+= #fdc.o
+DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_BASE_ARCH), sparc)
ifeq ($(TARGET_ARCH), sparc64)
Index: qemu-work/hw/mips_r4k.c
===================================================================
--- qemu-work.orig/hw/mips_r4k.c 2006-02-21 16:40:03.000000000 +0000
+++ qemu-work/hw/mips_r4k.c 2006-03-06 02:07:18.000000000 +0000
@@ -1,12 +1,13 @@
#include "vl.h"
#define BIOS_FILENAME "mips_bios.bin"
-//#define BIOS_FILENAME "system.bin"
-#define KERNEL_LOAD_ADDR 0x80010000
+#define LINUX_BOOT_FILENAME "linux_boot.bin"
+
#define INITRD_LOAD_ADDR 0x80800000
extern FILE *logfile;
+static RTCState *rtc_state;
static PITState *pit;
static void pic_irq_request(void *opaque, int level)
@@ -101,6 +102,136 @@
cpu_mips_update_count(env, 1, 0);
}
+#define REG_EQUIPMENT_BYTE 0x14
+#define REG_IBM_CENTURY_BYTE 0x32
+#define REG_IBM_PS2_CENTURY_BYTE 0x37
+
+static inline int to_bcd(RTCState *s, int a)
+{
+ return ((a / 10) << 4) | (a % 10);
+}
+
+static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table)
+{
+ RTCState *s = rtc_state;
+ int val;
+ time_t ti;
+ struct tm *tm;
+
+ /* set the CMOS date */
+ time(&ti);
+ if (rtc_utc)
+ tm = gmtime(&ti);
+ else
+ tm = localtime(&ti);
+ rtc_set_date(s, tm);
+
+ val = to_bcd(s, (tm->tm_year / 100) + 19);
+ rtc_set_memory(s, REG_IBM_CENTURY_BYTE, val);
+ rtc_set_memory(s, REG_IBM_PS2_CENTURY_BYTE, val);
+}
+
+
+#include "disas.h"
+
+#define ELF_CLASS ELFCLASS32
+#ifdef TARGET_WORDS_BIGENDIAN
+# define ELF_DATA ELFDATA2MSB
+#else
+# define ELF_DATA ELFDATA2LSB
+#endif
+#define ELF_ARCH EM_MIPS
+
+#include "elf.h"
+
+#ifndef BSWAP_NEEDED
+#define bswap_ehdr32(e) do { } while (0)
+#define bswap_phdr32(e) do { } while (0)
+#define bswap_shdr32(e) do { } while (0)
+#define bswap_sym32(e) do { } while (0)
+#endif
+
+#define SZ 32
+#define elf_word uint32_t
+#define bswapSZs bswap32s
+#include "elf_ops.h"
+
+static int load_mips_kernel_elf(const char *filename, elf_word *entry)
+{
+ struct elf32_hdr ehdr;
+ int retval, fd, i;
+ Elf32_Half machine;
+
+ fd = open(filename, O_RDONLY | O_BINARY);
+ if (fd < 0)
+ goto error;
+
+ retval = read(fd, &ehdr, sizeof(ehdr));
+ if (retval < 0)
+ goto error;
+
+ if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] != 'E'
+ || ehdr.e_ident[2] != 'L' || ehdr.e_ident[3] != 'F')
+ goto error;
+ machine = tswap16(ehdr.e_machine);
+ if (machine == EM_MIPS) {
+ struct elf32_phdr phdr;
+
+ bswap_ehdr32(&ehdr);
+
+ *entry = ehdr.e_entry;
+ retval = lseek(fd, ehdr.e_phoff, SEEK_SET);
+ if (retval < 0)
+ goto error;
+
+ for (i = 0; i < ehdr.e_phnum; i++) {
+ retval = read(fd, &phdr, sizeof(phdr));
+ if (retval < 0)
+ goto error;
+ bswap_phdr32(&phdr);
+ if (phdr.p_type == PT_LOAD) {
+ uint8_t *addr;
+ size_t sz = phdr.p_filesz;
+
+ if (phdr.p_vaddr < 0x80000000
+ || phdr.p_memsz > 0x20000000
+ || (phdr.p_vaddr < 0xa0000000 && (phdr.p_vaddr + phdr.p_memsz) >= 0xa0000000)
+ || (phdr.p_vaddr < 0xc0000000 && (phdr.p_vaddr + phdr.p_memsz) >= 0xc0000000))
+ goto error;
+ addr = (uint8_t *)(phys_ram_base + (phdr.p_vaddr & 0x1fffffff));
+ retval = lseek(fd, phdr.p_offset, SEEK_SET);
+ if (retval < 0)
+ goto error;
+ while (sz) {
+ retval = read(fd, addr, sz);
+ switch (retval) {
+ case -1:
+ goto error;
+ case 0: /* EOF */
+ if (sz)
+ goto error;
+ break;
+ default:
+ if (sz < retval)
+ goto error;
+ sz -= retval;
+ retval = 0;
+ break;
+ }
+ }
+ }
+ }
+ load_symbols32(&ehdr, fd);
+ }
+
+ close(fd);
+ return retval;
+ error:
+ close(fd);
+ return -1;
+}
+
+
static void io_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
{
#if 0
@@ -183,84 +314,101 @@
&io_readl,
};
+static const int ide_iobase[2] = { 0x1f0, 0x170 };
+static const int ide_iobase2[2] = { 0x3f6, 0x376 };
+static const int ide_irq[2] = { 14, 15 };
+
void mips_r4k_init (int ram_size, int vga_ram_size, int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename)
{
char buf[1024];
- target_ulong kernel_base, kernel_size, initrd_base, initrd_size;
+ elf_word entry = 0;
unsigned long bios_offset;
int io_memory;
- int linux_boot;
int ret;
CPUState *env;
-
- printf("%s: start\n", __func__);
- linux_boot = (kernel_filename != NULL);
+ int i;
env = cpu_init();
register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
/* allocate RAM */
cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
+
+ /* Try to load a BIOS image. If this fails, we continue regardless,
+ but initialize the hardware ourselves. When a kernel gets
+ preloaded we also initialize the hardware, since the BIOS wasn't
+ run. */
bios_offset = ram_size + vga_ram_size;
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME);
printf("%s: load BIOS '%s' size %d\n", __func__, buf, BIOS_SIZE);
ret = load_image(buf, phys_ram_base + bios_offset);
- if (ret != BIOS_SIZE) {
- fprintf(stderr, "qemu: could not load MIPS bios '%s'\n", buf);
- exit(1);
+ if (ret == BIOS_SIZE) {
+ cpu_register_physical_memory((uint32_t)(0x1fc00000),
+ BIOS_SIZE, bios_offset | IO_MEM_ROM);
+ env->PC = 0xBFC00000;
+ if (!kernel_filename)
+ return;
+ } else {
+ /* not fatal */
+ fprintf(stderr, "qemu: Warning, could not load MIPS bios '%s'\n",
+ buf);
}
- cpu_register_physical_memory((uint32_t)(0x1fc00000),
- BIOS_SIZE, bios_offset | IO_MEM_ROM);
-#if 0
- memcpy(phys_ram_base + 0x10000, phys_ram_base + bios_offset, BIOS_SIZE);
- env->PC = 0x80010004;
-#else
- env->PC = 0xBFC00004;
-#endif
- if (linux_boot) {
- kernel_base = KERNEL_LOAD_ADDR;
- /* now we can load the kernel */
- kernel_size = load_image(kernel_filename,
- phys_ram_base + (kernel_base - 0x80000000));
- if (kernel_size == (target_ulong) -1) {
+
+ if (kernel_filename) {
+ /* Prepare the bootsector if a disk image was specified via -hda. */
+ if (bs_table[0]) {
+ uint8_t bootsect[512];
+ uint8_t old_bootsect[512];
+
+ snprintf(buf, sizeof(buf), "%s/%s", bios_dir, LINUX_BOOT_FILENAME);
+ ret = load_image(buf, bootsect);
+ if (ret != sizeof(bootsect)) {
+ fprintf(stderr, "qemu: could not load linux boot sector '%s'\n",
+ buf);
+ exit(1);
+ }
+
+ if (bdrv_read(bs_table[0], 0, old_bootsect, 1) >= 0) {
+ /* copy the MSDOS partition table */
+ memcpy(bootsect + 0x1be, old_bootsect + 0x1be, 0x40);
+ }
+
+ bdrv_set_boot_sector(bs_table[0], bootsect, sizeof(bootsect));
+ }
+
+ if (load_mips_kernel_elf(kernel_filename, &entry)) {
fprintf(stderr, "qemu: could not load kernel '%s'\n",
kernel_filename);
exit(1);
- }
+ }
+ env->PC = entry;
+
/* load initrd */
if (initrd_filename) {
- initrd_base = INITRD_LOAD_ADDR;
- initrd_size = load_image(initrd_filename,
- phys_ram_base + initrd_base);
- if (initrd_size == (target_ulong) -1) {
+ if (load_image(initrd_filename, phys_ram_base + INITRD_LOAD_ADDR)
+ == (target_ulong) -1) {
fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
initrd_filename);
exit(1);
}
- } else {
- initrd_base = 0;
- initrd_size = 0;
}
- env->PC = KERNEL_LOAD_ADDR;
+
/* Store command line. */
strcpy (phys_ram_base + (16 << 20) - 256, kernel_cmdline);
/* FIXME: little endian support */
*(int *)(phys_ram_base + (16 << 20) - 260) = tswap32 (0x12345678);
*(int *)(phys_ram_base + (16 << 20) - 264) = tswap32 (ram_size);
- } else {
- kernel_base = 0;
- kernel_size = 0;
- initrd_base = 0;
- initrd_size = 0;
}
/* Init internal devices */
cpu_mips_clock_init(env);
cpu_mips_irqctrl_init();
+ rtc_state = rtc_init(0x70, 8);
+
/* Register 64 KB of ISA IO space at 0x14000000 */
io_memory = cpu_register_io_memory(0, io_read, io_write, NULL);
cpu_register_physical_memory(0x14000000, 0x00010000, io_memory);
@@ -268,6 +416,7 @@
isa_pic = pic_init(pic_irq_request, env);
pit = pit_init(0x40, 0);
+
serial_init(&pic_set_irq_new, isa_pic, 0x3f8, 4, serial_hds[0]);
vga_initialize(NULL, ds, phys_ram_base + ram_size, ram_size,
vga_ram_size, 0, 0);
@@ -281,6 +430,16 @@
exit (1);
}
}
+
+ for(i = 0; i < 2; i++)
+ isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+ bs_table[2 * i], bs_table[2 * i + 1]);
+
+ kbd_init();
+ DMA_init(1);
+
+ cmos_init(ram_size, boot_device, bs_table);
+
}
QEMUMachine mips_machine = {
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH] Add more devices for MIPS system emulation
2006-03-06 14:50 ` Thiemo Seufer
@ 2006-03-11 21:25 ` Paul Brook
0 siblings, 0 replies; 8+ messages in thread
From: Paul Brook @ 2006-03-11 21:25 UTC (permalink / raw)
To: qemu-devel
> I updated the patch to allow for that again, and added an ELF loader on
> top to avoid hardcoded kernel load addresses/entry points. This is also
> useful for stand-alone programs. The ramdisk and command line addresses
> are still hardcoded.
Except now you can't load raw kernel images.
I'm still not convinced the boot sector hacks can do anything useful How
exactly are you using these? You say the DECstation bios uses offsets stored
in the boot sector to locate the second stage bootloader, but:
a) We aren't using a DECstation bios. I'm guessing we're not emulating
DECstation hardware, so it wouldn't work even if we did have one.
b) You haven't modified the boot sector to provide those offsets.
c) You're only replacing the boot sector itself. Even if you did insert the
correct offsets they'd still be pointing to random bits of user data, not the
kernel you want to boot.
Paul
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-03-11 21:25 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-02-21 19:11 [Qemu-devel] [PATCH] Add more devices for MIPS system emulation Thiemo Seufer
2006-02-22 15:28 ` Paul Brook
2006-02-22 17:35 ` Thiemo Seufer
2006-02-23 19:24 ` Paul Brook
2006-02-23 21:37 ` Thiemo Seufer
2006-02-23 21:44 ` Paul Brook
2006-03-06 14:50 ` Thiemo Seufer
2006-03-11 21:25 ` Paul Brook
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).