Fix basic Chihiro machine init (IDE still needs fixing)

This commit is contained in:
Matt Borgerson 2018-06-26 14:48:02 -07:00
parent 8e24af7bda
commit 3486a4f1f4
2 changed files with 236 additions and 106 deletions

View File

@ -17,12 +17,13 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "qemu/osdep.h"
#include "hw/hw.h"
#include "ui/console.h"
#include "hw/usb.h"
#include "hw/usb/desc.h"
#define DEBUG_CUSB
// #define DEBUG_CUSB
#ifdef DEBUG_CUSB
#define DPRINTF(s, ...) printf("chihiro-usb: " s, ## __VA_ARGS__)
#else
@ -144,10 +145,6 @@ static const USBDesc desc_chihiro_an2131qc = {
.str = chihiro_usb_stringtable,
};
static const USBDescIface desc_iface_chihiro_an2131sc = {
.bInterfaceNumber = 0,
.bNumEndpoints = 6,
@ -223,8 +220,6 @@ static const USBDesc desc_chihiro_an2131sc = {
.str = chihiro_usb_stringtable,
};
static void handle_reset(USBDevice *dev)
{
DPRINTF("usb reset\n");
@ -235,7 +230,8 @@ static void handle_control(USBDevice *dev, USBPacket *p,
{
DPRINTF("handle control %d %d %d %d\n", request, value, index, length);
int ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
int ret = usb_desc_handle_control(dev, p, request, value, index,
length, data);
if (ret >= 0) {
DPRINTF("handled by usb_desc_handle_control: %d\n", ret);
return;
@ -247,33 +243,29 @@ static void handle_data(USBDevice *dev, USBPacket *p)
DPRINTF("handle_data 0x%x %d 0x%zx\n", p->pid, p->ep->nr, p->iov.size);
}
static void handle_destroy(USBDevice *dev)
{
DPRINTF("usb reset\n");
}
static int chihiro_an2131qc_initfn(USBDevice *dev)
static void chihiro_an2131qc_realize(USBDevice *dev, Error **errp)
{
// ChihiroUSBState *s = DO_UPCAST(ChihiroUSBState, dev, dev);
usb_desc_init(dev);
}
return 0;
static void chihiro_an2131qc_unrealize(USBDevice *dev, Error **errp)
{
}
static void chihiro_an2131qc_class_initfn(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
// DeviceClass *dc = DEVICE_CLASS(klass);
USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
uc->init = chihiro_an2131qc_initfn;
uc->realize = chihiro_an2131qc_realize;
uc->unrealize = chihiro_an2131qc_unrealize;
uc->product_desc = "Chihiro an2131qc";
uc->usb_desc = &desc_chihiro_an2131qc;
uc->handle_reset = handle_reset;
uc->handle_control = handle_control;
uc->handle_data = handle_data;
uc->handle_destroy = handle_destroy;
uc->handle_attach = usb_desc_attach;
//dc->vmsd = &vmstate_usb_kbd;
@ -286,29 +278,29 @@ static const TypeInfo chihiro_an2131qc_info = {
.class_init = chihiro_an2131qc_class_initfn,
};
static int chihiro_an2131sc_initfn(USBDevice *dev)
static void chihiro_an2131sc_realize(USBDevice *dev, Error **errp)
{
// ChihiroUSBState *s = DO_UPCAST(ChihiroUSBState, dev, dev);
usb_desc_init(dev);
}
return 0;
static void chihiro_an2131sc_unrealize(USBDevice *dev, Error **errp)
{
}
static void chihiro_an2131sc_class_initfn(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
// DeviceClass *dc = DEVICE_CLASS(klass);
USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
uc->init = chihiro_an2131sc_initfn;
uc->realize = chihiro_an2131sc_realize;
uc->unrealize = chihiro_an2131sc_unrealize;
uc->product_desc = "Chihiro an2131sc";
uc->usb_desc = &desc_chihiro_an2131sc;
uc->handle_reset = handle_reset;
uc->handle_control = handle_control;
uc->handle_data = handle_data;
uc->handle_destroy = handle_destroy;
uc->handle_attach = usb_desc_attach;
//dc->vmsd = &vmstate_usb_kbd;
@ -321,7 +313,6 @@ static const TypeInfo chihiro_an2131sc_info = {
.class_init = chihiro_an2131sc_class_initfn,
};
static void chihiro_usb_register_types(void)
{
type_register_static(&chihiro_an2131qc_info);

View File

@ -2,6 +2,7 @@
* QEMU Chihiro emulation
*
* Copyright (c) 2013 espes
* Copyright (c) 2018 Matt Borgerson
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@ -17,17 +18,73 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "qemu/osdep.h"
#include "hw/hw.h"
#include "hw/loader.h"
#include "hw/i386/pc.h"
#include "hw/i386/apic.h"
#include "hw/smbios/smbios.h"
#include "hw/pci/pci.h"
#include "hw/pci/pci_ids.h"
#include "hw/usb.h"
#include "net/net.h"
#include "hw/boards.h"
#include "hw/ide.h"
#include "hw/loader.h"
#include "hw/isa/isa.h"
#include "sysemu/kvm.h"
#include "hw/kvm/clock.h"
#include "sysemu/sysemu.h"
#include "hw/sysbus.h"
#include "sysemu/arch_init.h"
#include "hw/i2c/smbus.h"
#include "hw/xen/xen.h"
#include "exec/memory.h"
#include "qemu/config-file.h"
#include "sysemu/blockdev.h"
#include "block/blkmemory.h"
#include "hw/xbox/xbox.h"
#include "exec/address-spaces.h"
#include "hw/acpi/acpi.h"
#include "cpu.h"
#include "qapi/error.h"
#include "qemu/error-report.h"
#ifdef CONFIG_XEN
#include <xen/hvm/hvm_info_table.h>
#include "hw/xen/xen_pt.h"
#endif
#include "migration/global_state.h"
#include "migration/misc.h"
#include "kvm_i386.h"
#include "sysemu/numa.h"
#include "hw/timer/mc146818rtc.h"
#include "xbox_pci.h"
#include "smbus.h"
#include "qemu/option.h"
#include "xbox.h"
#include "block/block.h"
#define TYPE_CHIHIRO_MACHINE MACHINE_TYPE_NAME("chihiro")
#define CHIHIRO_MACHINE(obj) \
OBJECT_CHECK(ChihiroMachineState, (obj), TYPE_CHIHIRO_MACHINE)
#define CHIHIRO_MACHINE_CLASS(klass) \
OBJECT_CLASS_CHECK(ChihiroMachineClass, (klass), TYPE_CHIHIRO_MACHINE)
typedef struct ChihiroMachineState {
/*< private >*/
PCMachineState parent_obj;
/*< public >*/
char *mediaboard_rom;
char *mediaboard_filesystem;
} ChihiroMachineState;
typedef struct ChihiroMachineClass {
/*< private >*/
PCMachineClass parent_class;
/*< public >*/
} ChihiroMachineClass;
#define SEGA_CHIP_REVISION 0xF0
@ -91,7 +148,7 @@ static void chihiro_lpc_realize(DeviceState *dev, Error **errp)
{
ChihiroLPCState *s = CHIHIRO_LPC_DEVICE(dev);
ISADevice *isa = ISA_DEVICE(dev);
memory_region_init_io(&s->ioport, OBJECT(dev), &chihiro_lpc_io_ops, s,
"chihiro-lpc-io", 0x100);
isa_register_ioport(isa, &s->ioport, 0x4000);
@ -149,7 +206,7 @@ static void chihiro_ide_interface_init(const char *rom_file,
rom = g_malloc(sizeof(*rom));
memory_region_init_ram(rom, NULL, "chihiro.interface.rom",
ROM_SECTORS * SECTOR_SIZE);
ROM_SECTORS * SECTOR_SIZE, &error_fatal);
memory_region_add_subregion(interface,
(uint64_t)ROM_START * SECTOR_SIZE, rom);
@ -157,7 +214,7 @@ static void chihiro_ide_interface_init(const char *rom_file,
/* limited by the size of the board ram, which we emulate as 128M for now */
filesystem = g_malloc(sizeof(*filesystem));
memory_region_init_ram(filesystem, NULL, "chihiro.interface.filesystem",
128 * 1024 * 1024);
128 * 1024 * 1024, &error_fatal);
memory_region_add_subregion(interface,
(uint64_t)FILESYSTEM_START * SECTOR_SIZE,
filesystem);
@ -170,7 +227,9 @@ static void chihiro_ide_interface_init(const char *rom_file,
/* read files */
int rc, fd = -1;
if (!rom_file) rom_file = "fpr21042_m29w160et.bin";
if (!rom_file || (*rom_file == '\x00')) {
rom_file = "fpr21042_m29w160et.bin";
}
char *rom_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, rom_file);
if (rom_filename) {
int rom_size = get_image_size(rom_filename);
@ -183,8 +242,7 @@ static void chihiro_ide_interface_init(const char *rom_file,
close(fd);
}
if (filesystem_file) {
if (filesystem_file && (*filesystem_file != '\x00')) {
assert(access(filesystem_file, R_OK) == 0);
int filesystem_size = get_image_size(filesystem_file);
@ -197,6 +255,7 @@ static void chihiro_ide_interface_init(const char *rom_file,
close(fd);
}
#if 0 // FIXME
/* create the device */
DriveInfo *dinfo;
dinfo = g_malloc0(sizeof(*dinfo));
@ -211,82 +270,162 @@ static void chihiro_ide_interface_init(const char *rom_file,
memory_region_size(interface)));
drive_append(dinfo);
#else
printf("Chihiro IDE not yet implemented (please fix it)\n");
assert(0);
#endif
}
static void chihiro_init(QEMUMachineInitArgs *args)
{
/* Placeholder blank eeprom for chihiro:
* Serial number 000000000000
* Mac address 00:00:00:00:00:00
* ...etc.
*/
const uint8_t eeprom[] = {
0xA7, 0x65, 0x60, 0x76, 0xB7, 0x2F, 0xFE, 0xD8,
0x20, 0xBC, 0x8B, 0x15, 0x13, 0xBF, 0x73, 0x9C,
0x8C, 0x3F, 0xD8, 0x07, 0x75, 0x55, 0x5F, 0x8B,
0x09, 0xD1, 0x25, 0xD1, 0x1A, 0xA2, 0xD5, 0xB7,
0x01, 0x7D, 0x9A, 0x31, 0xCD, 0x9C, 0x83, 0x6B,
0x2C, 0xAB, 0xAD, 0x6F, 0xAC, 0x36, 0xDE, 0xEF,
0x6F, 0x6E, 0x2F, 0x6F, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* Placeholder blank eeprom for chihiro:
* Serial number 000000000000
* Mac address 00:00:00:00:00:00
* ...etc.
*/
/* FIXME: This should be passed in via machine args,
* please fix when xbox is fixed */
static const uint8_t eeprom[] = {
0xA7, 0x65, 0x60, 0x76, 0xB7, 0x2F, 0xFE, 0xD8,
0x20, 0xBC, 0x8B, 0x15, 0x13, 0xBF, 0x73, 0x9C,
0x8C, 0x3F, 0xD8, 0x07, 0x75, 0x55, 0x5F, 0x8B,
0x09, 0xD1, 0x25, 0xD1, 0x1A, 0xA2, 0xD5, 0xB7,
0x01, 0x7D, 0x9A, 0x31, 0xCD, 0x9C, 0x83, 0x6B,
0x2C, 0xAB, 0xAD, 0x6F, 0xAC, 0x36, 0xDE, 0xEF,
0x6F, 0x6E, 0x2F, 0x6F, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
QemuOpts *machine_opts = qemu_opts_find(qemu_find_opts("machine"), NULL);
if (machine_opts) {
const char *mediaboard_rom_file =
qemu_opt_get(machine_opts, "mediaboard_rom");
const char *mediaboard_filesystem_file =
qemu_opt_get(machine_opts, "mediaboard_filesystem");
if (mediaboard_rom_file || mediaboard_filesystem_file) {
chihiro_ide_interface_init(mediaboard_rom_file,
mediaboard_filesystem_file);
}
}
static void chihiro_init(MachineState *machine)
{
const char *mediaboard_rom_file = object_property_get_str(
qdev_get_machine(), "mediaboard_rom", NULL);
const char *mediaboard_filesystem_file = object_property_get_str(
qdev_get_machine(), "mediaboard_filesystem", NULL);
chihiro_ide_interface_init(mediaboard_rom_file,
mediaboard_filesystem_file);
ISABus *isa_bus;
xbox_init_common(args, (uint8_t*)eeprom, &isa_bus);
xbox_init_common(machine, eeprom, NULL, &isa_bus);
isa_create_simple(isa_bus, "chihiro-lpc");
}
static void chihiro_machine_options(MachineClass *m)
{
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
static QEMUMachine chihiro_machine = {
.name = "chihiro",
.desc = "Sega Chihiro",
.init = chihiro_init,
.max_cpus = 1,
.no_floppy = 1,
.no_cdrom = 1,
.no_sdcard = 1,
PC_DEFAULT_MACHINE_OPTIONS
m->desc = "Sega Chihiro";
m->max_cpus = 1;
m->option_rom_has_mr = true;
m->rom_file_has_mr = false;
m->no_floppy = 1,
m->no_cdrom = 1,
m->no_sdcard = 1,
m->default_cpu_type = X86_CPU_TYPE_NAME("486");
pcmc->pci_enabled = true;
pcmc->has_acpi_build = false;
pcmc->smbios_defaults = false;
pcmc->gigabyte_align = false;
pcmc->smbios_legacy_mode = true;
pcmc->has_reserved_memory = false;
pcmc->default_nic_model = "nvnet";
}
static char *machine_get_mediaboard_rom(Object *obj, Error **errp)
{
ChihiroMachineState *ms = CHIHIRO_MACHINE(obj);
return g_strdup(ms->mediaboard_rom);
}
static void machine_set_mediaboard_rom(Object *obj, const char *value,
Error **errp)
{
ChihiroMachineState *ms = CHIHIRO_MACHINE(obj);
g_free(ms->mediaboard_rom);
ms->mediaboard_rom = g_strdup(value);
}
static char *machine_get_mediaboard_filesystem(Object *obj, Error **errp)
{
ChihiroMachineState *ms = CHIHIRO_MACHINE(obj);
return g_strdup(ms->mediaboard_filesystem);
}
static void machine_set_mediaboard_filesystem(Object *obj, const char *value,
Error **errp)
{
ChihiroMachineState *ms = CHIHIRO_MACHINE(obj);
g_free(ms->mediaboard_filesystem);
ms->mediaboard_filesystem = g_strdup(value);
}
static inline void chihiro_machine_initfn(Object *obj)
{
object_property_add_str(obj, "mediaboard_rom",
machine_get_mediaboard_rom,
machine_set_mediaboard_rom, NULL);
object_property_set_description(obj, "mediaboard_rom",
"Chihiro mediaboard ROM", NULL);
object_property_add_str(obj, "mediaboard_filesystem",
machine_get_mediaboard_filesystem,
machine_set_mediaboard_filesystem, NULL);
object_property_set_description(obj, "mediaboard_filesystem",
"Chihiro mediaboard filesystem", NULL);
}
static void chihiro_machine_class_init(ObjectClass *oc, void *data)
{
MachineClass *mc = MACHINE_CLASS(oc);
chihiro_machine_options(mc);
mc->init = chihiro_init;
}
static const TypeInfo pc_machine_type_chihiro = {
.name = TYPE_CHIHIRO_MACHINE,
.parent = TYPE_PC_MACHINE,
.abstract = false,
.instance_size = sizeof(ChihiroMachineState),
.instance_init = chihiro_machine_initfn,
.class_size = sizeof(ChihiroMachineClass),
.class_init = chihiro_machine_class_init,
.interfaces = (InterfaceInfo[]) {
// { TYPE_HOTPLUG_HANDLER },
// { TYPE_NMI },
{ }
},
};
static void chihiro_machine_init(void) {
qemu_register_machine(&chihiro_machine);
static void pc_machine_init_chihiro(void)
{
type_register(&pc_machine_type_chihiro);
}
machine_init(chihiro_machine_init);
type_init(pc_machine_init_chihiro)