X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hw%2Fpc.c;h=c561cbf2e6d23d9a8294a22126c5050c517a4666;hb=cd346349b45ef056f138a184f660b8c34c3213cc;hp=388d657294e1c701664f83015f482cf16d6fe7cd;hpb=3f6c925f37cd8a1dddb8a8fbbcef4630ea347775;p=qemu diff --git a/hw/pc.c b/hw/pc.c index 388d657..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 @@ -65,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(); @@ -89,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; } @@ -100,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 */ @@ -134,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; @@ -182,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': @@ -197,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 */ @@ -206,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) @@ -232,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; @@ -291,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: @@ -401,7 +405,7 @@ static void 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; @@ -417,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; @@ -692,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 */ @@ -702,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; } @@ -723,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); @@ -735,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); { @@ -756,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); } @@ -777,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) @@ -803,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) { @@ -818,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); } } @@ -865,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); @@ -892,7 +904,7 @@ 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) { @@ -900,12 +912,12 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, i2c_bus *smbus; /* TODO: Populate SPD eeprom data. */ - smbus = piix4_pm_init(pci_bus, piix3_devfn + 3); + smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100); for (i = 0; i < 8; 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)