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

📄 sun4m.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
    /* SS-20 */    {        .iommu_base   = 0xfe0000000ULL,        .tcx_base     = 0xe20000000ULL,        .cs_base      = -1,        .slavio_base  = 0xff0000000ULL,        .ms_kb_base   = 0xff1000000ULL,        .serial_base  = 0xff1100000ULL,        .nvram_base   = 0xff1200000ULL,        .fd_base      = 0xff1700000ULL,        .counter_base = 0xff1300000ULL,        .intctl_base  = 0xff1400000ULL,        .idreg_base   = 0xef0000000ULL,        .dma_base     = 0xef0400000ULL,        .esp_base     = 0xef0800000ULL,        .le_base      = 0xef0c00000ULL,        .power_base   = 0xefa000000ULL,        .ecc_base     = 0xf00000000ULL,        .ecc_version  = 0x20000000, // version 0, implementation 2        .sun4c_intctl_base  = -1,        .sun4c_counter_base = -1,        .vram_size    = 0x00100000,        .nvram_size   = 0x2000,        .esp_irq = 18,        .le_irq = 16,        .clock_irq = 7,        .clock1_irq = 19,        .ms_kb_irq = 14,        .ser_irq = 15,        .fd_irq = 22,        .me_irq = 30,        .cs_irq = -1,        .machine_id = 0x72,        .iommu_version = 0x13000000,        .intbit_to_level = {            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,        },        .max_mem = 0xffffffff, // XXX actually first 62GB ok        .default_cpu_model = "TI SuperSparc II",    },    /* SS-2 */    {        .iommu_base   = 0xf8000000,        .tcx_base     = 0xfe000000,        .cs_base      = -1,        .slavio_base  = 0xf6000000,        .ms_kb_base   = 0xf0000000,        .serial_base  = 0xf1000000,        .nvram_base   = 0xf2000000,        .fd_base      = 0xf7200000,        .counter_base = -1,        .intctl_base  = -1,        .dma_base     = 0xf8400000,        .esp_base     = 0xf8800000,        .le_base      = 0xf8c00000,        .power_base   = -1,        .sun4c_intctl_base  = 0xf5000000,        .sun4c_counter_base = 0xf3000000,        .vram_size    = 0x00100000,        .nvram_size   = 0x800,        .esp_irq = 2,        .le_irq = 3,        .clock_irq = 5,        .clock1_irq = 7,        .ms_kb_irq = 1,        .ser_irq = 1,        .fd_irq = 1,        .me_irq = 1,        .cs_irq = -1,        .machine_id = 0x55,        .max_mem = 0x10000000,        .default_cpu_model = "Cypress CY7C601",    },};/* SPARCstation 5 hardware initialisation */static void ss5_init(int RAM_size, int vga_ram_size,                     const char *boot_device, DisplayState *ds,                     const char *kernel_filename, const char *kernel_cmdline,                     const char *initrd_filename, const char *cpu_model){    sun4m_hw_init(&hwdefs[0], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation 10 hardware initialisation */static void ss10_init(int RAM_size, int vga_ram_size,                      const char *boot_device, DisplayState *ds,                      const char *kernel_filename, const char *kernel_cmdline,                      const char *initrd_filename, const char *cpu_model){    sun4m_hw_init(&hwdefs[1], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}/* SPARCserver 600MP hardware initialisation */static void ss600mp_init(int RAM_size, int vga_ram_size,                         const char *boot_device, DisplayState *ds,                         const char *kernel_filename, const char *kernel_cmdline,                         const char *initrd_filename, const char *cpu_model){    sun4m_hw_init(&hwdefs[2], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation 20 hardware initialisation */static void ss20_init(int RAM_size, int vga_ram_size,                      const char *boot_device, DisplayState *ds,                      const char *kernel_filename, const char *kernel_cmdline,                      const char *initrd_filename, const char *cpu_model){    sun4m_hw_init(&hwdefs[3], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation 2 hardware initialisation */static void ss2_init(int RAM_size, int vga_ram_size,                     const char *boot_device, DisplayState *ds,                     const char *kernel_filename, const char *kernel_cmdline,                     const char *initrd_filename, const char *cpu_model){    sun4c_hw_init(&hwdefs[4], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}QEMUMachine ss5_machine = {    "SS-5",    "Sun4m platform, SPARCstation 5",    ss5_init,};QEMUMachine ss10_machine = {    "SS-10",    "Sun4m platform, SPARCstation 10",    ss10_init,};QEMUMachine ss600mp_machine = {    "SS-600MP",    "Sun4m platform, SPARCserver 600MP",    ss600mp_init,};QEMUMachine ss20_machine = {    "SS-20",    "Sun4m platform, SPARCstation 20",    ss20_init,};QEMUMachine ss2_machine = {    "SS-2",    "Sun4c platform, SPARCstation 2",    ss2_init,};static const struct sun4d_hwdef sun4d_hwdefs[] = {    /* SS-1000 */    {        .iounit_bases   = {            0xfe0200000ULL,            0xfe1200000ULL,            0xfe2200000ULL,            0xfe3200000ULL,            -1,        },        .tcx_base     = 0x820000000ULL,        .slavio_base  = 0xf00000000ULL,        .ms_kb_base   = 0xf00240000ULL,        .serial_base  = 0xf00200000ULL,        .nvram_base   = 0xf00280000ULL,        .counter_base = 0xf00300000ULL,        .espdma_base  = 0x800081000ULL,        .esp_base     = 0x800080000ULL,        .ledma_base   = 0x800040000ULL,        .le_base      = 0x800060000ULL,        .sbi_base     = 0xf02800000ULL,        .vram_size    = 0x00100000,        .nvram_size   = 0x2000,        .esp_irq = 3,        .le_irq = 4,        .clock_irq = 14,        .clock1_irq = 10,        .ms_kb_irq = 12,        .ser_irq = 12,        .machine_id = 0x80,        .iounit_version = 0x03000000,        .max_mem = 0xffffffff, // XXX actually first 62GB ok        .default_cpu_model = "TI SuperSparc II",    },    /* SS-2000 */    {        .iounit_bases   = {            0xfe0200000ULL,            0xfe1200000ULL,            0xfe2200000ULL,            0xfe3200000ULL,            0xfe4200000ULL,        },        .tcx_base     = 0x820000000ULL,        .slavio_base  = 0xf00000000ULL,        .ms_kb_base   = 0xf00240000ULL,        .serial_base  = 0xf00200000ULL,        .nvram_base   = 0xf00280000ULL,        .counter_base = 0xf00300000ULL,        .espdma_base  = 0x800081000ULL,        .esp_base     = 0x800080000ULL,        .ledma_base   = 0x800040000ULL,        .le_base      = 0x800060000ULL,        .sbi_base     = 0xf02800000ULL,        .vram_size    = 0x00100000,        .nvram_size   = 0x2000,        .esp_irq = 3,        .le_irq = 4,        .clock_irq = 14,        .clock1_irq = 10,        .ms_kb_irq = 12,        .ser_irq = 12,        .machine_id = 0x80,        .iounit_version = 0x03000000,        .max_mem = 0xffffffff, // XXX actually first 62GB ok        .default_cpu_model = "TI SuperSparc II",    },};static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, int RAM_size,                          const char *boot_device,                          DisplayState *ds, const char *kernel_filename,                          const char *kernel_cmdline,                          const char *initrd_filename, const char *cpu_model){    CPUState *env, *envs[MAX_CPUS];    unsigned int i;    void *iounits[MAX_IOUNITS], *espdma, *ledma, *main_esp, *nvram, *sbi;    qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq,        *espdma_irq, *ledma_irq;    qemu_irq *esp_reset, *le_reset;    unsigned long prom_offset, kernel_size;    int ret;    char buf[1024];    int index;    /* init CPUs */    if (!cpu_model)        cpu_model = hwdef->default_cpu_model;    for (i = 0; i < smp_cpus; i++) {        env = cpu_init(cpu_model);        if (!env) {            fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");            exit(1);        }        cpu_sparc_set_id(env, i);        envs[i] = env;        if (i == 0) {            qemu_register_reset(main_cpu_reset, env);        } else {            qemu_register_reset(secondary_cpu_reset, env);            env->halted = 1;        }        register_savevm("cpu", i, 3, cpu_save, cpu_load, env);        cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);        env->prom_addr = hwdef->slavio_base;    }    for (i = smp_cpus; i < MAX_CPUS; i++)        cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);    /* allocate RAM */    if ((uint64_t)RAM_size > hwdef->max_mem) {        fprintf(stderr, "qemu: Too much memory for this machine: %d, maximum %d\n",                (unsigned int)RAM_size / (1024 * 1024),                (unsigned int)(hwdef->max_mem / (1024 * 1024)));        exit(1);    }    cpu_register_physical_memory(0, RAM_size, 0);    /* load boot prom */    prom_offset = RAM_size + hwdef->vram_size;    cpu_register_physical_memory(hwdef->slavio_base,                                 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &                                 TARGET_PAGE_MASK,                                 prom_offset | IO_MEM_ROM);    if (bios_name == NULL)        bios_name = PROM_FILENAME;    snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);    ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);    if (ret < 0 || ret > PROM_SIZE_MAX)        ret = load_image(buf, phys_ram_base + prom_offset);    if (ret < 0 || ret > PROM_SIZE_MAX) {        fprintf(stderr, "qemu: could not load prom '%s'\n",                buf);        exit(1);    }    /* set up devices */    sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);    for (i = 0; i < MAX_IOUNITS; i++)        if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1)            iounits[i] = iommu_init(hwdef->iounit_bases[i],                                    hwdef->iounit_version,                                    sbi_irq[hwdef->me_irq]);    espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq],                              iounits[0], &espdma_irq, &esp_reset);    ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq],                             iounits[0], &ledma_irq, &le_reset);    if (graphic_depth != 8 && graphic_depth != 24) {        fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);        exit (1);    }    tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,             hwdef->vram_size, graphic_width, graphic_height, graphic_depth);    if (nd_table[0].model == NULL        || strcmp(nd_table[0].model, "lance") == 0) {        lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);    } else if (strcmp(nd_table[0].model, "?") == 0) {        fprintf(stderr, "qemu: Supported NICs: lance\n");        exit (1);    } else {        fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);        exit (1);    }    nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0,                        hwdef->nvram_size, 8);    slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq],                          sbi_cpu_irq, smp_cpus);    slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq],                              nographic);    // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device    // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device    slavio_serial_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq],                       serial_hds[1], serial_hds[0]);    if (drive_get_max_bus(IF_SCSI) > 0) {        fprintf(stderr, "qemu: too many SCSI bus\n");        exit(1);    }    main_esp = esp_init(hwdef->esp_base, espdma, *espdma_irq,                        esp_reset);    for (i = 0; i < ESP_MAX_DEVS; i++) {        index = drive_get_index(IF_SCSI, 0, i);        if (index == -1)            continue;        esp_scsi_attach(main_esp, drives_table[index].bdrv, i);    }    kernel_size = sun4m_load_kernel(kernel_filename, kernel_cmdline,                                    initrd_filename);    nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,               boot_device, RAM_size, kernel_size, graphic_width,               graphic_height, graphic_depth, hwdef->machine_id, "Sun4d");}/* SPARCserver 1000 hardware initialisation */static void ss1000_init(int RAM_size, int vga_ram_size,                        const char *boot_device, DisplayState *ds,                        const char *kernel_filename, const char *kernel_cmdline,                        const char *initrd_filename, const char *cpu_model){    sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}/* SPARCcenter 2000 hardware initialisation */static void ss2000_init(int RAM_size, int vga_ram_size,                        const char *boot_device, DisplayState *ds,                        const char *kernel_filename, const char *kernel_cmdline,                        const char *initrd_filename, const char *cpu_model){    sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, ds, kernel_filename,                  kernel_cmdline, initrd_filename, cpu_model);}QEMUMachine ss1000_machine = {    "SS-1000",    "Sun4d platform, SPARCserver 1000",    ss1000_init,};QEMUMachine ss2000_machine = {    "SS-2000",    "Sun4d platform, SPARCcenter 2000",    ss2000_init,};

⌨️ 快捷键说明

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