89
static int nvram_boot_set(void *opaque, const char *boot_device)
92
uint8_t image[sizeof(ohwcfg_v3_t)];
93
ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ
94
m48t59_t *nvram = (m48t59_t *)opaque;
96
for (i = 0; i < sizeof(image); i++)
97
image[i] = m48t59_read(nvram, i) & 0xff;
99
pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices),
101
header->nboot_devices = strlen(boot_device) & 0xff;
102
header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
104
for (i = 0; i < sizeof(image); i++)
105
m48t59_write(nvram, i, image[i]);
110
static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
113
const char *boot_devices,
114
uint32_t kernel_image, uint32_t kernel_size,
116
uint32_t initrd_image, uint32_t initrd_size,
117
uint32_t NVRAM_image,
118
int width, int height, int depth,
119
const uint8_t *macaddr)
70
void NVRAM_set_byte (m48t59_t *nvram, uint32_t addr, uint8_t value)
72
m48t59_write(nvram, addr, value);
75
uint8_t NVRAM_get_byte (m48t59_t *nvram, uint32_t addr)
77
return m48t59_read(nvram, addr);
80
void NVRAM_set_word (m48t59_t *nvram, uint32_t addr, uint16_t value)
82
m48t59_write(nvram, addr, value >> 8);
83
m48t59_write(nvram, addr + 1, value & 0xFF);
86
uint16_t NVRAM_get_word (m48t59_t *nvram, uint32_t addr)
90
tmp = m48t59_read(nvram, addr) << 8;
91
tmp |= m48t59_read(nvram, addr + 1);
96
void NVRAM_set_lword (m48t59_t *nvram, uint32_t addr, uint32_t value)
98
m48t59_write(nvram, addr, value >> 24);
99
m48t59_write(nvram, addr + 1, (value >> 16) & 0xFF);
100
m48t59_write(nvram, addr + 2, (value >> 8) & 0xFF);
101
m48t59_write(nvram, addr + 3, value & 0xFF);
104
uint32_t NVRAM_get_lword (m48t59_t *nvram, uint32_t addr)
108
tmp = m48t59_read(nvram, addr) << 24;
109
tmp |= m48t59_read(nvram, addr + 1) << 16;
110
tmp |= m48t59_read(nvram, addr + 2) << 8;
111
tmp |= m48t59_read(nvram, addr + 3);
116
void NVRAM_set_string (m48t59_t *nvram, uint32_t addr,
117
const unsigned char *str, uint32_t max)
121
for (i = 0; i < max && str[i] != '\0'; i++) {
122
m48t59_write(nvram, addr + i, str[i]);
124
m48t59_write(nvram, addr + max - 1, '\0');
127
int NVRAM_get_string (m48t59_t *nvram, uint8_t *dst, uint16_t addr, int max)
132
for (i = 0; i < max; i++) {
133
dst[i] = NVRAM_get_byte(nvram, addr + i);
141
static uint16_t NVRAM_crc_update (uint16_t prev, uint16_t value)
144
uint16_t pd, pd1, pd2;
149
pd2 = ((pd >> 4) & 0x000F) ^ pd1;
150
tmp ^= (pd1 << 3) | (pd1 << 8);
151
tmp ^= pd2 | (pd2 << 7) | (pd2 << 12);
156
uint16_t NVRAM_compute_crc (m48t59_t *nvram, uint32_t start, uint32_t count)
159
uint16_t crc = 0xFFFF;
164
for (i = 0; i != count; i++) {
165
crc = NVRAM_crc_update(crc, NVRAM_get_word(nvram, start + i));
168
crc = NVRAM_crc_update(crc, NVRAM_get_byte(nvram, start + i) << 8);
174
static uint32_t nvram_set_var (m48t59_t *nvram, uint32_t addr,
175
const unsigned char *str)
179
len = strlen(str) + 1;
180
NVRAM_set_string(nvram, addr, str, len);
185
static void nvram_finish_partition (m48t59_t *nvram, uint32_t start,
190
// Length divided by 16
191
m48t59_write(nvram, start + 2, ((end - start) >> 12) & 0xff);
192
m48t59_write(nvram, start + 3, ((end - start) >> 4) & 0xff);
194
sum = m48t59_read(nvram, start);
195
for (i = 0; i < 14; i++) {
196
sum += m48t59_read(nvram, start + 2 + i);
197
sum = (sum + ((sum & 0xff00) >> 8)) & 0xff;
199
m48t59_write(nvram, start + 1, sum & 0xff);
202
extern int nographic;
204
int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
205
const unsigned char *arch,
206
uint32_t RAM_size, int boot_device,
207
uint32_t kernel_image, uint32_t kernel_size,
209
uint32_t initrd_image, uint32_t initrd_size,
210
uint32_t NVRAM_image,
211
int width, int height, int depth)
122
215
uint32_t start, end;
123
uint8_t image[0x1ff0];
124
ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ
125
struct sparc_arch_cfg *sparc_header;
126
struct OpenBIOS_nvpart_v1 *part_header;
128
memset(image, '\0', sizeof(image));
130
// Try to match PPC NVRAM
131
pstrcpy((char *)header->struct_ident, sizeof(header->struct_ident),
133
header->struct_version = cpu_to_be32(3); /* structure v3 */
135
header->nvram_size = cpu_to_be16(NVRAM_size);
136
header->nvram_arch_ptr = cpu_to_be16(sizeof(ohwcfg_v3_t));
137
header->nvram_arch_size = cpu_to_be16(sizeof(struct sparc_arch_cfg));
138
pstrcpy((char *)header->arch, sizeof(header->arch), arch);
139
header->nb_cpus = smp_cpus & 0xff;
140
header->RAM0_base = 0;
141
header->RAM0_size = cpu_to_be64((uint64_t)RAM_size);
142
pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices),
144
header->nboot_devices = strlen(boot_devices) & 0xff;
145
header->kernel_image = cpu_to_be64((uint64_t)kernel_image);
146
header->kernel_size = cpu_to_be64((uint64_t)kernel_size);
217
/* Set parameters for Open Hack'Ware BIOS */
218
NVRAM_set_string(nvram, 0x00, "QEMU_BIOS", 16);
219
NVRAM_set_lword(nvram, 0x10, 0x00000002); /* structure v2 */
220
NVRAM_set_word(nvram, 0x14, NVRAM_size);
221
NVRAM_set_string(nvram, 0x20, arch, 16);
222
NVRAM_set_byte(nvram, 0x2f, nographic & 0xff);
223
NVRAM_set_lword(nvram, 0x30, RAM_size);
224
NVRAM_set_byte(nvram, 0x34, boot_device);
225
NVRAM_set_lword(nvram, 0x38, kernel_image);
226
NVRAM_set_lword(nvram, 0x3C, kernel_size);
148
pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline);
149
header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR);
150
header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline));
228
/* XXX: put the cmdline in NVRAM too ? */
229
strcpy(phys_ram_base + CMDLINE_ADDR, cmdline);
230
NVRAM_set_lword(nvram, 0x40, CMDLINE_ADDR);
231
NVRAM_set_lword(nvram, 0x44, strlen(cmdline));
233
NVRAM_set_lword(nvram, 0x40, 0);
234
NVRAM_set_lword(nvram, 0x44, 0);
152
header->initrd_image = cpu_to_be64((uint64_t)initrd_image);
153
header->initrd_size = cpu_to_be64((uint64_t)initrd_size);
154
header->NVRAM_image = cpu_to_be64((uint64_t)NVRAM_image);
156
header->width = cpu_to_be16(width);
157
header->height = cpu_to_be16(height);
158
header->depth = cpu_to_be16(depth);
160
header->graphic_flags = cpu_to_be16(OHW_GF_NOGRAPHICS);
162
header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
164
// Architecture specific header
165
start = sizeof(ohwcfg_v3_t);
166
sparc_header = (struct sparc_arch_cfg *)&image[start];
167
sparc_header->valid = 0;
168
start += sizeof(struct sparc_arch_cfg);
236
NVRAM_set_lword(nvram, 0x48, initrd_image);
237
NVRAM_set_lword(nvram, 0x4C, initrd_size);
238
NVRAM_set_lword(nvram, 0x50, NVRAM_image);
240
NVRAM_set_word(nvram, 0x54, width);
241
NVRAM_set_word(nvram, 0x56, height);
242
NVRAM_set_word(nvram, 0x58, depth);
243
crc = NVRAM_compute_crc(nvram, 0x00, 0xF8);
244
NVRAM_set_word(nvram, 0xFC, crc);
170
246
// OpenBIOS nvram variables
171
247
// Variable partition
172
part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
173
part_header->signature = OPENBIOS_PART_SYSTEM;
174
pstrcpy(part_header->name, sizeof(part_header->name), "system");
249
m48t59_write(nvram, start, 0x70);
250
NVRAM_set_string(nvram, start + 4, "system", 12);
176
end = start + sizeof(struct OpenBIOS_nvpart_v1);
177
253
for (i = 0; i < nb_prom_envs; i++)
178
end = OpenBIOS_set_var(image, end, prom_envs[i]);
254
end = nvram_set_var(nvram, end, prom_envs[i]);
256
m48t59_write(nvram, end++ , 0);
183
257
end = start + ((end - start + 15) & ~15);
184
OpenBIOS_finish_partition(part_header, end - start);
258
nvram_finish_partition(nvram, start, end);
186
260
// free partition
188
part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
189
part_header->signature = OPENBIOS_PART_FREE;
190
pstrcpy(part_header->name, sizeof(part_header->name), "free");
262
m48t59_write(nvram, start, 0x7f);
263
NVRAM_set_string(nvram, start + 4, "free", 12);
193
OpenBIOS_finish_partition(part_header, end - start);
195
Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, 0x80);
197
for (i = 0; i < sizeof(image); i++)
198
m48t59_write(nvram, i, image[i]);
200
qemu_register_boot_set(nvram_boot_set, nvram);
266
nvram_finish_partition(nvram, start, end);
213
void cpu_check_irqs(CPUState *env)
215
uint32_t pil = env->pil_in | (env->softint & ~SOFTINT_TIMER) |
216
((env->softint & SOFTINT_TIMER) << 14);
218
if (pil && (env->interrupt_index == 0 ||
219
(env->interrupt_index & ~15) == TT_EXTINT)) {
222
for (i = 15; i > 0; i--) {
223
if (pil & (1 << i)) {
224
int old_interrupt = env->interrupt_index;
226
env->interrupt_index = TT_EXTINT | i;
227
if (old_interrupt != env->interrupt_index) {
228
DPRINTF("Set CPU IRQ %d\n", i);
229
cpu_interrupt(env, CPU_INTERRUPT_HARD);
234
} else if (!pil && (env->interrupt_index & ~15) == TT_EXTINT) {
235
DPRINTF("Reset CPU IRQ %d\n", env->interrupt_index & 15);
236
env->interrupt_index = 0;
237
cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
241
static void cpu_set_irq(void *opaque, int irq, int level)
243
CPUState *env = opaque;
246
DPRINTF("Raise CPU IRQ %d\n", irq);
248
env->pil_in |= 1 << irq;
251
DPRINTF("Lower CPU IRQ %d\n", irq);
252
env->pil_in &= ~(1 << irq);
257
279
void qemu_system_powerdown(void)
261
typedef struct ResetData {
266
283
static void main_cpu_reset(void *opaque)
268
ResetData *s = (ResetData *)opaque;
269
CPUState *env = s->env;
285
CPUState *env = opaque;
272
288
ptimer_set_limit(env->tick, 0x7fffffffffffffffULL, 1);
483
449
pci_nic_init(pci_bus, &nd_table[i], -1);
486
irq = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
487
if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) {
488
fprintf(stderr, "qemu: too many IDE bus\n");
491
for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
492
drive_index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS,
494
if (drive_index != -1)
495
hd[i] = drives_table[drive_index].bdrv;
500
// XXX pci_cmd646_ide_init(pci_bus, hd, 1);
501
pci_piix3_ide_init(pci_bus, hd, -1, irq);
452
irq = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, 32);
453
// XXX pci_cmd646_ide_init(pci_bus, bs_table, 1);
454
pci_piix3_ide_init(pci_bus, bs_table, -1, irq);
502
455
/* FIXME: wire up interrupts. */
503
456
i8042_init(NULL/*1*/, NULL/*12*/, 0x60);
504
for(i = 0; i < MAX_FD; i++) {
505
drive_index = drive_get_index(IF_FLOPPY, 0, i);
506
if (drive_index != -1)
507
fd[i] = drives_table[drive_index].bdrv;
511
floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd);
457
floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd_table);
512
458
nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59);
513
sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", RAM_size, boot_devices,
514
KERNEL_LOAD_ADDR, kernel_size,
516
INITRD_LOAD_ADDR, initrd_size,
517
/* XXX: need an option to load a NVRAM image */
519
graphic_width, graphic_height, graphic_depth,
520
(uint8_t *)&nd_table[0].macaddr);
522
fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0);
523
fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
524
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
525
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
534
static const struct hwdef hwdefs[] = {
535
/* Sun4u generic PC-like machine */
537
.default_cpu_model = "TI UltraSparc II",
538
.machine_id = sun4u_id,
539
.prom_addr = 0x1fff0000000ULL,
540
.console_serial_base = 0,
542
/* Sun4v generic PC-like machine */
544
.default_cpu_model = "Sun UltraSparc T1",
545
.machine_id = sun4v_id,
546
.prom_addr = 0x1fff0000000ULL,
547
.console_serial_base = 0,
549
/* Sun4v generic Niagara machine */
551
.default_cpu_model = "Sun UltraSparc T1",
552
.machine_id = niagara_id,
553
.prom_addr = 0xfff0000000ULL,
554
.console_serial_base = 0xfff0c2c000ULL,
558
/* Sun4u hardware initialisation */
559
static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size,
560
const char *boot_devices, DisplayState *ds,
561
const char *kernel_filename, const char *kernel_cmdline,
562
const char *initrd_filename, const char *cpu_model)
564
sun4uv_init(RAM_size, vga_ram_size, boot_devices, ds, kernel_filename,
565
kernel_cmdline, initrd_filename, cpu_model, &hwdefs[0]);
568
/* Sun4v hardware initialisation */
569
static void sun4v_init(ram_addr_t RAM_size, int vga_ram_size,
570
const char *boot_devices, DisplayState *ds,
571
const char *kernel_filename, const char *kernel_cmdline,
572
const char *initrd_filename, const char *cpu_model)
574
sun4uv_init(RAM_size, vga_ram_size, boot_devices, ds, kernel_filename,
575
kernel_cmdline, initrd_filename, cpu_model, &hwdefs[1]);
578
/* Niagara hardware initialisation */
579
static void niagara_init(ram_addr_t RAM_size, int vga_ram_size,
580
const char *boot_devices, DisplayState *ds,
581
const char *kernel_filename, const char *kernel_cmdline,
582
const char *initrd_filename, const char *cpu_model)
584
sun4uv_init(RAM_size, vga_ram_size, boot_devices, ds, kernel_filename,
585
kernel_cmdline, initrd_filename, cpu_model, &hwdefs[2]);
459
sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", ram_size, boot_device,
460
KERNEL_LOAD_ADDR, kernel_size,
462
INITRD_LOAD_ADDR, initrd_size,
463
/* XXX: need an option to load a NVRAM image */
465
graphic_width, graphic_height, graphic_depth);
588
469
QEMUMachine sun4u_machine = {
590
.desc = "Sun4u platform",
592
.ram_require = PROM_SIZE_MAX + VGA_RAM_SIZE,
594
.max_cpus = 1, // XXX for now
597
QEMUMachine sun4v_machine = {
599
.desc = "Sun4v platform",
601
.ram_require = PROM_SIZE_MAX + VGA_RAM_SIZE,
603
.max_cpus = 1, // XXX for now
606
QEMUMachine niagara_machine = {
608
.desc = "Sun4v platform, Niagara",
609
.init = niagara_init,
610
.ram_require = PROM_SIZE_MAX + VGA_RAM_SIZE,
612
.max_cpus = 1, // XXX for now