This patch only add minimal necessary system-control modules simulation
for successfully kernel booting and busybox running.
Signed-off-by: Guan Xuetao g...@mprc.pku.edu.cn
---
hw/pkunity/puv3.c | 130 +
hw/pkunity/puv3.h | 49
hw/pkunity/puv3_dma.c | 109 ++
hw/pkunity/puv3_gpio.c | 141
hw/pkunity/puv3_intc.c | 135 ++
hw/pkunity/puv3_ost.c | 151
hw/pkunity/puv3_pm.c | 148 +++
7 files changed, 863 insertions(+), 0 deletions(-)
create mode 100644 hw/pkunity/puv3.c
create mode 100644 hw/pkunity/puv3.h
create mode 100644 hw/pkunity/puv3_dma.c
create mode 100644 hw/pkunity/puv3_gpio.c
create mode 100644 hw/pkunity/puv3_intc.c
create mode 100644 hw/pkunity/puv3_ost.c
create mode 100644 hw/pkunity/puv3_pm.c
diff --git a/hw/pkunity/puv3.c b/hw/pkunity/puv3.c
new file mode 100644
index 000..2e18f71
--- /dev/null
+++ b/hw/pkunity/puv3.c
@@ -0,0 +1,130 @@
+/*
+ * Generic PKUnity SoC machine and board descriptor
+ *
+ * Copyright (C) 2010-2012 Guan Xuetao
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation, or any later version.
+ * See the COPYING file in the top-level directory.
+ */
+#include console.h
+#include elf.h
+#include exec-memory.h
+#include ../sysbus.h
+#include ../boards.h
+#include ../loader.h
+#include ../pc.h
+
+#undef DEBUG_PUV3
+#include puv3.h
+
+#define KERNEL_LOAD_ADDR0x0300
+#define KERNEL_MAX_SIZE 0x0080 /* Just a guess */
+
+static void puv3_intc_cpu_handler(void *opaque, int irq, int level)
+{
+CPUUniCore32State *env = (CPUUniCore32State *)opaque;
+
+assert(irq == 0);
+if (level) {
+cpu_interrupt(env, CPU_INTERRUPT_HARD);
+} else {
+cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
+}
+}
+
+static void puv3_soc_init(CPUUniCore32State *env)
+{
+qemu_irq *cpu_intc, irqs[PUV3_IRQS_NR];
+DeviceState *dev;
+MemoryRegion *i8042 = g_new(MemoryRegion, 1);
+int i;
+
+/* Initialize interrupt controller */
+cpu_intc = qemu_allocate_irqs(puv3_intc_cpu_handler, env, 1);
+dev = sysbus_create_simple(puv3_intc, PUV3_INTC_BASE, *cpu_intc);
+for (i = 0; i PUV3_IRQS_NR; i++) {
+irqs[i] = qdev_get_gpio_in(dev, i);
+}
+
+/* Initialize minimal necessary devices for kernel booting */
+sysbus_create_simple(puv3_pm, PUV3_PM_BASE, NULL);
+sysbus_create_simple(puv3_dma, PUV3_DMA_BASE, NULL);
+sysbus_create_simple(puv3_ost, PUV3_OST_BASE, irqs[PUV3_IRQS_OST0]);
+sysbus_create_varargs(puv3_gpio, PUV3_GPIO_BASE,
+irqs[PUV3_IRQS_GPIOLOW0], irqs[PUV3_IRQS_GPIOLOW1],
+irqs[PUV3_IRQS_GPIOLOW2], irqs[PUV3_IRQS_GPIOLOW3],
+irqs[PUV3_IRQS_GPIOLOW4], irqs[PUV3_IRQS_GPIOLOW5],
+irqs[PUV3_IRQS_GPIOLOW6], irqs[PUV3_IRQS_GPIOLOW7],
+irqs[PUV3_IRQS_GPIOHIGH], NULL);
+
+/* Keyboard (i8042), mouse disabled for nographic */
+i8042_mm_init(irqs[PUV3_IRQS_PS2_KBD], NULL, i8042, PUV3_REGS_OFFSET, 4);
+memory_region_add_subregion(get_system_memory(), PUV3_PS2_BASE, i8042);
+}
+
+static void puv3_board_init(CPUUniCore32State *env, ram_addr_t ram_size)
+{
+MemoryRegion *ram_memory = g_new(MemoryRegion, 1);
+
+/* SDRAM at address zero. */
+memory_region_init_ram(ram_memory, puv3.ram, ram_size);
+vmstate_register_ram_global(ram_memory);
+memory_region_add_subregion(get_system_memory(), 0, ram_memory);
+}
+
+static void puv3_load_kernel(const char *kernel_filename)
+{
+int size;
+
+assert(kernel_filename != NULL);
+
+/* only zImage format supported */
+size = load_image_targphys(kernel_filename, KERNEL_LOAD_ADDR,
+KERNEL_MAX_SIZE);
+if (size 0) {
+hw_error(Load kernel error: '%s'\n, kernel_filename);
+}
+
+/* cheat curses that we have a graphic console, only under ocd console */
+graphic_console_init(NULL, NULL, NULL, NULL, NULL);
+}
+
+static void puv3_init(ram_addr_t ram_size, const char *boot_device,
+ const char *kernel_filename, const char *kernel_cmdline,
+ const char *initrd_filename, const char *cpu_model)
+{
+CPUUniCore32State *env;
+
+if (initrd_filename) {
+hw_error(Please use kernel built-in initramdisk.\n);
+}
+
+if (!cpu_model) {
+cpu_model = UniCore-II;
+}
+
+env = cpu_init(cpu_model);
+if (!env) {
+hw_error(Unable to find CPU definition\n);
+}
+
+puv3_soc_init(env);
+puv3_board_init(env, ram_size);
+puv3_load_kernel(kernel_filename);
+}
+
+static QEMUMachine puv3_machine = {
+.name = puv3,
+.desc = PKUnity