X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hw%2Fpc.c;h=c561cbf2e6d23d9a8294a22126c5050c517a4666;hb=cd346349b45ef056f138a184f660b8c34c3213cc;hp=89e93e83f085e9c987f862a2dc2a9658b0e0c6fa;hpb=642a4f967f69a86bd59ad7c7d0adf8e80d0b4b54;p=qemu diff --git a/hw/pc.c b/hw/pc.c index 89e93e8..c561cbf 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -1,8 +1,8 @@ /* * QEMU PC System Emulator - * + * * Copyright (c) 2003-2004 Fabrice Bellard - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights @@ -29,7 +29,6 @@ #define BIOS_FILENAME "bios.bin" #define VGABIOS_FILENAME "vgabios.bin" #define VGABIOS_CIRRUS_FILENAME "vgabios-cirrus.bin" -#define LINUX_BOOT_FILENAME "linux_boot.bin" /* Leave a chunk of memory at the top of RAM for the BIOS ACPI tables. */ #define ACPI_DATA_SIZE 0x10000 @@ -66,7 +65,7 @@ uint64_t cpu_get_tsc(CPUX86State *env) #if USE_KQEMU if (env->kqemu_enabled) { return cpu_get_real_ticks(); - } else + } else #endif { return cpu_get_ticks(); @@ -90,10 +89,13 @@ int cpu_get_pic_interrupt(CPUState *env) if (intno >= 0) { /* set irq request if a PIC irq is still pending */ /* XXX: improve that */ - pic_update_irq(isa_pic); + pic_update_irq(isa_pic); return intno; } /* read the irq from the PIC */ + if (!apic_accept_pic_intr(env)) + return -1; + intno = pic_read_irq(isa_pic); return intno; } @@ -101,10 +103,8 @@ int cpu_get_pic_interrupt(CPUState *env) static void pic_irq_request(void *opaque, int irq, int level) { CPUState *env = opaque; - if (level) + if (level && apic_accept_pic_intr(env)) cpu_interrupt(env, CPU_INTERRUPT_HARD); - else - cpu_reset_interrupt(env, CPU_INTERRUPT_HARD); } /* PC cmos mappings */ @@ -135,7 +135,7 @@ static int cmos_get_fd_drive_type(int fd0) return val; } -static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd) +static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd) { RTCState *s = rtc_state; int cylinders, heads, sectors; @@ -183,7 +183,7 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table val = 65535; rtc_set_memory(s, 0x34, val); rtc_set_memory(s, 0x35, val >> 8); - + switch(boot_device) { case 'a': case 'b': @@ -198,6 +198,9 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table case 'd': rtc_set_memory(s, 0x3d, 0x03); /* CD-ROM boot */ break; + case 'n': + rtc_set_memory(s, 0x3d, 0x04); /* Network boot */ + break; } /* floppy type */ @@ -207,7 +210,7 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table val = (cmos_get_fd_drive_type(fd0) << 4) | cmos_get_fd_drive_type(fd1); rtc_set_memory(s, 0x10, val); - + val = 0; nb = 0; if (fd0 < 3) @@ -233,7 +236,7 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table rtc_set_memory(s, 0x12, (hd_table[0] ? 0xf0 : 0) | (hd_table[1] ? 0x0f : 0)); if (hd_table[0]) cmos_init_hd(0x19, 0x1b, hd_table[0]); - if (hd_table[1]) + if (hd_table[1]) cmos_init_hd(0x1a, 0x24, hd_table[1]); val = 0; @@ -292,7 +295,7 @@ void bochs_bios_write(void *opaque, uint32_t addr, uint32_t val) { static const char shutdown_str[8] = "Shutdown"; static int shutdown_index = 0; - + switch(addr) { /* Bochs BIOS messages */ case 0x400: @@ -348,7 +351,7 @@ void bochs_bios_init(void) /* Generate an initial boot sector which sets state and jump to a specified vector */ -static int generate_bootsect(uint32_t gpr[8], uint16_t segs[6], uint16_t ip) +static void generate_bootsect(uint32_t gpr[8], uint16_t segs[6], uint16_t ip) { uint8_t bootsect[512], *p; int i; @@ -402,7 +405,7 @@ static int generate_bootsect(uint32_t gpr[8], uint16_t segs[6], uint16_t ip) bdrv_set_boot_sector(bs_table[0], bootsect, sizeof(bootsect)); } -int load_kernel(const char *filename, uint8_t *addr, +int load_kernel(const char *filename, uint8_t *addr, uint8_t *real_addr) { int fd, size; @@ -418,7 +421,7 @@ int load_kernel(const char *filename, uint8_t *addr, setup_sects = real_addr[0x1F1]; if (!setup_sects) setup_sects = 4; - if (read(fd, real_addr + 512, setup_sects * 512) != + if (read(fd, real_addr + 512, setup_sects * 512) != setup_sects * 512) goto fail; @@ -693,6 +696,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, if (pci_enabled) { apic_init(env); } + vmport_init(env); } /* allocate RAM */ @@ -703,9 +707,11 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, vga_ram_addr = qemu_ram_alloc(vga_ram_size); /* BIOS load */ - snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME); + if (bios_name == NULL) + bios_name = BIOS_FILENAME; + snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); bios_size = get_image_size(buf); - if (bios_size <= 0 || + if (bios_size <= 0 || (bios_size % 65536) != 0) { goto bios_error; } @@ -724,7 +730,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME); } vga_bios_size = get_image_size(buf); - if (vga_bios_size <= 0 || vga_bios_size > 65536) + if (vga_bios_size <= 0 || vga_bios_size > 65536) goto vga_bios_error; vga_bios_offset = qemu_ram_alloc(65536); @@ -736,17 +742,17 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, } /* setup basic memory access */ - cpu_register_physical_memory(0xc0000, 0x10000, + cpu_register_physical_memory(0xc0000, 0x10000, vga_bios_offset | IO_MEM_ROM); /* map the last 128KB of the BIOS in ISA space */ isa_bios_size = bios_size; if (isa_bios_size > (128 * 1024)) isa_bios_size = 128 * 1024; - cpu_register_physical_memory(0xd0000, (192 * 1024) - isa_bios_size, + cpu_register_physical_memory(0xd0000, (192 * 1024) - isa_bios_size, IO_MEM_UNASSIGNED); - cpu_register_physical_memory(0x100000 - isa_bios_size, - isa_bios_size, + cpu_register_physical_memory(0x100000 - isa_bios_size, + isa_bios_size, (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM); { @@ -757,7 +763,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, for (i = 0; i < nb_option_roms; i++) { size = get_image_size(option_rom[i]); if (size < 0) { - fprintf(stderr, "Could not load option rom '%s'\n", + fprintf(stderr, "Could not load option rom '%s'\n", option_rom[i]); exit(1); } @@ -778,9 +784,9 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, } /* map all the bios at the top of memory */ - cpu_register_physical_memory((uint32_t)(-bios_size), + cpu_register_physical_memory((uint32_t)(-bios_size), bios_size, bios_offset | IO_MEM_ROM); - + bochs_bios_init(); if (linux_boot) @@ -804,11 +810,11 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, if (cirrus_vga_enabled) { if (pci_enabled) { - pci_cirrus_vga_init(pci_bus, - ds, phys_ram_base + vga_ram_addr, + pci_cirrus_vga_init(pci_bus, + ds, phys_ram_base + vga_ram_addr, vga_ram_addr, vga_ram_size); } else { - isa_cirrus_vga_init(ds, phys_ram_base + vga_ram_addr, + isa_cirrus_vga_init(ds, phys_ram_base + vga_ram_addr, vga_ram_addr, vga_ram_size); } } else if (vmsvga_enabled) { @@ -819,10 +825,10 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__); } else { if (pci_enabled) { - pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_addr, + pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_addr, vga_ram_addr, vga_ram_size, 0, 0); } else { - isa_vga_init(ds, phys_ram_base + vga_ram_addr, + isa_vga_init(ds, phys_ram_base + vga_ram_addr, vga_ram_addr, vga_ram_size); } } @@ -866,7 +872,12 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, if (strcmp(nd->model, "ne2k_isa") == 0) { pc_init_ne2k_isa(nd, i8259); } else if (pci_enabled) { + if (strcmp(nd->model, "?") == 0) + fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n"); pci_nic_init(pci_bus, nd, -1); + } else if (strcmp(nd->model, "?") == 0) { + fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n"); + exit(1); } else { fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd->model); exit(1); @@ -893,19 +904,20 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, cmos_init(ram_size, boot_device, bs_table); if (pci_enabled && usb_enabled) { - usb_uhci_init(pci_bus, piix3_devfn + 2); + usb_uhci_piix3_init(pci_bus, piix3_devfn + 2); } if (pci_enabled && acpi_enabled) { uint8_t *eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */ - piix4_pm_init(pci_bus, piix3_devfn + 3); + i2c_bus *smbus; + + /* TODO: Populate SPD eeprom data. */ + smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100); for (i = 0; i < 8; i++) { - SMBusDevice *eeprom = smbus_eeprom_device_init(0x50 + i, - eeprom_buf + (i * 256)); - piix4_smbus_register_device(eeprom, 0x50 + i); + smbus_eeprom_device_init(smbus, 0x50 + i, eeprom_buf + (i * 256)); } } - + if (i440fx_state) { i440fx_init_memory_mappings(i440fx_state); } @@ -929,9 +941,9 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, } static void pc_init_pci(int ram_size, int vga_ram_size, int boot_device, - DisplayState *ds, const char **fd_filename, - int snapshot, - const char *kernel_filename, + DisplayState *ds, const char **fd_filename, + int snapshot, + const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model) @@ -943,9 +955,9 @@ static void pc_init_pci(int ram_size, int vga_ram_size, int boot_device, } static void pc_init_isa(int ram_size, int vga_ram_size, int boot_device, - DisplayState *ds, const char **fd_filename, - int snapshot, - const char *kernel_filename, + DisplayState *ds, const char **fd_filename, + int snapshot, + const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model)