⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 integratorcp.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 2 页
字号:
  void *parent;  int parent_irq;  int parent_fiq;} icp_pic_state;static void icp_pic_update(icp_pic_state *s){    uint32_t flags;    if (s->parent_irq != -1) {        flags = (s->level & s->irq_enabled);        pic_set_irq_new(s->parent, s->parent_irq, flags != 0);    }    if (s->parent_fiq != -1) {        flags = (s->level & s->fiq_enabled);        pic_set_irq_new(s->parent, s->parent_fiq, flags != 0);    }}static void icp_pic_set_irq(void *opaque, int irq, int level){    icp_pic_state *s = (icp_pic_state *)opaque;    if (level)        s->level |= 1 << irq;    else        s->level &= ~(1 << irq);    icp_pic_update(s);}static uint32_t icp_pic_read(void *opaque, target_phys_addr_t offset){    icp_pic_state *s = (icp_pic_state *)opaque;    offset -= s->base;    switch (offset >> 2) {    case 0: /* IRQ_STATUS */        return s->level & s->irq_enabled;    case 1: /* IRQ_RAWSTAT */        return s->level;    case 2: /* IRQ_ENABLESET */        return s->irq_enabled;    case 4: /* INT_SOFTSET */        return s->level & 1;    case 8: /* FRQ_STATUS */        return s->level & s->fiq_enabled;    case 9: /* FRQ_RAWSTAT */        return s->level;    case 10: /* FRQ_ENABLESET */        return s->fiq_enabled;    case 3: /* IRQ_ENABLECLR */    case 5: /* INT_SOFTCLR */    case 11: /* FRQ_ENABLECLR */    default:        printf ("icp_pic_read: Bad register offset 0x%x\n", offset);        return 0;    }}static void icp_pic_write(void *opaque, target_phys_addr_t offset,                          uint32_t value){    icp_pic_state *s = (icp_pic_state *)opaque;    offset -= s->base;    switch (offset >> 2) {    case 2: /* IRQ_ENABLESET */        s->irq_enabled |= value;        break;    case 3: /* IRQ_ENABLECLR */        s->irq_enabled &= ~value;        break;    case 4: /* INT_SOFTSET */        if (value & 1)            pic_set_irq_new(s, 0, 1);        break;    case 5: /* INT_SOFTCLR */        if (value & 1)            pic_set_irq_new(s, 0, 0);        break;    case 10: /* FRQ_ENABLESET */        s->fiq_enabled |= value;        break;    case 11: /* FRQ_ENABLECLR */        s->fiq_enabled &= ~value;        break;    case 0: /* IRQ_STATUS */    case 1: /* IRQ_RAWSTAT */    case 8: /* FRQ_STATUS */    case 9: /* FRQ_RAWSTAT */    default:        printf ("icp_pic_write: Bad register offset 0x%x\n", offset);        return;    }    icp_pic_update(s);}static CPUReadMemoryFunc *icp_pic_readfn[] = {   icp_pic_read,   icp_pic_read,   icp_pic_read};static CPUWriteMemoryFunc *icp_pic_writefn[] = {   icp_pic_write,   icp_pic_write,   icp_pic_write};static icp_pic_state *icp_pic_init(uint32_t base, void *parent,                                   int parent_irq, int parent_fiq){    icp_pic_state *s;    int iomemtype;    s = (icp_pic_state *)qemu_mallocz(sizeof(icp_pic_state));    if (!s)        return NULL;    s->handler = icp_pic_set_irq;    s->base = base;    s->parent = parent;    s->parent_irq = parent_irq;    s->parent_fiq = parent_fiq;    iomemtype = cpu_register_io_memory(0, icp_pic_readfn,                                       icp_pic_writefn, s);    cpu_register_physical_memory(base, 0x007fffff, iomemtype);    /* ??? Save/restore.  */    return s;}/* CP control registers.  */typedef struct {    uint32_t base;} icp_control_state;static uint32_t icp_control_read(void *opaque, target_phys_addr_t offset){    icp_control_state *s = (icp_control_state *)opaque;    offset -= s->base;    switch (offset >> 2) {    case 0: /* CP_IDFIELD */        return 0x41034003;    case 1: /* CP_FLASHPROG */        return 0;    case 2: /* CP_INTREG */        return 0;    case 3: /* CP_DECODE */        return 0x11;    default:        cpu_abort (cpu_single_env, "icp_control_read: Bad offset %x\n", offset);        return 0;    }}static void icp_control_write(void *opaque, target_phys_addr_t offset,                          uint32_t value){    icp_control_state *s = (icp_control_state *)opaque;    offset -= s->base;    switch (offset >> 2) {    case 1: /* CP_FLASHPROG */    case 2: /* CP_INTREG */    case 3: /* CP_DECODE */        /* Nothing interesting implemented yet.  */        break;    default:        cpu_abort (cpu_single_env, "icp_control_write: Bad offset %x\n", offset);    }}static CPUReadMemoryFunc *icp_control_readfn[] = {   icp_control_read,   icp_control_read,   icp_control_read};static CPUWriteMemoryFunc *icp_control_writefn[] = {   icp_control_write,   icp_control_write,   icp_control_write};static void icp_control_init(uint32_t base){    int iomemtype;    icp_control_state *s;    s = (icp_control_state *)qemu_mallocz(sizeof(icp_control_state));    iomemtype = cpu_register_io_memory(0, icp_control_readfn,                                       icp_control_writefn, s);    cpu_register_physical_memory(base, 0x007fffff, iomemtype);    s->base = base;    /* ??? Save/restore.  */}/* Board init.  */static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device,                     DisplayState *ds, const char **fd_filename, int snapshot,                     const char *kernel_filename, const char *kernel_cmdline,                     const char *initrd_filename, uint32_t cpuid){    CPUState *env;    uint32_t bios_offset;    icp_pic_state *pic;    void *cpu_pic;    env = cpu_init();    cpu_arm_set_model(env, cpuid);    bios_offset = ram_size + vga_ram_size;    /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash.  */    /* ??? RAM shoud repeat to fill physical memory space.  */    /* SDRAM at address zero*/    cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);    /* And again at address 0x80000000 */    cpu_register_physical_memory(0x80000000, ram_size, IO_MEM_RAM);    integratorcm_init(ram_size >> 20, bios_offset);    cpu_pic = arm_pic_init_cpu(env);    pic = icp_pic_init(0x14000000, cpu_pic, ARM_PIC_CPU_IRQ, ARM_PIC_CPU_FIQ);    icp_pic_init(0xca000000, pic, 26, -1);    icp_pit_init(0x13000000, pic, 5);    pl011_init(0x16000000, pic, 1, serial_hds[0]);    pl011_init(0x17000000, pic, 2, serial_hds[1]);    icp_control_init(0xcb000000);    pl050_init(0x18000000, pic, 3, 0);    pl050_init(0x19000000, pic, 4, 1);    if (nd_table[0].vlan) {        if (nd_table[0].model == NULL            || strcmp(nd_table[0].model, "smc91c111") == 0) {            smc91c111_init(&nd_table[0], 0xc8000000, pic, 27);        } else {            fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);            exit (1);        }    }    pl110_init(ds, 0xc0000000, pic, 22, 0);    arm_load_kernel(ram_size, kernel_filename, kernel_cmdline,                    initrd_filename, 0x113);}static void integratorcp926_init(int ram_size, int vga_ram_size,    int boot_device, DisplayState *ds, const char **fd_filename, int snapshot,    const char *kernel_filename, const char *kernel_cmdline,    const char *initrd_filename){    integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename,                      snapshot, kernel_filename, kernel_cmdline,                      initrd_filename, ARM_CPUID_ARM926);}static void integratorcp1026_init(int ram_size, int vga_ram_size,    int boot_device, DisplayState *ds, const char **fd_filename, int snapshot,    const char *kernel_filename, const char *kernel_cmdline,    const char *initrd_filename){    integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename,                      snapshot, kernel_filename, kernel_cmdline,                      initrd_filename, ARM_CPUID_ARM1026);}QEMUMachine integratorcp926_machine = {    "integratorcp926",    "ARM Integrator/CP (ARM926EJ-S)",    integratorcp926_init,};QEMUMachine integratorcp1026_machine = {    "integratorcp1026",    "ARM Integrator/CP (ARM1026EJ-S)",    integratorcp1026_init,};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -