cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

next-cube.c (29934B)


      1/*
      2 * NeXT Cube System Driver
      3 *
      4 * Copyright (c) 2011 Bryce Lanham
      5 *
      6 * This code is free software; you can redistribute it and/or modify
      7 * it under the terms of the GNU General Public License as published
      8 * by the Free Software Foundation; either version 2 of the License,
      9 * or (at your option) any later version.
     10 */
     11
     12#include "qemu/osdep.h"
     13#include "exec/hwaddr.h"
     14#include "sysemu/sysemu.h"
     15#include "sysemu/qtest.h"
     16#include "hw/irq.h"
     17#include "hw/m68k/next-cube.h"
     18#include "hw/boards.h"
     19#include "hw/loader.h"
     20#include "hw/scsi/esp.h"
     21#include "hw/sysbus.h"
     22#include "qom/object.h"
     23#include "hw/char/escc.h" /* ZILOG 8530 Serial Emulation */
     24#include "hw/block/fdc.h"
     25#include "hw/qdev-properties.h"
     26#include "qapi/error.h"
     27#include "ui/console.h"
     28#include "target/m68k/cpu.h"
     29#include "migration/vmstate.h"
     30
     31/* #define DEBUG_NEXT */
     32#ifdef DEBUG_NEXT
     33#define DPRINTF(fmt, ...) \
     34    do { printf("NeXT: " fmt , ## __VA_ARGS__); } while (0)
     35#else
     36#define DPRINTF(fmt, ...) do { } while (0)
     37#endif
     38
     39#define TYPE_NEXT_MACHINE MACHINE_TYPE_NAME("next-cube")
     40OBJECT_DECLARE_SIMPLE_TYPE(NeXTState, NEXT_MACHINE)
     41
     42#define ENTRY       0x0100001e
     43#define RAM_SIZE    0x4000000
     44#define ROM_FILE    "Rev_2.5_v66.bin"
     45
     46typedef struct next_dma {
     47    uint32_t csr;
     48
     49    uint32_t saved_next;
     50    uint32_t saved_limit;
     51    uint32_t saved_start;
     52    uint32_t saved_stop;
     53
     54    uint32_t next;
     55    uint32_t limit;
     56    uint32_t start;
     57    uint32_t stop;
     58
     59    uint32_t next_initbuf;
     60    uint32_t size;
     61} next_dma;
     62
     63typedef struct NextRtc {
     64    uint8_t ram[32];
     65    uint8_t command;
     66    uint8_t value;
     67    uint8_t status;
     68    uint8_t control;
     69    uint8_t retval;
     70} NextRtc;
     71
     72struct NeXTState {
     73    MachineState parent;
     74
     75    next_dma dma[10];
     76};
     77
     78#define TYPE_NEXT_PC "next-pc"
     79OBJECT_DECLARE_SIMPLE_TYPE(NeXTPC, NEXT_PC)
     80
     81/* NeXT Peripheral Controller */
     82struct NeXTPC {
     83    SysBusDevice parent_obj;
     84
     85    M68kCPU *cpu;
     86
     87    MemoryRegion mmiomem;
     88    MemoryRegion scrmem;
     89
     90    uint32_t scr1;
     91    uint32_t scr2;
     92    uint8_t scsi_csr_1;
     93    uint8_t scsi_csr_2;
     94    uint32_t int_mask;
     95    uint32_t int_status;
     96
     97    NextRtc rtc;
     98};
     99
    100/* Thanks to NeXT forums for this */
    101/*
    102static const uint8_t rtc_ram3[32] = {
    103    0x94, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
    104    0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x7B, 0x00,
    105    0x00, 0x00, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00,
    106    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x13
    107};
    108*/
    109static const uint8_t rtc_ram2[32] = {
    110    0x94, 0x0f, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
    111    0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x4b, 0x00,
    112    0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
    113    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e,
    114};
    115
    116#define SCR2_RTCLK 0x2
    117#define SCR2_RTDATA 0x4
    118#define SCR2_TOBCD(x) (((x / 10) << 4) + (x % 10))
    119
    120static void nextscr2_write(NeXTPC *s, uint32_t val, int size)
    121{
    122    static int led;
    123    static int phase;
    124    static uint8_t old_scr2;
    125    uint8_t scr2_2;
    126    NextRtc *rtc = &s->rtc;
    127
    128    if (size == 4) {
    129        scr2_2 = (val >> 8) & 0xFF;
    130    } else {
    131        scr2_2 = val & 0xFF;
    132    }
    133
    134    if (val & 0x1) {
    135        DPRINTF("fault!\n");
    136        led++;
    137        if (led == 10) {
    138            DPRINTF("LED flashing, possible fault!\n");
    139            led = 0;
    140        }
    141    }
    142
    143    if (scr2_2 & 0x1) {
    144        /* DPRINTF("RTC %x phase %i\n", scr2_2, phase); */
    145        if (phase == -1) {
    146            phase = 0;
    147        }
    148        /* If we are in going down clock... do something */
    149        if (((old_scr2 & SCR2_RTCLK) != (scr2_2 & SCR2_RTCLK)) &&
    150                ((scr2_2 & SCR2_RTCLK) == 0)) {
    151            if (phase < 8) {
    152                rtc->command = (rtc->command << 1) |
    153                               ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
    154            }
    155            if (phase >= 8 && phase < 16) {
    156                rtc->value = (rtc->value << 1) |
    157                             ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
    158
    159                /* if we read RAM register, output RT_DATA bit */
    160                if (rtc->command <= 0x1F) {
    161                    scr2_2 = scr2_2 & (~SCR2_RTDATA);
    162                    if (rtc->ram[rtc->command] & (0x80 >> (phase - 8))) {
    163                        scr2_2 |= SCR2_RTDATA;
    164                    }
    165
    166                    rtc->retval = (rtc->retval << 1) |
    167                                  ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
    168                }
    169                /* read the status 0x30 */
    170                if (rtc->command == 0x30) {
    171                    scr2_2 = scr2_2 & (~SCR2_RTDATA);
    172                    /* for now status = 0x98 (new rtc + FTU) */
    173                    if (rtc->status & (0x80 >> (phase - 8))) {
    174                        scr2_2 |= SCR2_RTDATA;
    175                    }
    176
    177                    rtc->retval = (rtc->retval << 1) |
    178                                  ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
    179                }
    180                /* read the status 0x31 */
    181                if (rtc->command == 0x31) {
    182                    scr2_2 = scr2_2 & (~SCR2_RTDATA);
    183                    if (rtc->control & (0x80 >> (phase - 8))) {
    184                        scr2_2 |= SCR2_RTDATA;
    185                    }
    186                    rtc->retval = (rtc->retval << 1) |
    187                                  ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
    188                }
    189
    190                if ((rtc->command >= 0x20) && (rtc->command <= 0x2F)) {
    191                    scr2_2 = scr2_2 & (~SCR2_RTDATA);
    192                    /* for now 0x00 */
    193                    time_t time_h = time(NULL);
    194                    struct tm *info = localtime(&time_h);
    195                    int ret = 0;
    196
    197                    switch (rtc->command) {
    198                    case 0x20:
    199                        ret = SCR2_TOBCD(info->tm_sec);
    200                        break;
    201                    case 0x21:
    202                        ret = SCR2_TOBCD(info->tm_min);
    203                        break;
    204                    case 0x22:
    205                        ret = SCR2_TOBCD(info->tm_hour);
    206                        break;
    207                    case 0x24:
    208                        ret = SCR2_TOBCD(info->tm_mday);
    209                        break;
    210                    case 0x25:
    211                        ret = SCR2_TOBCD((info->tm_mon + 1));
    212                        break;
    213                    case 0x26:
    214                        ret = SCR2_TOBCD((info->tm_year - 100));
    215                        break;
    216
    217                    }
    218
    219                    if (ret & (0x80 >> (phase - 8))) {
    220                        scr2_2 |= SCR2_RTDATA;
    221                    }
    222                    rtc->retval = (rtc->retval << 1) |
    223                                  ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
    224                }
    225
    226            }
    227
    228            phase++;
    229            if (phase == 16) {
    230                if (rtc->command >= 0x80 && rtc->command <= 0x9F) {
    231                    rtc->ram[rtc->command - 0x80] = rtc->value;
    232                }
    233                /* write to x30 register */
    234                if (rtc->command == 0xB1) {
    235                    /* clear FTU */
    236                    if (rtc->value & 0x04) {
    237                        rtc->status = rtc->status & (~0x18);
    238                        s->int_status = s->int_status & (~0x04);
    239                    }
    240                }
    241            }
    242        }
    243    } else {
    244        /* else end or abort */
    245        phase = -1;
    246        rtc->command = 0;
    247        rtc->value = 0;
    248    }
    249    s->scr2 = val & 0xFFFF00FF;
    250    s->scr2 |= scr2_2 << 8;
    251    old_scr2 = scr2_2;
    252}
    253
    254static uint32_t mmio_readb(NeXTPC *s, hwaddr addr)
    255{
    256    switch (addr) {
    257    case 0xc000:
    258        return (s->scr1 >> 24) & 0xFF;
    259    case 0xc001:
    260        return (s->scr1 >> 16) & 0xFF;
    261    case 0xc002:
    262        return (s->scr1 >> 8)  & 0xFF;
    263    case 0xc003:
    264        return (s->scr1 >> 0)  & 0xFF;
    265
    266    case 0xd000:
    267        return (s->scr2 >> 24) & 0xFF;
    268    case 0xd001:
    269        return (s->scr2 >> 16) & 0xFF;
    270    case 0xd002:
    271        return (s->scr2 >> 8)  & 0xFF;
    272    case 0xd003:
    273        return (s->scr2 >> 0)  & 0xFF;
    274    case 0x14020:
    275        DPRINTF("MMIO Read 0x4020\n");
    276        return 0x7f;
    277
    278    default:
    279        DPRINTF("MMIO Read B @ %"HWADDR_PRIx"\n", addr);
    280        return 0x0;
    281    }
    282}
    283
    284static uint32_t mmio_readw(NeXTPC *s, hwaddr addr)
    285{
    286    switch (addr) {
    287    default:
    288        DPRINTF("MMIO Read W @ %"HWADDR_PRIx"\n", addr);
    289        return 0x0;
    290    }
    291}
    292
    293static uint32_t mmio_readl(NeXTPC *s, hwaddr addr)
    294{
    295    switch (addr) {
    296    case 0x7000:
    297        /* DPRINTF("Read INT status: %x\n", s->int_status); */
    298        return s->int_status;
    299
    300    case 0x7800:
    301        DPRINTF("MMIO Read INT mask: %x\n", s->int_mask);
    302        return s->int_mask;
    303
    304    case 0xc000:
    305        return s->scr1;
    306
    307    case 0xd000:
    308        return s->scr2;
    309
    310    default:
    311        DPRINTF("MMIO Read L @ %"HWADDR_PRIx"\n", addr);
    312        return 0x0;
    313    }
    314}
    315
    316static void mmio_writeb(NeXTPC *s, hwaddr addr, uint32_t val)
    317{
    318    switch (addr) {
    319    case 0xd003:
    320        nextscr2_write(s, val, 1);
    321        break;
    322    default:
    323        DPRINTF("MMIO Write B @ %x with %x\n", (unsigned int)addr, val);
    324    }
    325
    326}
    327
    328static void mmio_writew(NeXTPC *s, hwaddr addr, uint32_t val)
    329{
    330    DPRINTF("MMIO Write W\n");
    331}
    332
    333static void mmio_writel(NeXTPC *s, hwaddr addr, uint32_t val)
    334{
    335    switch (addr) {
    336    case 0x7000:
    337        DPRINTF("INT Status old: %x new: %x\n", s->int_status, val);
    338        s->int_status = val;
    339        break;
    340    case 0x7800:
    341        DPRINTF("INT Mask old: %x new: %x\n", s->int_mask, val);
    342        s->int_mask  = val;
    343        break;
    344    case 0xc000:
    345        DPRINTF("SCR1 Write: %x\n", val);
    346        break;
    347    case 0xd000:
    348        nextscr2_write(s, val, 4);
    349        break;
    350
    351    default:
    352        DPRINTF("MMIO Write l @ %x with %x\n", (unsigned int)addr, val);
    353    }
    354}
    355
    356static uint64_t mmio_readfn(void *opaque, hwaddr addr, unsigned size)
    357{
    358    NeXTPC *s = NEXT_PC(opaque);
    359
    360    switch (size) {
    361    case 1:
    362        return mmio_readb(s, addr);
    363    case 2:
    364        return mmio_readw(s, addr);
    365    case 4:
    366        return mmio_readl(s, addr);
    367    default:
    368        g_assert_not_reached();
    369    }
    370}
    371
    372static void mmio_writefn(void *opaque, hwaddr addr, uint64_t value,
    373                         unsigned size)
    374{
    375    NeXTPC *s = NEXT_PC(opaque);
    376
    377    switch (size) {
    378    case 1:
    379        mmio_writeb(s, addr, value);
    380        break;
    381    case 2:
    382        mmio_writew(s, addr, value);
    383        break;
    384    case 4:
    385        mmio_writel(s, addr, value);
    386        break;
    387    default:
    388        g_assert_not_reached();
    389    }
    390}
    391
    392static const MemoryRegionOps mmio_ops = {
    393    .read = mmio_readfn,
    394    .write = mmio_writefn,
    395    .valid.min_access_size = 1,
    396    .valid.max_access_size = 4,
    397    .endianness = DEVICE_NATIVE_ENDIAN,
    398};
    399
    400static uint32_t scr_readb(NeXTPC *s, hwaddr addr)
    401{
    402    switch (addr) {
    403    case 0x14108:
    404        DPRINTF("FD read @ %x\n", (unsigned int)addr);
    405        return 0x40 | 0x04 | 0x2 | 0x1;
    406    case 0x14020:
    407        DPRINTF("SCSI 4020  STATUS READ %X\n", s->scsi_csr_1);
    408        return s->scsi_csr_1;
    409
    410    case 0x14021:
    411        DPRINTF("SCSI 4021 STATUS READ %X\n", s->scsi_csr_2);
    412        return 0x40;
    413
    414    /*
    415     * These 4 registers are the hardware timer, not sure which register
    416     * is the latch instead of data, but no problems so far
    417     */
    418    case 0x1a000:
    419        return 0xff & (clock() >> 24);
    420    case 0x1a001:
    421        return 0xff & (clock() >> 16);
    422    case 0x1a002:
    423        return 0xff & (clock() >> 8);
    424    case 0x1a003:
    425        /* Hack: We need to have this change consistently to make it work */
    426        return 0xFF & clock();
    427
    428    default:
    429        DPRINTF("BMAP Read B @ %x\n", (unsigned int)addr);
    430        return 0;
    431    }
    432}
    433
    434static uint32_t scr_readw(NeXTPC *s, hwaddr addr)
    435{
    436    DPRINTF("BMAP Read W @ %x\n", (unsigned int)addr);
    437    return 0;
    438}
    439
    440static uint32_t scr_readl(NeXTPC *s, hwaddr addr)
    441{
    442    DPRINTF("BMAP Read L @ %x\n", (unsigned int)addr);
    443    return 0;
    444}
    445
    446#define SCSICSR_ENABLE  0x01
    447#define SCSICSR_RESET   0x02  /* reset scsi dma */
    448#define SCSICSR_FIFOFL  0x04
    449#define SCSICSR_DMADIR  0x08  /* if set, scsi to mem */
    450#define SCSICSR_CPUDMA  0x10  /* if set, dma enabled */
    451#define SCSICSR_INTMASK 0x20  /* if set, interrupt enabled */
    452
    453static void scr_writeb(NeXTPC *s, hwaddr addr, uint32_t value)
    454{
    455    switch (addr) {
    456    case 0x14108:
    457        DPRINTF("FDCSR Write: %x\n", value);
    458
    459        if (value == 0x0) {
    460            /* qemu_irq_raise(s->fd_irq[0]); */
    461        }
    462        break;
    463    case 0x14020: /* SCSI Control Register */
    464        if (value & SCSICSR_FIFOFL) {
    465            DPRINTF("SCSICSR FIFO Flush\n");
    466            /* will have to add another irq to the esp if this is needed */
    467            /* esp_puflush_fifo(esp_g); */
    468            /* qemu_irq_pulse(s->scsi_dma); */
    469        }
    470
    471        if (value & SCSICSR_ENABLE) {
    472            DPRINTF("SCSICSR Enable\n");
    473            /*
    474             * qemu_irq_raise(s->scsi_dma);
    475             * s->scsi_csr_1 = 0xc0;
    476             * s->scsi_csr_1 |= 0x1;
    477             * qemu_irq_pulse(s->scsi_dma);
    478             */
    479        }
    480        /*
    481         * else
    482         *     s->scsi_csr_1 &= ~SCSICSR_ENABLE;
    483         */
    484
    485        if (value & SCSICSR_RESET) {
    486            DPRINTF("SCSICSR Reset\n");
    487            /* I think this should set DMADIR. CPUDMA and INTMASK to 0 */
    488            /* qemu_irq_raise(s->scsi_reset); */
    489            /* s->scsi_csr_1 &= ~(SCSICSR_INTMASK |0x80|0x1); */
    490
    491        }
    492        if (value & SCSICSR_DMADIR) {
    493            DPRINTF("SCSICSR DMAdir\n");
    494        }
    495        if (value & SCSICSR_CPUDMA) {
    496            DPRINTF("SCSICSR CPUDMA\n");
    497            /* qemu_irq_raise(s->scsi_dma); */
    498
    499            s->int_status |= 0x4000000;
    500        } else {
    501            s->int_status &= ~(0x4000000);
    502        }
    503        if (value & SCSICSR_INTMASK) {
    504            DPRINTF("SCSICSR INTMASK\n");
    505            /*
    506             * int_mask &= ~0x1000;
    507             * s->scsi_csr_1 |= value;
    508             * s->scsi_csr_1 &= ~SCSICSR_INTMASK;
    509             * if (s->scsi_queued) {
    510             *     s->scsi_queued = 0;
    511             *     next_irq(s, NEXT_SCSI_I, level);
    512             * }
    513             */
    514        } else {
    515            /* int_mask |= 0x1000; */
    516        }
    517        if (value & 0x80) {
    518            /* int_mask |= 0x1000; */
    519            /* s->scsi_csr_1 |= 0x80; */
    520        }
    521        DPRINTF("SCSICSR Write: %x\n", value);
    522        /* s->scsi_csr_1 = value; */
    523        return;
    524    /* Hardware timer latch - not implemented yet */
    525    case 0x1a000:
    526    default:
    527        DPRINTF("BMAP Write B @ %x with %x\n", (unsigned int)addr, value);
    528    }
    529}
    530
    531static void scr_writew(NeXTPC *s, hwaddr addr, uint32_t value)
    532{
    533    DPRINTF("BMAP Write W @ %x with %x\n", (unsigned int)addr, value);
    534}
    535
    536static void scr_writel(NeXTPC *s, hwaddr addr, uint32_t value)
    537{
    538    DPRINTF("BMAP Write L @ %x with %x\n", (unsigned int)addr, value);
    539}
    540
    541static uint64_t scr_readfn(void *opaque, hwaddr addr, unsigned size)
    542{
    543    NeXTPC *s = NEXT_PC(opaque);
    544
    545    switch (size) {
    546    case 1:
    547        return scr_readb(s, addr);
    548    case 2:
    549        return scr_readw(s, addr);
    550    case 4:
    551        return scr_readl(s, addr);
    552    default:
    553        g_assert_not_reached();
    554    }
    555}
    556
    557static void scr_writefn(void *opaque, hwaddr addr, uint64_t value,
    558                        unsigned size)
    559{
    560    NeXTPC *s = NEXT_PC(opaque);
    561
    562    switch (size) {
    563    case 1:
    564        scr_writeb(s, addr, value);
    565        break;
    566    case 2:
    567        scr_writew(s, addr, value);
    568        break;
    569    case 4:
    570        scr_writel(s, addr, value);
    571        break;
    572    default:
    573        g_assert_not_reached();
    574    }
    575}
    576
    577static const MemoryRegionOps scr_ops = {
    578    .read = scr_readfn,
    579    .write = scr_writefn,
    580    .valid.min_access_size = 1,
    581    .valid.max_access_size = 4,
    582    .endianness = DEVICE_NATIVE_ENDIAN,
    583};
    584
    585#define NEXTDMA_SCSI(x)      (0x10 + x)
    586#define NEXTDMA_FD(x)        (0x10 + x)
    587#define NEXTDMA_ENTX(x)      (0x110 + x)
    588#define NEXTDMA_ENRX(x)      (0x150 + x)
    589#define NEXTDMA_CSR          0x0
    590#define NEXTDMA_NEXT         0x4000
    591#define NEXTDMA_LIMIT        0x4004
    592#define NEXTDMA_START        0x4008
    593#define NEXTDMA_STOP         0x400c
    594#define NEXTDMA_NEXT_INIT    0x4200
    595#define NEXTDMA_SIZE         0x4204
    596
    597static void dma_writel(void *opaque, hwaddr addr, uint64_t value,
    598                       unsigned int size)
    599{
    600    NeXTState *next_state = NEXT_MACHINE(opaque);
    601
    602    switch (addr) {
    603    case NEXTDMA_ENRX(NEXTDMA_CSR):
    604        if (value & DMA_DEV2M) {
    605            next_state->dma[NEXTDMA_ENRX].csr |= DMA_DEV2M;
    606        }
    607
    608        if (value & DMA_SETENABLE) {
    609            /* DPRINTF("SCSI DMA ENABLE\n"); */
    610            next_state->dma[NEXTDMA_ENRX].csr |= DMA_ENABLE;
    611        }
    612        if (value & DMA_SETSUPDATE) {
    613            next_state->dma[NEXTDMA_ENRX].csr |= DMA_SUPDATE;
    614        }
    615        if (value & DMA_CLRCOMPLETE) {
    616            next_state->dma[NEXTDMA_ENRX].csr &= ~DMA_COMPLETE;
    617        }
    618
    619        if (value & DMA_RESET) {
    620            next_state->dma[NEXTDMA_ENRX].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
    621                                                  DMA_ENABLE | DMA_DEV2M);
    622        }
    623        /* DPRINTF("RXCSR \tWrite: %x\n",value); */
    624        break;
    625    case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
    626        next_state->dma[NEXTDMA_ENRX].next_initbuf = value;
    627        break;
    628    case NEXTDMA_ENRX(NEXTDMA_NEXT):
    629        next_state->dma[NEXTDMA_ENRX].next = value;
    630        break;
    631    case NEXTDMA_ENRX(NEXTDMA_LIMIT):
    632        next_state->dma[NEXTDMA_ENRX].limit = value;
    633        break;
    634    case NEXTDMA_SCSI(NEXTDMA_CSR):
    635        if (value & DMA_DEV2M) {
    636            next_state->dma[NEXTDMA_SCSI].csr |= DMA_DEV2M;
    637        }
    638        if (value & DMA_SETENABLE) {
    639            /* DPRINTF("SCSI DMA ENABLE\n"); */
    640            next_state->dma[NEXTDMA_SCSI].csr |= DMA_ENABLE;
    641        }
    642        if (value & DMA_SETSUPDATE) {
    643            next_state->dma[NEXTDMA_SCSI].csr |= DMA_SUPDATE;
    644        }
    645        if (value & DMA_CLRCOMPLETE) {
    646            next_state->dma[NEXTDMA_SCSI].csr &= ~DMA_COMPLETE;
    647        }
    648
    649        if (value & DMA_RESET) {
    650            next_state->dma[NEXTDMA_SCSI].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
    651                                                  DMA_ENABLE | DMA_DEV2M);
    652            /* DPRINTF("SCSI DMA RESET\n"); */
    653        }
    654        /* DPRINTF("RXCSR \tWrite: %x\n",value); */
    655        break;
    656
    657    case NEXTDMA_SCSI(NEXTDMA_NEXT):
    658        next_state->dma[NEXTDMA_SCSI].next = value;
    659        break;
    660
    661    case NEXTDMA_SCSI(NEXTDMA_LIMIT):
    662        next_state->dma[NEXTDMA_SCSI].limit = value;
    663        break;
    664
    665    case NEXTDMA_SCSI(NEXTDMA_START):
    666        next_state->dma[NEXTDMA_SCSI].start = value;
    667        break;
    668
    669    case NEXTDMA_SCSI(NEXTDMA_STOP):
    670        next_state->dma[NEXTDMA_SCSI].stop = value;
    671        break;
    672
    673    case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
    674        next_state->dma[NEXTDMA_SCSI].next_initbuf = value;
    675        break;
    676
    677    default:
    678        DPRINTF("DMA write @ %x w/ %x\n", (unsigned)addr, (unsigned)value);
    679    }
    680}
    681
    682static uint64_t dma_readl(void *opaque, hwaddr addr, unsigned int size)
    683{
    684    NeXTState *next_state = NEXT_MACHINE(opaque);
    685
    686    switch (addr) {
    687    case NEXTDMA_SCSI(NEXTDMA_CSR):
    688        DPRINTF("SCSI DMA CSR READ\n");
    689        return next_state->dma[NEXTDMA_SCSI].csr;
    690    case NEXTDMA_ENRX(NEXTDMA_CSR):
    691        return next_state->dma[NEXTDMA_ENRX].csr;
    692    case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
    693        return next_state->dma[NEXTDMA_ENRX].next_initbuf;
    694    case NEXTDMA_ENRX(NEXTDMA_NEXT):
    695        return next_state->dma[NEXTDMA_ENRX].next;
    696    case NEXTDMA_ENRX(NEXTDMA_LIMIT):
    697        return next_state->dma[NEXTDMA_ENRX].limit;
    698
    699    case NEXTDMA_SCSI(NEXTDMA_NEXT):
    700        return next_state->dma[NEXTDMA_SCSI].next;
    701    case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
    702        return next_state->dma[NEXTDMA_SCSI].next_initbuf;
    703    case NEXTDMA_SCSI(NEXTDMA_LIMIT):
    704        return next_state->dma[NEXTDMA_SCSI].limit;
    705    case NEXTDMA_SCSI(NEXTDMA_START):
    706        return next_state->dma[NEXTDMA_SCSI].start;
    707    case NEXTDMA_SCSI(NEXTDMA_STOP):
    708        return next_state->dma[NEXTDMA_SCSI].stop;
    709
    710    default:
    711        DPRINTF("DMA read @ %x\n", (unsigned int)addr);
    712        return 0;
    713    }
    714
    715    /*
    716     * once the csr's are done, subtract 0x3FEC from the addr, and that will
    717     * normalize the upper registers
    718     */
    719}
    720
    721static const MemoryRegionOps dma_ops = {
    722    .read = dma_readl,
    723    .write = dma_writel,
    724    .impl.min_access_size = 4,
    725    .valid.min_access_size = 4,
    726    .valid.max_access_size = 4,
    727    .endianness = DEVICE_NATIVE_ENDIAN,
    728};
    729
    730static void next_irq(void *opaque, int number, int level)
    731{
    732    NeXTPC *s = NEXT_PC(opaque);
    733    M68kCPU *cpu = s->cpu;
    734    int shift = 0;
    735
    736    /* first switch sets interupt status */
    737    /* DPRINTF("IRQ %i\n",number); */
    738    switch (number) {
    739    /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
    740    case NEXT_FD_I:
    741        shift = 7;
    742        break;
    743    case NEXT_KBD_I:
    744        shift = 3;
    745        break;
    746    case NEXT_PWR_I:
    747        shift = 2;
    748        break;
    749    case NEXT_ENRX_I:
    750        shift = 9;
    751        break;
    752    case NEXT_ENTX_I:
    753        shift = 10;
    754        break;
    755    case NEXT_SCSI_I:
    756        shift = 12;
    757        break;
    758    case NEXT_CLK_I:
    759        shift = 5;
    760        break;
    761
    762    /* level 5 - scc (serial) */
    763    case NEXT_SCC_I:
    764        shift = 17;
    765        break;
    766
    767    /* level 6 - audio etherrx/tx dma */
    768    case NEXT_ENTX_DMA_I:
    769        shift = 28;
    770        break;
    771    case NEXT_ENRX_DMA_I:
    772        shift = 27;
    773        break;
    774    case NEXT_SCSI_DMA_I:
    775        shift = 26;
    776        break;
    777    case NEXT_SND_I:
    778        shift = 23;
    779        break;
    780    case NEXT_SCC_DMA_I:
    781        shift = 21;
    782        break;
    783
    784    }
    785    /*
    786     * this HAS to be wrong, the interrupt handlers in mach and together
    787     * int_status and int_mask and return if there is a hit
    788     */
    789    if (s->int_mask & (1 << shift)) {
    790        DPRINTF("%x interrupt masked @ %x\n", 1 << shift, cpu->env.pc);
    791        /* return; */
    792    }
    793
    794    /* second switch triggers the correct interrupt */
    795    if (level) {
    796        s->int_status |= 1 << shift;
    797
    798        switch (number) {
    799        /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
    800        case NEXT_FD_I:
    801        case NEXT_KBD_I:
    802        case NEXT_PWR_I:
    803        case NEXT_ENRX_I:
    804        case NEXT_ENTX_I:
    805        case NEXT_SCSI_I:
    806        case NEXT_CLK_I:
    807            m68k_set_irq_level(cpu, 3, 27);
    808            break;
    809
    810        /* level 5 - scc (serial) */
    811        case NEXT_SCC_I:
    812            m68k_set_irq_level(cpu, 5, 29);
    813            break;
    814
    815        /* level 6 - audio etherrx/tx dma */
    816        case NEXT_ENTX_DMA_I:
    817        case NEXT_ENRX_DMA_I:
    818        case NEXT_SCSI_DMA_I:
    819        case NEXT_SND_I:
    820        case NEXT_SCC_DMA_I:
    821            m68k_set_irq_level(cpu, 6, 30);
    822            break;
    823        }
    824    } else {
    825        s->int_status &= ~(1 << shift);
    826        cpu_reset_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
    827    }
    828}
    829
    830static void next_escc_init(DeviceState *pcdev)
    831{
    832    DeviceState *dev;
    833    SysBusDevice *s;
    834
    835    dev = qdev_new(TYPE_ESCC);
    836    qdev_prop_set_uint32(dev, "disabled", 0);
    837    qdev_prop_set_uint32(dev, "frequency", 9600 * 384);
    838    qdev_prop_set_uint32(dev, "it_shift", 0);
    839    qdev_prop_set_bit(dev, "bit_swap", true);
    840    qdev_prop_set_chr(dev, "chrB", serial_hd(1));
    841    qdev_prop_set_chr(dev, "chrA", serial_hd(0));
    842    qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
    843    qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
    844
    845    s = SYS_BUS_DEVICE(dev);
    846    sysbus_realize_and_unref(s, &error_fatal);
    847    sysbus_connect_irq(s, 0, qdev_get_gpio_in(pcdev, NEXT_SCC_I));
    848    sysbus_connect_irq(s, 1, qdev_get_gpio_in(pcdev, NEXT_SCC_DMA_I));
    849    sysbus_mmio_map(s, 0, 0x2118000);
    850}
    851
    852static void next_pc_reset(DeviceState *dev)
    853{
    854    NeXTPC *s = NEXT_PC(dev);
    855
    856    /* Set internal registers to initial values */
    857    /*     0x0000XX00 << vital bits */
    858    s->scr1 = 0x00011102;
    859    s->scr2 = 0x00ff0c80;
    860
    861    s->rtc.status = 0x90;
    862
    863    /* Load RTC RAM - TODO: provide possibility to load contents from file */
    864    memcpy(s->rtc.ram, rtc_ram2, 32);
    865}
    866
    867static void next_pc_realize(DeviceState *dev, Error **errp)
    868{
    869    NeXTPC *s = NEXT_PC(dev);
    870    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
    871
    872    qdev_init_gpio_in(dev, next_irq, NEXT_NUM_IRQS);
    873
    874    memory_region_init_io(&s->mmiomem, OBJECT(s), &mmio_ops, s,
    875                          "next.mmio", 0xD0000);
    876    memory_region_init_io(&s->scrmem, OBJECT(s), &scr_ops, s,
    877                          "next.scr", 0x20000);
    878    sysbus_init_mmio(sbd, &s->mmiomem);
    879    sysbus_init_mmio(sbd, &s->scrmem);
    880}
    881
    882/*
    883 * If the m68k CPU implemented its inbound irq lines as GPIO lines
    884 * rather than via the m68k_set_irq_level() function we would not need
    885 * this cpu link property and could instead provide outbound IRQ lines
    886 * that the board could wire up to the CPU.
    887 */
    888static Property next_pc_properties[] = {
    889    DEFINE_PROP_LINK("cpu", NeXTPC, cpu, TYPE_M68K_CPU, M68kCPU *),
    890    DEFINE_PROP_END_OF_LIST(),
    891};
    892
    893static const VMStateDescription next_rtc_vmstate = {
    894    .name = "next-rtc",
    895    .version_id = 1,
    896    .minimum_version_id = 1,
    897    .fields = (VMStateField[]) {
    898        VMSTATE_UINT8_ARRAY(ram, NextRtc, 32),
    899        VMSTATE_UINT8(command, NextRtc),
    900        VMSTATE_UINT8(value, NextRtc),
    901        VMSTATE_UINT8(status, NextRtc),
    902        VMSTATE_UINT8(control, NextRtc),
    903        VMSTATE_UINT8(retval, NextRtc),
    904        VMSTATE_END_OF_LIST()
    905    },
    906};
    907
    908static const VMStateDescription next_pc_vmstate = {
    909    .name = "next-pc",
    910    .version_id = 1,
    911    .minimum_version_id = 1,
    912    .fields = (VMStateField[]) {
    913        VMSTATE_UINT32(scr1, NeXTPC),
    914        VMSTATE_UINT32(scr2, NeXTPC),
    915        VMSTATE_UINT32(int_mask, NeXTPC),
    916        VMSTATE_UINT32(int_status, NeXTPC),
    917        VMSTATE_UINT8(scsi_csr_1, NeXTPC),
    918        VMSTATE_UINT8(scsi_csr_2, NeXTPC),
    919        VMSTATE_STRUCT(rtc, NeXTPC, 0, next_rtc_vmstate, NextRtc),
    920        VMSTATE_END_OF_LIST()
    921    },
    922};
    923
    924static void next_pc_class_init(ObjectClass *klass, void *data)
    925{
    926    DeviceClass *dc = DEVICE_CLASS(klass);
    927
    928    dc->desc = "NeXT Peripheral Controller";
    929    dc->realize = next_pc_realize;
    930    dc->reset = next_pc_reset;
    931    device_class_set_props(dc, next_pc_properties);
    932    dc->vmsd = &next_pc_vmstate;
    933}
    934
    935static const TypeInfo next_pc_info = {
    936    .name = TYPE_NEXT_PC,
    937    .parent = TYPE_SYS_BUS_DEVICE,
    938    .instance_size = sizeof(NeXTPC),
    939    .class_init = next_pc_class_init,
    940};
    941
    942static void next_cube_init(MachineState *machine)
    943{
    944    M68kCPU *cpu;
    945    CPUM68KState *env;
    946    MemoryRegion *rom = g_new(MemoryRegion, 1);
    947    MemoryRegion *dmamem = g_new(MemoryRegion, 1);
    948    MemoryRegion *bmapm1 = g_new(MemoryRegion, 1);
    949    MemoryRegion *bmapm2 = g_new(MemoryRegion, 1);
    950    MemoryRegion *sysmem = get_system_memory();
    951    const char *bios_name = machine->firmware ?: ROM_FILE;
    952    DeviceState *dev;
    953    DeviceState *pcdev;
    954
    955    /* Initialize the cpu core */
    956    cpu = M68K_CPU(cpu_create(machine->cpu_type));
    957    if (!cpu) {
    958        error_report("Unable to find m68k CPU definition");
    959        exit(1);
    960    }
    961    env = &cpu->env;
    962
    963    /* Initialize CPU registers.  */
    964    env->vbr = 0;
    965    env->sr  = 0x2700;
    966
    967    /* Peripheral Controller */
    968    pcdev = qdev_new(TYPE_NEXT_PC);
    969    object_property_set_link(OBJECT(pcdev), "cpu", OBJECT(cpu), &error_abort);
    970    sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev), &error_fatal);
    971
    972    /* 64MB RAM starting at 0x04000000  */
    973    memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
    974
    975    /* Framebuffer */
    976    dev = qdev_new(TYPE_NEXTFB);
    977    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
    978    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0B000000);
    979
    980    /* MMIO */
    981    sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 0, 0x02000000);
    982
    983    /* BMAP IO - acts as a catch-all for now */
    984    sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 1, 0x02100000);
    985
    986    /* BMAP memory */
    987    memory_region_init_ram_flags_nomigrate(bmapm1, NULL, "next.bmapmem", 64,
    988                                           RAM_SHARED, &error_fatal);
    989    memory_region_add_subregion(sysmem, 0x020c0000, bmapm1);
    990    /* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */
    991    memory_region_init_alias(bmapm2, NULL, "next.bmapmem2", bmapm1, 0x0, 64);
    992    memory_region_add_subregion(sysmem, 0x820c0000, bmapm2);
    993
    994    /* KBD */
    995    dev = qdev_new(TYPE_NEXTKBD);
    996    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
    997    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0200e000);
    998
    999    /* Load ROM here */
   1000    /* still not sure if the rom should also be mapped at 0x0*/
   1001    memory_region_init_rom(rom, NULL, "next.rom", 0x20000, &error_fatal);
   1002    memory_region_add_subregion(sysmem, 0x01000000, rom);
   1003    if (load_image_targphys(bios_name, 0x01000000, 0x20000) < 8) {
   1004        if (!qtest_enabled()) {
   1005            error_report("Failed to load firmware '%s'.", bios_name);
   1006        }
   1007    } else {
   1008        uint8_t *ptr;
   1009        /* Initial PC is always at offset 4 in firmware binaries */
   1010        ptr = rom_ptr(0x01000004, 4);
   1011        g_assert(ptr != NULL);
   1012        env->pc = ldl_p(ptr);
   1013        if (env->pc >= 0x01020000) {
   1014            error_report("'%s' does not seem to be a valid firmware image.",
   1015                         bios_name);
   1016            exit(1);
   1017        }
   1018    }
   1019
   1020    /* Serial */
   1021    next_escc_init(pcdev);
   1022
   1023    /* TODO: */
   1024    /* Network */
   1025    /* SCSI */
   1026
   1027    /* DMA */
   1028    memory_region_init_io(dmamem, NULL, &dma_ops, machine, "next.dma", 0x5000);
   1029    memory_region_add_subregion(sysmem, 0x02000000, dmamem);
   1030}
   1031
   1032static void next_machine_class_init(ObjectClass *oc, void *data)
   1033{
   1034    MachineClass *mc = MACHINE_CLASS(oc);
   1035
   1036    mc->desc = "NeXT Cube";
   1037    mc->init = next_cube_init;
   1038    mc->default_ram_size = RAM_SIZE;
   1039    mc->default_ram_id = "next.ram";
   1040    mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
   1041}
   1042
   1043static const TypeInfo next_typeinfo = {
   1044    .name = TYPE_NEXT_MACHINE,
   1045    .parent = TYPE_MACHINE,
   1046    .class_init = next_machine_class_init,
   1047    .instance_size = sizeof(NeXTState),
   1048};
   1049
   1050static void next_register_type(void)
   1051{
   1052    type_register_static(&next_typeinfo);
   1053    type_register_static(&next_pc_info);
   1054}
   1055
   1056type_init(next_register_type)