qemu/hw/mips/mips_malta.c
<<
>>
Prefs
   1/*
   2 * QEMU Malta board support
   3 *
   4 * Copyright (c) 2006 Aurelien Jarno
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a copy
   7 * of this software and associated documentation files (the "Software"), to deal
   8 * in the Software without restriction, including without limitation the rights
   9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 * copies of the Software, and to permit persons to whom the Software is
  11 * furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 * THE SOFTWARE.
  23 */
  24
  25#include "hw/hw.h"
  26#include "hw/i386/pc.h"
  27#include "hw/char/serial.h"
  28#include "hw/block/fdc.h"
  29#include "net/net.h"
  30#include "hw/boards.h"
  31#include "hw/i2c/smbus.h"
  32#include "block/block.h"
  33#include "hw/block/flash.h"
  34#include "hw/mips/mips.h"
  35#include "hw/mips/cpudevs.h"
  36#include "hw/pci/pci.h"
  37#include "sysemu/char.h"
  38#include "sysemu/sysemu.h"
  39#include "sysemu/arch_init.h"
  40#include "qemu/log.h"
  41#include "hw/mips/bios.h"
  42#include "hw/ide.h"
  43#include "hw/loader.h"
  44#include "elf.h"
  45#include "hw/timer/mc146818rtc.h"
  46#include "hw/timer/i8254.h"
  47#include "sysemu/blockdev.h"
  48#include "exec/address-spaces.h"
  49#include "hw/sysbus.h"             /* SysBusDevice */
  50#include "qemu/host-utils.h"
  51#include "sysemu/qtest.h"
  52#include "qemu/error-report.h"
  53#include "hw/empty_slot.h"
  54#include "sysemu/kvm.h"
  55
  56//#define DEBUG_BOARD_INIT
  57
  58#define ENVP_ADDR               0x80002000l
  59#define ENVP_NB_ENTRIES         16
  60#define ENVP_ENTRY_SIZE         256
  61
  62/* Hardware addresses */
  63#define FLASH_ADDRESS 0x1e000000ULL
  64#define FPGA_ADDRESS  0x1f000000ULL
  65#define RESET_ADDRESS 0x1fc00000ULL
  66
  67#define FLASH_SIZE    0x400000
  68
  69#define MAX_IDE_BUS 2
  70
  71typedef struct {
  72    MemoryRegion iomem;
  73    MemoryRegion iomem_lo; /* 0 - 0x900 */
  74    MemoryRegion iomem_hi; /* 0xa00 - 0x100000 */
  75    uint32_t leds;
  76    uint32_t brk;
  77    uint32_t gpout;
  78    uint32_t i2cin;
  79    uint32_t i2coe;
  80    uint32_t i2cout;
  81    uint32_t i2csel;
  82    CharDriverState *display;
  83    char display_text[9];
  84    SerialState *uart;
  85} MaltaFPGAState;
  86
  87#define TYPE_MIPS_MALTA "mips-malta"
  88#define MIPS_MALTA(obj) OBJECT_CHECK(MaltaState, (obj), TYPE_MIPS_MALTA)
  89
  90typedef struct {
  91    SysBusDevice parent_obj;
  92
  93    qemu_irq *i8259;
  94} MaltaState;
  95
  96static ISADevice *pit;
  97
  98static struct _loaderparams {
  99    int ram_size;
 100    const char *kernel_filename;
 101    const char *kernel_cmdline;
 102    const char *initrd_filename;
 103} loaderparams;
 104
 105/* Malta FPGA */
 106static void malta_fpga_update_display(void *opaque)
 107{
 108    char leds_text[9];
 109    int i;
 110    MaltaFPGAState *s = opaque;
 111
 112    for (i = 7 ; i >= 0 ; i--) {
 113        if (s->leds & (1 << i))
 114            leds_text[i] = '#';
 115        else
 116            leds_text[i] = ' ';
 117    }
 118    leds_text[8] = '\0';
 119
 120    qemu_chr_fe_printf(s->display, "\e[H\n\n|\e[32m%-8.8s\e[00m|\r\n", leds_text);
 121    qemu_chr_fe_printf(s->display, "\n\n\n\n|\e[31m%-8.8s\e[00m|", s->display_text);
 122}
 123
 124/*
 125 * EEPROM 24C01 / 24C02 emulation.
 126 *
 127 * Emulation for serial EEPROMs:
 128 * 24C01 - 1024 bit (128 x 8)
 129 * 24C02 - 2048 bit (256 x 8)
 130 *
 131 * Typical device names include Microchip 24C02SC or SGS Thomson ST24C02.
 132 */
 133
 134//~ #define DEBUG
 135
 136#if defined(DEBUG)
 137#  define logout(fmt, ...) fprintf(stderr, "MALTA\t%-24s" fmt, __func__, ## __VA_ARGS__)
 138#else
 139#  define logout(fmt, ...) ((void)0)
 140#endif
 141
 142struct _eeprom24c0x_t {
 143  uint8_t tick;
 144  uint8_t address;
 145  uint8_t command;
 146  uint8_t ack;
 147  uint8_t scl;
 148  uint8_t sda;
 149  uint8_t data;
 150  //~ uint16_t size;
 151  uint8_t contents[256];
 152};
 153
 154typedef struct _eeprom24c0x_t eeprom24c0x_t;
 155
 156static eeprom24c0x_t spd_eeprom = {
 157    .contents = {
 158        /* 00000000: */ 0x80,0x08,0xFF,0x0D,0x0A,0xFF,0x40,0x00,
 159        /* 00000008: */ 0x01,0x75,0x54,0x00,0x82,0x08,0x00,0x01,
 160        /* 00000010: */ 0x8F,0x04,0x02,0x01,0x01,0x00,0x00,0x00,
 161        /* 00000018: */ 0x00,0x00,0x00,0x14,0x0F,0x14,0x2D,0xFF,
 162        /* 00000020: */ 0x15,0x08,0x15,0x08,0x00,0x00,0x00,0x00,
 163        /* 00000028: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 164        /* 00000030: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 165        /* 00000038: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x12,0xD0,
 166        /* 00000040: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 167        /* 00000048: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 168        /* 00000050: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 169        /* 00000058: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 170        /* 00000060: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 171        /* 00000068: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 172        /* 00000070: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 173        /* 00000078: */ 0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xF4,
 174    },
 175};
 176
 177static void generate_eeprom_spd(uint8_t *eeprom, ram_addr_t ram_size)
 178{
 179    enum { SDR = 0x4, DDR2 = 0x8 } type;
 180    uint8_t *spd = spd_eeprom.contents;
 181    uint8_t nbanks = 0;
 182    uint16_t density = 0;
 183    int i;
 184
 185    /* work in terms of MB */
 186    ram_size >>= 20;
 187
 188    while ((ram_size >= 4) && (nbanks <= 2)) {
 189        int sz_log2 = MIN(31 - clz32(ram_size), 14);
 190        nbanks++;
 191        density |= 1 << (sz_log2 - 2);
 192        ram_size -= 1 << sz_log2;
 193    }
 194
 195    /* split to 2 banks if possible */
 196    if ((nbanks == 1) && (density > 1)) {
 197        nbanks++;
 198        density >>= 1;
 199    }
 200
 201    if (density & 0xff00) {
 202        density = (density & 0xe0) | ((density >> 8) & 0x1f);
 203        type = DDR2;
 204    } else if (!(density & 0x1f)) {
 205        type = DDR2;
 206    } else {
 207        type = SDR;
 208    }
 209
 210    if (ram_size) {
 211        fprintf(stderr, "Warning: SPD cannot represent final %dMB"
 212                " of SDRAM\n", (int)ram_size);
 213    }
 214
 215    /* fill in SPD memory information */
 216    spd[2] = type;
 217    spd[5] = nbanks;
 218    spd[31] = density;
 219
 220    /* checksum */
 221    spd[63] = 0;
 222    for (i = 0; i < 63; i++) {
 223        spd[63] += spd[i];
 224    }
 225
 226    /* copy for SMBUS */
 227    memcpy(eeprom, spd, sizeof(spd_eeprom.contents));
 228}
 229
 230static void generate_eeprom_serial(uint8_t *eeprom)
 231{
 232    int i, pos = 0;
 233    uint8_t mac[6] = { 0x00 };
 234    uint8_t sn[5] = { 0x01, 0x23, 0x45, 0x67, 0x89 };
 235
 236    /* version */
 237    eeprom[pos++] = 0x01;
 238
 239    /* count */
 240    eeprom[pos++] = 0x02;
 241
 242    /* MAC address */
 243    eeprom[pos++] = 0x01; /* MAC */
 244    eeprom[pos++] = 0x06; /* length */
 245    memcpy(&eeprom[pos], mac, sizeof(mac));
 246    pos += sizeof(mac);
 247
 248    /* serial number */
 249    eeprom[pos++] = 0x02; /* serial */
 250    eeprom[pos++] = 0x05; /* length */
 251    memcpy(&eeprom[pos], sn, sizeof(sn));
 252    pos += sizeof(sn);
 253
 254    /* checksum */
 255    eeprom[pos] = 0;
 256    for (i = 0; i < pos; i++) {
 257        eeprom[pos] += eeprom[i];
 258    }
 259}
 260
 261static uint8_t eeprom24c0x_read(eeprom24c0x_t *eeprom)
 262{
 263    logout("%u: scl = %u, sda = %u, data = 0x%02x\n",
 264        eeprom->tick, eeprom->scl, eeprom->sda, eeprom->data);
 265    return eeprom->sda;
 266}
 267
 268static void eeprom24c0x_write(eeprom24c0x_t *eeprom, int scl, int sda)
 269{
 270    if (eeprom->scl && scl && (eeprom->sda != sda)) {
 271        logout("%u: scl = %u->%u, sda = %u->%u i2c %s\n",
 272                eeprom->tick, eeprom->scl, scl, eeprom->sda, sda,
 273                sda ? "stop" : "start");
 274        if (!sda) {
 275            eeprom->tick = 1;
 276            eeprom->command = 0;
 277        }
 278    } else if (eeprom->tick == 0 && !eeprom->ack) {
 279        /* Waiting for start. */
 280        logout("%u: scl = %u->%u, sda = %u->%u wait for i2c start\n",
 281                eeprom->tick, eeprom->scl, scl, eeprom->sda, sda);
 282    } else if (!eeprom->scl && scl) {
 283        logout("%u: scl = %u->%u, sda = %u->%u trigger bit\n",
 284                eeprom->tick, eeprom->scl, scl, eeprom->sda, sda);
 285        if (eeprom->ack) {
 286            logout("\ti2c ack bit = 0\n");
 287            sda = 0;
 288            eeprom->ack = 0;
 289        } else if (eeprom->sda == sda) {
 290            uint8_t bit = (sda != 0);
 291            logout("\ti2c bit = %d\n", bit);
 292            if (eeprom->tick < 9) {
 293                eeprom->command <<= 1;
 294                eeprom->command += bit;
 295                eeprom->tick++;
 296                if (eeprom->tick == 9) {
 297                    logout("\tcommand 0x%04x, %s\n", eeprom->command,
 298                           bit ? "read" : "write");
 299                    eeprom->ack = 1;
 300                }
 301            } else if (eeprom->tick < 17) {
 302                if (eeprom->command & 1) {
 303                    sda = ((eeprom->data & 0x80) != 0);
 304                }
 305                eeprom->address <<= 1;
 306                eeprom->address += bit;
 307                eeprom->tick++;
 308                eeprom->data <<= 1;
 309                if (eeprom->tick == 17) {
 310                    eeprom->data = eeprom->contents[eeprom->address];
 311                    logout("\taddress 0x%04x, data 0x%02x\n",
 312                           eeprom->address, eeprom->data);
 313                    eeprom->ack = 1;
 314                    eeprom->tick = 0;
 315                }
 316            } else if (eeprom->tick >= 17) {
 317                sda = 0;
 318            }
 319        } else {
 320            logout("\tsda changed with raising scl\n");
 321        }
 322    } else {
 323        logout("%u: scl = %u->%u, sda = %u->%u\n", eeprom->tick, eeprom->scl,
 324               scl, eeprom->sda, sda);
 325    }
 326    eeprom->scl = scl;
 327    eeprom->sda = sda;
 328}
 329
 330static uint64_t malta_fpga_read(void *opaque, hwaddr addr,
 331                                unsigned size)
 332{
 333    MaltaFPGAState *s = opaque;
 334    uint32_t val = 0;
 335    uint32_t saddr;
 336
 337    saddr = (addr & 0xfffff);
 338
 339    switch (saddr) {
 340
 341    /* SWITCH Register */
 342    case 0x00200:
 343        val = 0x00000000;               /* All switches closed */
 344        break;
 345
 346    /* STATUS Register */
 347    case 0x00208:
 348#ifdef TARGET_WORDS_BIGENDIAN
 349        val = 0x00000012;
 350#else
 351        val = 0x00000010;
 352#endif
 353        break;
 354
 355    /* JMPRS Register */
 356    case 0x00210:
 357        val = 0x00;
 358        break;
 359
 360    /* LEDBAR Register */
 361    case 0x00408:
 362        val = s->leds;
 363        break;
 364
 365    /* BRKRES Register */
 366    case 0x00508:
 367        val = s->brk;
 368        break;
 369
 370    /* UART Registers are handled directly by the serial device */
 371
 372    /* GPOUT Register */
 373    case 0x00a00:
 374        val = s->gpout;
 375        break;
 376
 377    /* XXX: implement a real I2C controller */
 378
 379    /* GPINP Register */
 380    case 0x00a08:
 381        /* IN = OUT until a real I2C control is implemented */
 382        if (s->i2csel)
 383            val = s->i2cout;
 384        else
 385            val = 0x00;
 386        break;
 387
 388    /* I2CINP Register */
 389    case 0x00b00:
 390        val = ((s->i2cin & ~1) | eeprom24c0x_read(&spd_eeprom));
 391        break;
 392
 393    /* I2COE Register */
 394    case 0x00b08:
 395        val = s->i2coe;
 396        break;
 397
 398    /* I2COUT Register */
 399    case 0x00b10:
 400        val = s->i2cout;
 401        break;
 402
 403    /* I2CSEL Register */
 404    case 0x00b18:
 405        val = s->i2csel;
 406        break;
 407
 408    default:
 409#if 0
 410        printf ("malta_fpga_read: Bad register offset 0x" TARGET_FMT_lx "\n",
 411                addr);
 412#endif
 413        break;
 414    }
 415    return val;
 416}
 417
 418static void malta_fpga_write(void *opaque, hwaddr addr,
 419                             uint64_t val, unsigned size)
 420{
 421    MaltaFPGAState *s = opaque;
 422    uint32_t saddr;
 423
 424    saddr = (addr & 0xfffff);
 425
 426    switch (saddr) {
 427
 428    /* SWITCH Register */
 429    case 0x00200:
 430        break;
 431
 432    /* JMPRS Register */
 433    case 0x00210:
 434        break;
 435
 436    /* LEDBAR Register */
 437    case 0x00408:
 438        s->leds = val & 0xff;
 439        malta_fpga_update_display(s);
 440        break;
 441
 442    /* ASCIIWORD Register */
 443    case 0x00410:
 444        snprintf(s->display_text, 9, "%08X", (uint32_t)val);
 445        malta_fpga_update_display(s);
 446        break;
 447
 448    /* ASCIIPOS0 to ASCIIPOS7 Registers */
 449    case 0x00418:
 450    case 0x00420:
 451    case 0x00428:
 452    case 0x00430:
 453    case 0x00438:
 454    case 0x00440:
 455    case 0x00448:
 456    case 0x00450:
 457        s->display_text[(saddr - 0x00418) >> 3] = (char) val;
 458        malta_fpga_update_display(s);
 459        break;
 460
 461    /* SOFTRES Register */
 462    case 0x00500:
 463        if (val == 0x42)
 464            qemu_system_reset_request ();
 465        break;
 466
 467    /* BRKRES Register */
 468    case 0x00508:
 469        s->brk = val & 0xff;
 470        break;
 471
 472    /* UART Registers are handled directly by the serial device */
 473
 474    /* GPOUT Register */
 475    case 0x00a00:
 476        s->gpout = val & 0xff;
 477        break;
 478
 479    /* I2COE Register */
 480    case 0x00b08:
 481        s->i2coe = val & 0x03;
 482        break;
 483
 484    /* I2COUT Register */
 485    case 0x00b10:
 486        eeprom24c0x_write(&spd_eeprom, val & 0x02, val & 0x01);
 487        s->i2cout = val;
 488        break;
 489
 490    /* I2CSEL Register */
 491    case 0x00b18:
 492        s->i2csel = val & 0x01;
 493        break;
 494
 495    default:
 496#if 0
 497        printf ("malta_fpga_write: Bad register offset 0x" TARGET_FMT_lx "\n",
 498                addr);
 499#endif
 500        break;
 501    }
 502}
 503
 504static const MemoryRegionOps malta_fpga_ops = {
 505    .read = malta_fpga_read,
 506    .write = malta_fpga_write,
 507    .endianness = DEVICE_NATIVE_ENDIAN,
 508};
 509
 510static void malta_fpga_reset(void *opaque)
 511{
 512    MaltaFPGAState *s = opaque;
 513
 514    s->leds   = 0x00;
 515    s->brk    = 0x0a;
 516    s->gpout  = 0x00;
 517    s->i2cin  = 0x3;
 518    s->i2coe  = 0x0;
 519    s->i2cout = 0x3;
 520    s->i2csel = 0x1;
 521
 522    s->display_text[8] = '\0';
 523    snprintf(s->display_text, 9, "        ");
 524}
 525
 526static void malta_fpga_led_init(CharDriverState *chr)
 527{
 528    qemu_chr_fe_printf(chr, "\e[HMalta LEDBAR\r\n");
 529    qemu_chr_fe_printf(chr, "+--------+\r\n");
 530    qemu_chr_fe_printf(chr, "+        +\r\n");
 531    qemu_chr_fe_printf(chr, "+--------+\r\n");
 532    qemu_chr_fe_printf(chr, "\n");
 533    qemu_chr_fe_printf(chr, "Malta ASCII\r\n");
 534    qemu_chr_fe_printf(chr, "+--------+\r\n");
 535    qemu_chr_fe_printf(chr, "+        +\r\n");
 536    qemu_chr_fe_printf(chr, "+--------+\r\n");
 537}
 538
 539static MaltaFPGAState *malta_fpga_init(MemoryRegion *address_space,
 540         hwaddr base, qemu_irq uart_irq, CharDriverState *uart_chr)
 541{
 542    MaltaFPGAState *s;
 543
 544    s = (MaltaFPGAState *)g_malloc0(sizeof(MaltaFPGAState));
 545
 546    memory_region_init_io(&s->iomem, NULL, &malta_fpga_ops, s,
 547                          "malta-fpga", 0x100000);
 548    memory_region_init_alias(&s->iomem_lo, NULL, "malta-fpga",
 549                             &s->iomem, 0, 0x900);
 550    memory_region_init_alias(&s->iomem_hi, NULL, "malta-fpga",
 551                             &s->iomem, 0xa00, 0x10000-0xa00);
 552
 553    memory_region_add_subregion(address_space, base, &s->iomem_lo);
 554    memory_region_add_subregion(address_space, base + 0xa00, &s->iomem_hi);
 555
 556    s->display = qemu_chr_new("fpga", "vc:320x200", malta_fpga_led_init);
 557
 558    s->uart = serial_mm_init(address_space, base + 0x900, 3, uart_irq,
 559                             230400, uart_chr, DEVICE_NATIVE_ENDIAN);
 560
 561    malta_fpga_reset(s);
 562    qemu_register_reset(malta_fpga_reset, s);
 563
 564    return s;
 565}
 566
 567/* Network support */
 568static void network_init(PCIBus *pci_bus)
 569{
 570    int i;
 571
 572    for(i = 0; i < nb_nics; i++) {
 573        NICInfo *nd = &nd_table[i];
 574        const char *default_devaddr = NULL;
 575
 576        if (i == 0 && (!nd->model || strcmp(nd->model, "pcnet") == 0))
 577            /* The malta board has a PCNet card using PCI SLOT 11 */
 578            default_devaddr = "0b";
 579
 580        pci_nic_init_nofail(nd, pci_bus, "pcnet", default_devaddr);
 581    }
 582}
 583
 584/* ROM and pseudo bootloader
 585
 586   The following code implements a very very simple bootloader. It first
 587   loads the registers a0 to a3 to the values expected by the OS, and
 588   then jump at the kernel address.
 589
 590   The bootloader should pass the locations of the kernel arguments and
 591   environment variables tables. Those tables contain the 32-bit address
 592   of NULL terminated strings. The environment variables table should be
 593   terminated by a NULL address.
 594
 595   For a simpler implementation, the number of kernel arguments is fixed
 596   to two (the name of the kernel and the command line), and the two
 597   tables are actually the same one.
 598
 599   The registers a0 to a3 should contain the following values:
 600     a0 - number of kernel arguments
 601     a1 - 32-bit address of the kernel arguments table
 602     a2 - 32-bit address of the environment variables table
 603     a3 - RAM size in bytes
 604*/
 605
 606static void write_bootloader (CPUMIPSState *env, uint8_t *base,
 607                              int64_t run_addr, int64_t kernel_entry)
 608{
 609    uint32_t *p;
 610
 611    /* Small bootloader */
 612    p = (uint32_t *)base;
 613
 614    stl_p(p++, 0x08000000 |                                      /* j 0x1fc00580 */
 615                 ((run_addr + 0x580) & 0x0fffffff) >> 2);
 616    stl_p(p++, 0x00000000);                                      /* nop */
 617
 618    /* YAMON service vector */
 619    stl_p(base + 0x500, run_addr + 0x0580);      /* start: */
 620    stl_p(base + 0x504, run_addr + 0x083c);      /* print_count: */
 621    stl_p(base + 0x520, run_addr + 0x0580);      /* start: */
 622    stl_p(base + 0x52c, run_addr + 0x0800);      /* flush_cache: */
 623    stl_p(base + 0x534, run_addr + 0x0808);      /* print: */
 624    stl_p(base + 0x538, run_addr + 0x0800);      /* reg_cpu_isr: */
 625    stl_p(base + 0x53c, run_addr + 0x0800);      /* unred_cpu_isr: */
 626    stl_p(base + 0x540, run_addr + 0x0800);      /* reg_ic_isr: */
 627    stl_p(base + 0x544, run_addr + 0x0800);      /* unred_ic_isr: */
 628    stl_p(base + 0x548, run_addr + 0x0800);      /* reg_esr: */
 629    stl_p(base + 0x54c, run_addr + 0x0800);      /* unreg_esr: */
 630    stl_p(base + 0x550, run_addr + 0x0800);      /* getchar: */
 631    stl_p(base + 0x554, run_addr + 0x0800);      /* syscon_read: */
 632
 633
 634    /* Second part of the bootloader */
 635    p = (uint32_t *) (base + 0x580);
 636    stl_p(p++, 0x24040002);                                      /* addiu a0, zero, 2 */
 637    stl_p(p++, 0x3c1d0000 | (((ENVP_ADDR - 64) >> 16) & 0xffff)); /* lui sp, high(ENVP_ADDR) */
 638    stl_p(p++, 0x37bd0000 | ((ENVP_ADDR - 64) & 0xffff));        /* ori sp, sp, low(ENVP_ADDR) */
 639    stl_p(p++, 0x3c050000 | ((ENVP_ADDR >> 16) & 0xffff));       /* lui a1, high(ENVP_ADDR) */
 640    stl_p(p++, 0x34a50000 | (ENVP_ADDR & 0xffff));               /* ori a1, a1, low(ENVP_ADDR) */
 641    stl_p(p++, 0x3c060000 | (((ENVP_ADDR + 8) >> 16) & 0xffff)); /* lui a2, high(ENVP_ADDR + 8) */
 642    stl_p(p++, 0x34c60000 | ((ENVP_ADDR + 8) & 0xffff));         /* ori a2, a2, low(ENVP_ADDR + 8) */
 643    stl_p(p++, 0x3c070000 | (loaderparams.ram_size >> 16));     /* lui a3, high(ram_size) */
 644    stl_p(p++, 0x34e70000 | (loaderparams.ram_size & 0xffff));  /* ori a3, a3, low(ram_size) */
 645
 646    /* Load BAR registers as done by YAMON */
 647    stl_p(p++, 0x3c09b400);                                      /* lui t1, 0xb400 */
 648
 649#ifdef TARGET_WORDS_BIGENDIAN
 650    stl_p(p++, 0x3c08df00);                                      /* lui t0, 0xdf00 */
 651#else
 652    stl_p(p++, 0x340800df);                                      /* ori t0, r0, 0x00df */
 653#endif
 654    stl_p(p++, 0xad280068);                                      /* sw t0, 0x0068(t1) */
 655
 656    stl_p(p++, 0x3c09bbe0);                                      /* lui t1, 0xbbe0 */
 657
 658#ifdef TARGET_WORDS_BIGENDIAN
 659    stl_p(p++, 0x3c08c000);                                      /* lui t0, 0xc000 */
 660#else
 661    stl_p(p++, 0x340800c0);                                      /* ori t0, r0, 0x00c0 */
 662#endif
 663    stl_p(p++, 0xad280048);                                      /* sw t0, 0x0048(t1) */
 664#ifdef TARGET_WORDS_BIGENDIAN
 665    stl_p(p++, 0x3c084000);                                      /* lui t0, 0x4000 */
 666#else
 667    stl_p(p++, 0x34080040);                                      /* ori t0, r0, 0x0040 */
 668#endif
 669    stl_p(p++, 0xad280050);                                      /* sw t0, 0x0050(t1) */
 670
 671#ifdef TARGET_WORDS_BIGENDIAN
 672    stl_p(p++, 0x3c088000);                                      /* lui t0, 0x8000 */
 673#else
 674    stl_p(p++, 0x34080080);                                      /* ori t0, r0, 0x0080 */
 675#endif
 676    stl_p(p++, 0xad280058);                                      /* sw t0, 0x0058(t1) */
 677#ifdef TARGET_WORDS_BIGENDIAN
 678    stl_p(p++, 0x3c083f00);                                      /* lui t0, 0x3f00 */
 679#else
 680    stl_p(p++, 0x3408003f);                                      /* ori t0, r0, 0x003f */
 681#endif
 682    stl_p(p++, 0xad280060);                                      /* sw t0, 0x0060(t1) */
 683
 684#ifdef TARGET_WORDS_BIGENDIAN
 685    stl_p(p++, 0x3c08c100);                                      /* lui t0, 0xc100 */
 686#else
 687    stl_p(p++, 0x340800c1);                                      /* ori t0, r0, 0x00c1 */
 688#endif
 689    stl_p(p++, 0xad280080);                                      /* sw t0, 0x0080(t1) */
 690#ifdef TARGET_WORDS_BIGENDIAN
 691    stl_p(p++, 0x3c085e00);                                      /* lui t0, 0x5e00 */
 692#else
 693    stl_p(p++, 0x3408005e);                                      /* ori t0, r0, 0x005e */
 694#endif
 695    stl_p(p++, 0xad280088);                                      /* sw t0, 0x0088(t1) */
 696
 697    /* Jump to kernel code */
 698    stl_p(p++, 0x3c1f0000 | ((kernel_entry >> 16) & 0xffff));    /* lui ra, high(kernel_entry) */
 699    stl_p(p++, 0x37ff0000 | (kernel_entry & 0xffff));            /* ori ra, ra, low(kernel_entry) */
 700    stl_p(p++, 0x03e00008);                                      /* jr ra */
 701    stl_p(p++, 0x00000000);                                      /* nop */
 702
 703    /* YAMON subroutines */
 704    p = (uint32_t *) (base + 0x800);
 705    stl_p(p++, 0x03e00008);                                     /* jr ra */
 706    stl_p(p++, 0x24020000);                                     /* li v0,0 */
 707    /* 808 YAMON print */
 708    stl_p(p++, 0x03e06821);                                     /* move t5,ra */
 709    stl_p(p++, 0x00805821);                                     /* move t3,a0 */
 710    stl_p(p++, 0x00a05021);                                     /* move t2,a1 */
 711    stl_p(p++, 0x91440000);                                     /* lbu a0,0(t2) */
 712    stl_p(p++, 0x254a0001);                                     /* addiu t2,t2,1 */
 713    stl_p(p++, 0x10800005);                                     /* beqz a0,834 */
 714    stl_p(p++, 0x00000000);                                     /* nop */
 715    stl_p(p++, 0x0ff0021c);                                     /* jal 870 */
 716    stl_p(p++, 0x00000000);                                     /* nop */
 717    stl_p(p++, 0x08000205);                                     /* j 814 */
 718    stl_p(p++, 0x00000000);                                     /* nop */
 719    stl_p(p++, 0x01a00008);                                     /* jr t5 */
 720    stl_p(p++, 0x01602021);                                     /* move a0,t3 */
 721    /* 0x83c YAMON print_count */
 722    stl_p(p++, 0x03e06821);                                     /* move t5,ra */
 723    stl_p(p++, 0x00805821);                                     /* move t3,a0 */
 724    stl_p(p++, 0x00a05021);                                     /* move t2,a1 */
 725    stl_p(p++, 0x00c06021);                                     /* move t4,a2 */
 726    stl_p(p++, 0x91440000);                                     /* lbu a0,0(t2) */
 727    stl_p(p++, 0x0ff0021c);                                     /* jal 870 */
 728    stl_p(p++, 0x00000000);                                     /* nop */
 729    stl_p(p++, 0x254a0001);                                     /* addiu t2,t2,1 */
 730    stl_p(p++, 0x258cffff);                                     /* addiu t4,t4,-1 */
 731    stl_p(p++, 0x1580fffa);                                     /* bnez t4,84c */
 732    stl_p(p++, 0x00000000);                                     /* nop */
 733    stl_p(p++, 0x01a00008);                                     /* jr t5 */
 734    stl_p(p++, 0x01602021);                                     /* move a0,t3 */
 735    /* 0x870 */
 736    stl_p(p++, 0x3c08b800);                                     /* lui t0,0xb400 */
 737    stl_p(p++, 0x350803f8);                                     /* ori t0,t0,0x3f8 */
 738    stl_p(p++, 0x91090005);                                     /* lbu t1,5(t0) */
 739    stl_p(p++, 0x00000000);                                     /* nop */
 740    stl_p(p++, 0x31290040);                                     /* andi t1,t1,0x40 */
 741    stl_p(p++, 0x1120fffc);                                     /* beqz t1,878 <outch+0x8> */
 742    stl_p(p++, 0x00000000);                                     /* nop */
 743    stl_p(p++, 0x03e00008);                                     /* jr ra */
 744    stl_p(p++, 0xa1040000);                                     /* sb a0,0(t0) */
 745
 746}
 747
 748static void GCC_FMT_ATTR(3, 4) prom_set(uint32_t* prom_buf, int index,
 749                                        const char *string, ...)
 750{
 751    va_list ap;
 752    int32_t table_addr;
 753
 754    if (index >= ENVP_NB_ENTRIES)
 755        return;
 756
 757    if (string == NULL) {
 758        prom_buf[index] = 0;
 759        return;
 760    }
 761
 762    table_addr = sizeof(int32_t) * ENVP_NB_ENTRIES + index * ENVP_ENTRY_SIZE;
 763    prom_buf[index] = tswap32(ENVP_ADDR + table_addr);
 764
 765    va_start(ap, string);
 766    vsnprintf((char *)prom_buf + table_addr, ENVP_ENTRY_SIZE, string, ap);
 767    va_end(ap);
 768}
 769
 770/* Kernel */
 771static int64_t load_kernel (void)
 772{
 773    int64_t kernel_entry, kernel_high;
 774    long initrd_size;
 775    ram_addr_t initrd_offset;
 776    int big_endian;
 777    uint32_t *prom_buf;
 778    long prom_size;
 779    int prom_index = 0;
 780    uint64_t (*xlate_to_kseg0) (void *opaque, uint64_t addr);
 781
 782#ifdef TARGET_WORDS_BIGENDIAN
 783    big_endian = 1;
 784#else
 785    big_endian = 0;
 786#endif
 787
 788    if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
 789                 (uint64_t *)&kernel_entry, NULL, (uint64_t *)&kernel_high,
 790                 big_endian, ELF_MACHINE, 1) < 0) {
 791        fprintf(stderr, "qemu: could not load kernel '%s'\n",
 792                loaderparams.kernel_filename);
 793        exit(1);
 794    }
 795
 796    /* Sanity check where the kernel has been linked */
 797    if (kvm_enabled()) {
 798        if (kernel_entry & 0x80000000ll) {
 799            error_report("KVM guest kernels must be linked in useg. "
 800                         "Did you forget to enable CONFIG_KVM_GUEST?");
 801            exit(1);
 802        }
 803
 804        xlate_to_kseg0 = cpu_mips_kvm_um_phys_to_kseg0;
 805    } else {
 806        if (!(kernel_entry & 0x80000000ll)) {
 807            error_report("KVM guest kernels aren't supported with TCG. "
 808                         "Did you unintentionally enable CONFIG_KVM_GUEST?");
 809            exit(1);
 810        }
 811
 812        xlate_to_kseg0 = cpu_mips_phys_to_kseg0;
 813    }
 814
 815    /* load initrd */
 816    initrd_size = 0;
 817    initrd_offset = 0;
 818    if (loaderparams.initrd_filename) {
 819        initrd_size = get_image_size (loaderparams.initrd_filename);
 820        if (initrd_size > 0) {
 821            initrd_offset = (kernel_high + ~INITRD_PAGE_MASK) & INITRD_PAGE_MASK;
 822            if (initrd_offset + initrd_size > ram_size) {
 823                fprintf(stderr,
 824                        "qemu: memory too small for initial ram disk '%s'\n",
 825                        loaderparams.initrd_filename);
 826                exit(1);
 827            }
 828            initrd_size = load_image_targphys(loaderparams.initrd_filename,
 829                                              initrd_offset,
 830                                              ram_size - initrd_offset);
 831        }
 832        if (initrd_size == (target_ulong) -1) {
 833            fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
 834                    loaderparams.initrd_filename);
 835            exit(1);
 836        }
 837    }
 838
 839    /* Setup prom parameters. */
 840    prom_size = ENVP_NB_ENTRIES * (sizeof(int32_t) + ENVP_ENTRY_SIZE);
 841    prom_buf = g_malloc(prom_size);
 842
 843    prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_filename);
 844    if (initrd_size > 0) {
 845        prom_set(prom_buf, prom_index++, "rd_start=0x%" PRIx64 " rd_size=%li %s",
 846                 xlate_to_kseg0(NULL, initrd_offset), initrd_size,
 847                 loaderparams.kernel_cmdline);
 848    } else {
 849        prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_cmdline);
 850    }
 851
 852    prom_set(prom_buf, prom_index++, "memsize");
 853    prom_set(prom_buf, prom_index++, "%i",
 854             MIN(loaderparams.ram_size, 256 << 20));
 855
 856    prom_set(prom_buf, prom_index++, "modetty0");
 857    prom_set(prom_buf, prom_index++, "38400n8r");
 858    prom_set(prom_buf, prom_index++, NULL);
 859
 860    rom_add_blob_fixed("prom", prom_buf, prom_size,
 861                       cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR));
 862
 863    return kernel_entry;
 864}
 865
 866static void malta_mips_config(MIPSCPU *cpu)
 867{
 868    CPUMIPSState *env = &cpu->env;
 869    CPUState *cs = CPU(cpu);
 870
 871    env->mvp->CP0_MVPConf0 |= ((smp_cpus - 1) << CP0MVPC0_PVPE) |
 872                         ((smp_cpus * cs->nr_threads - 1) << CP0MVPC0_PTC);
 873}
 874
 875static void main_cpu_reset(void *opaque)
 876{
 877    MIPSCPU *cpu = opaque;
 878    CPUMIPSState *env = &cpu->env;
 879
 880    cpu_reset(CPU(cpu));
 881
 882    /* The bootloader does not need to be rewritten as it is located in a
 883       read only location. The kernel location and the arguments table
 884       location does not change. */
 885    if (loaderparams.kernel_filename) {
 886        env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
 887    }
 888
 889    malta_mips_config(cpu);
 890
 891    if (kvm_enabled()) {
 892        /* Start running from the bootloader we wrote to end of RAM */
 893        env->active_tc.PC = 0x40000000 + loaderparams.ram_size;
 894    }
 895}
 896
 897static void cpu_request_exit(void *opaque, int irq, int level)
 898{
 899    CPUState *cpu = current_cpu;
 900
 901    if (cpu && level) {
 902        cpu_exit(cpu);
 903    }
 904}
 905
 906static
 907void mips_malta_init(MachineState *machine)
 908{
 909    ram_addr_t ram_size = machine->ram_size;
 910    ram_addr_t ram_low_size;
 911    const char *cpu_model = machine->cpu_model;
 912    const char *kernel_filename = machine->kernel_filename;
 913    const char *kernel_cmdline = machine->kernel_cmdline;
 914    const char *initrd_filename = machine->initrd_filename;
 915    char *filename;
 916    pflash_t *fl;
 917    MemoryRegion *system_memory = get_system_memory();
 918    MemoryRegion *ram_high = g_new(MemoryRegion, 1);
 919    MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1);
 920    MemoryRegion *ram_low_postio;
 921    MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1);
 922    target_long bios_size = FLASH_SIZE;
 923    const size_t smbus_eeprom_size = 8 * 256;
 924    uint8_t *smbus_eeprom_buf = g_malloc0(smbus_eeprom_size);
 925    int64_t kernel_entry, bootloader_run_addr;
 926    PCIBus *pci_bus;
 927    ISABus *isa_bus;
 928    MIPSCPU *cpu;
 929    CPUMIPSState *env;
 930    qemu_irq *isa_irq;
 931    qemu_irq *cpu_exit_irq;
 932    int piix4_devfn;
 933    I2CBus *smbus;
 934    int i;
 935    DriveInfo *dinfo;
 936    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
 937    DriveInfo *fd[MAX_FD];
 938    int fl_idx = 0;
 939    int fl_sectors = bios_size >> 16;
 940    int be;
 941
 942    DeviceState *dev = qdev_create(NULL, TYPE_MIPS_MALTA);
 943    MaltaState *s = MIPS_MALTA(dev);
 944
 945    /* The whole address space decoded by the GT-64120A doesn't generate
 946       exception when accessing invalid memory. Create an empty slot to
 947       emulate this feature. */
 948    empty_slot_init(0, 0x20000000);
 949
 950    qdev_init_nofail(dev);
 951
 952    /* Make sure the first 3 serial ports are associated with a device. */
 953    for(i = 0; i < 3; i++) {
 954        if (!serial_hds[i]) {
 955            char label[32];
 956            snprintf(label, sizeof(label), "serial%d", i);
 957            serial_hds[i] = qemu_chr_new(label, "null", NULL);
 958        }
 959    }
 960
 961    /* init CPUs */
 962    if (cpu_model == NULL) {
 963#ifdef TARGET_MIPS64
 964        cpu_model = "20Kc";
 965#else
 966        cpu_model = "24Kf";
 967#endif
 968    }
 969
 970    for (i = 0; i < smp_cpus; i++) {
 971        cpu = cpu_mips_init(cpu_model);
 972        if (cpu == NULL) {
 973            fprintf(stderr, "Unable to find CPU definition\n");
 974            exit(1);
 975        }
 976        env = &cpu->env;
 977
 978        /* Init internal devices */
 979        cpu_mips_irq_init_cpu(env);
 980        cpu_mips_clock_init(env);
 981        qemu_register_reset(main_cpu_reset, cpu);
 982    }
 983    cpu = MIPS_CPU(first_cpu);
 984    env = &cpu->env;
 985
 986    /* allocate RAM */
 987    if (ram_size > (2048u << 20)) {
 988        fprintf(stderr,
 989                "qemu: Too much memory for this machine: %d MB, maximum 2048 MB\n",
 990                ((unsigned int)ram_size / (1 << 20)));
 991        exit(1);
 992    }
 993
 994    /* register RAM at high address where it is undisturbed by IO */
 995    memory_region_init_ram(ram_high, NULL, "mips_malta.ram", ram_size);
 996    vmstate_register_ram_global(ram_high);
 997    memory_region_add_subregion(system_memory, 0x80000000, ram_high);
 998
 999    /* alias for pre IO hole access */
1000    memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
1001                             ram_high, 0, MIN(ram_size, (256 << 20)));
1002    memory_region_add_subregion(system_memory, 0, ram_low_preio);
1003
1004    /* alias for post IO hole access, if there is enough RAM */
1005    if (ram_size > (512 << 20)) {
1006        ram_low_postio = g_new(MemoryRegion, 1);
1007        memory_region_init_alias(ram_low_postio, NULL,
1008                                 "mips_malta_low_postio.ram",
1009                                 ram_high, 512 << 20,
1010                                 ram_size - (512 << 20));
1011        memory_region_add_subregion(system_memory, 512 << 20, ram_low_postio);
1012    }
1013
1014    /* generate SPD EEPROM data */
1015    generate_eeprom_spd(&smbus_eeprom_buf[0 * 256], ram_size);
1016    generate_eeprom_serial(&smbus_eeprom_buf[6 * 256]);
1017
1018#ifdef TARGET_WORDS_BIGENDIAN
1019    be = 1;
1020#else
1021    be = 0;
1022#endif
1023    /* FPGA */
1024    /* The CBUS UART is attached to the MIPS CPU INT2 pin, ie interrupt 4 */
1025    malta_fpga_init(system_memory, FPGA_ADDRESS, env->irq[4], serial_hds[2]);
1026
1027    /* Load firmware in flash / BIOS. */
1028    dinfo = drive_get(IF_PFLASH, 0, fl_idx);
1029#ifdef DEBUG_BOARD_INIT
1030    if (dinfo) {
1031        printf("Register parallel flash %d size " TARGET_FMT_lx " at "
1032               "addr %08llx '%s' %x\n",
1033               fl_idx, bios_size, FLASH_ADDRESS,
1034               bdrv_get_device_name(dinfo->bdrv), fl_sectors);
1035    }
1036#endif
1037    fl = pflash_cfi01_register(FLASH_ADDRESS, NULL, "mips_malta.bios",
1038                               BIOS_SIZE, dinfo ? dinfo->bdrv : NULL,
1039                               65536, fl_sectors,
1040                               4, 0x0000, 0x0000, 0x0000, 0x0000, be);
1041    bios = pflash_cfi01_get_memory(fl);
1042    fl_idx++;
1043    if (kernel_filename) {
1044        ram_low_size = MIN(ram_size, 256 << 20);
1045        /* For KVM we reserve 1MB of RAM for running bootloader */
1046        if (kvm_enabled()) {
1047            ram_low_size -= 0x100000;
1048            bootloader_run_addr = 0x40000000 + ram_low_size;
1049        } else {
1050            bootloader_run_addr = 0xbfc00000;
1051        }
1052
1053        /* Write a small bootloader to the flash location. */
1054        loaderparams.ram_size = ram_low_size;
1055        loaderparams.kernel_filename = kernel_filename;
1056        loaderparams.kernel_cmdline = kernel_cmdline;
1057        loaderparams.initrd_filename = initrd_filename;
1058        kernel_entry = load_kernel();
1059
1060        write_bootloader(env, memory_region_get_ram_ptr(bios),
1061                         bootloader_run_addr, kernel_entry);
1062        if (kvm_enabled()) {
1063            /* Write the bootloader code @ the end of RAM, 1MB reserved */
1064            write_bootloader(env, memory_region_get_ram_ptr(ram_low_preio) +
1065                                    ram_low_size,
1066                             bootloader_run_addr, kernel_entry);
1067        }
1068    } else {
1069        /* The flash region isn't executable from a KVM guest */
1070        if (kvm_enabled()) {
1071            error_report("KVM enabled but no -kernel argument was specified. "
1072                         "Booting from flash is not supported with KVM.");
1073            exit(1);
1074        }
1075        /* Load firmware from flash. */
1076        if (!dinfo) {
1077            /* Load a BIOS image. */
1078            if (bios_name == NULL) {
1079                bios_name = BIOS_FILENAME;
1080            }
1081            filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
1082            if (filename) {
1083                bios_size = load_image_targphys(filename, FLASH_ADDRESS,
1084                                                BIOS_SIZE);
1085                g_free(filename);
1086            } else {
1087                bios_size = -1;
1088            }
1089            if ((bios_size < 0 || bios_size > BIOS_SIZE) &&
1090                !kernel_filename && !qtest_enabled()) {
1091                error_report("Could not load MIPS bios '%s', and no "
1092                             "-kernel argument was specified", bios_name);
1093                exit(1);
1094            }
1095        }
1096        /* In little endian mode the 32bit words in the bios are swapped,
1097           a neat trick which allows bi-endian firmware. */
1098#ifndef TARGET_WORDS_BIGENDIAN
1099        {
1100            uint32_t *end, *addr = rom_ptr(FLASH_ADDRESS);
1101            if (!addr) {
1102                addr = memory_region_get_ram_ptr(bios);
1103            }
1104            end = (void *)addr + MIN(bios_size, 0x3e0000);
1105            while (addr < end) {
1106                bswap32s(addr);
1107                addr++;
1108            }
1109        }
1110#endif
1111    }
1112
1113    /*
1114     * Map the BIOS at a 2nd physical location, as on the real board.
1115     * Copy it so that we can patch in the MIPS revision, which cannot be
1116     * handled by an overlapping region as the resulting ROM code subpage
1117     * regions are not executable.
1118     */
1119    memory_region_init_ram(bios_copy, NULL, "bios.1fc", BIOS_SIZE);
1120    if (!rom_copy(memory_region_get_ram_ptr(bios_copy),
1121                  FLASH_ADDRESS, BIOS_SIZE)) {
1122        memcpy(memory_region_get_ram_ptr(bios_copy),
1123               memory_region_get_ram_ptr(bios), BIOS_SIZE);
1124    }
1125    memory_region_set_readonly(bios_copy, true);
1126    memory_region_add_subregion(system_memory, RESET_ADDRESS, bios_copy);
1127
1128    /* Board ID = 0x420 (Malta Board with CoreLV) */
1129    stl_p(memory_region_get_ram_ptr(bios_copy) + 0x10, 0x00000420);
1130
1131    /* Init internal devices */
1132    cpu_mips_irq_init_cpu(env);
1133    cpu_mips_clock_init(env);
1134
1135    /*
1136     * We have a circular dependency problem: pci_bus depends on isa_irq,
1137     * isa_irq is provided by i8259, i8259 depends on ISA, ISA depends
1138     * on piix4, and piix4 depends on pci_bus.  To stop the cycle we have
1139     * qemu_irq_proxy() adds an extra bit of indirection, allowing us
1140     * to resolve the isa_irq -> i8259 dependency after i8259 is initialized.
1141     */
1142    isa_irq = qemu_irq_proxy(&s->i8259, 16);
1143
1144    /* Northbridge */
1145    pci_bus = gt64120_register(isa_irq);
1146
1147    /* Southbridge */
1148    ide_drive_get(hd, MAX_IDE_BUS);
1149
1150    piix4_devfn = piix4_init(pci_bus, &isa_bus, 80);
1151
1152    /* Interrupt controller */
1153    /* The 8259 is attached to the MIPS CPU INT0 pin, ie interrupt 2 */
1154    s->i8259 = i8259_init(isa_bus, env->irq[2]);
1155
1156    isa_bus_irqs(isa_bus, s->i8259);
1157    pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
1158    pci_create_simple(pci_bus, piix4_devfn + 2, "piix4-usb-uhci");
1159    smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100,
1160                          isa_get_irq(NULL, 9), NULL, 0, NULL, NULL);
1161    smbus_eeprom_init(smbus, 8, smbus_eeprom_buf, smbus_eeprom_size);
1162    g_free(smbus_eeprom_buf);
1163    pit = pit_init(isa_bus, 0x40, 0, NULL);
1164    cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
1165    DMA_init(0, cpu_exit_irq);
1166
1167    /* Super I/O */
1168    isa_create_simple(isa_bus, "i8042");
1169
1170    rtc_init(isa_bus, 2000, NULL);
1171    serial_isa_init(isa_bus, 0, serial_hds[0]);
1172    serial_isa_init(isa_bus, 1, serial_hds[1]);
1173    if (parallel_hds[0])
1174        parallel_init(isa_bus, 0, parallel_hds[0]);
1175    for(i = 0; i < MAX_FD; i++) {
1176        fd[i] = drive_get(IF_FLOPPY, 0, i);
1177    }
1178    fdctrl_init_isa(isa_bus, fd);
1179
1180    /* Network card */
1181    network_init(pci_bus);
1182
1183    /* Optional PCI video card */
1184    pci_vga_init(pci_bus);
1185}
1186
1187static int mips_malta_sysbus_device_init(SysBusDevice *sysbusdev)
1188{
1189    return 0;
1190}
1191
1192static void mips_malta_class_init(ObjectClass *klass, void *data)
1193{
1194    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
1195
1196    k->init = mips_malta_sysbus_device_init;
1197}
1198
1199static const TypeInfo mips_malta_device = {
1200    .name          = TYPE_MIPS_MALTA,
1201    .parent        = TYPE_SYS_BUS_DEVICE,
1202    .instance_size = sizeof(MaltaState),
1203    .class_init    = mips_malta_class_init,
1204};
1205
1206static QEMUMachine mips_malta_machine = {
1207    .name = "malta",
1208    .desc = "MIPS Malta Core LV",
1209    .init = mips_malta_init,
1210    .max_cpus = 16,
1211    .is_default = 1,
1212};
1213
1214static void mips_malta_register_types(void)
1215{
1216    type_register_static(&mips_malta_device);
1217}
1218
1219static void mips_malta_machine_init(void)
1220{
1221    qemu_register_machine(&mips_malta_machine);
1222}
1223
1224type_init(mips_malta_register_types)
1225machine_init(mips_malta_machine_init);
1226