machine.c (b57e3e9785271a20b00f43d469b3011d0127e565) machine.c (bfdf22bc769a56d8e1fe7c72a28ef05c0a6d8596)
1/*
2 * QEMU HPPA hardware system emulator.
3 * Copyright 2018 Helge Deller <deller@gmx.de>
4 */
5
6#include "qemu/osdep.h"
7#include "qemu-common.h"
8#include "cpu.h"

--- 83 unchanged lines hidden (view full) ---

92static FWCfgState *create_fw_cfg(MachineState *ms)
93{
94 FWCfgState *fw_cfg;
95 uint64_t val;
96
97 fw_cfg = fw_cfg_init_mem(FW_CFG_IO_BASE, FW_CFG_IO_BASE + 4);
98 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, ms->smp.cpus);
99 fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, HPPA_MAX_CPUS);
1/*
2 * QEMU HPPA hardware system emulator.
3 * Copyright 2018 Helge Deller <deller@gmx.de>
4 */
5
6#include "qemu/osdep.h"
7#include "qemu-common.h"
8#include "cpu.h"

--- 83 unchanged lines hidden (view full) ---

92static FWCfgState *create_fw_cfg(MachineState *ms)
93{
94 FWCfgState *fw_cfg;
95 uint64_t val;
96
97 fw_cfg = fw_cfg_init_mem(FW_CFG_IO_BASE, FW_CFG_IO_BASE + 4);
98 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, ms->smp.cpus);
99 fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, HPPA_MAX_CPUS);
100 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, ram_size);
100 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, ms->ram_size);
101
102 val = cpu_to_le64(MIN_SEABIOS_HPPA_VERSION);
103 fw_cfg_add_file(fw_cfg, "/etc/firmware-min-version",
104 g_memdup(&val, sizeof(val)), sizeof(val));
105
106 val = cpu_to_le64(HPPA_TLB_ENTRIES);
107 fw_cfg_add_file(fw_cfg, "/etc/cpu/tlb_entries",
108 g_memdup(&val, sizeof(val)), sizeof(val));

--- 174 unchanged lines hidden (view full) ---

283 exit(1);
284 }
285
286 /* Load the initrd image high in memory.
287 Mirror the algorithm used by palo:
288 (1) Due to sign-extension problems and PDC,
289 put the initrd no higher than 1G.
290 (2) Reserve 64k for stack. */
101
102 val = cpu_to_le64(MIN_SEABIOS_HPPA_VERSION);
103 fw_cfg_add_file(fw_cfg, "/etc/firmware-min-version",
104 g_memdup(&val, sizeof(val)), sizeof(val));
105
106 val = cpu_to_le64(HPPA_TLB_ENTRIES);
107 fw_cfg_add_file(fw_cfg, "/etc/cpu/tlb_entries",
108 g_memdup(&val, sizeof(val)), sizeof(val));

--- 174 unchanged lines hidden (view full) ---

283 exit(1);
284 }
285
286 /* Load the initrd image high in memory.
287 Mirror the algorithm used by palo:
288 (1) Due to sign-extension problems and PDC,
289 put the initrd no higher than 1G.
290 (2) Reserve 64k for stack. */
291 initrd_base = MIN(ram_size, 1 * GiB);
291 initrd_base = MIN(machine->ram_size, 1 * GiB);
292 initrd_base = initrd_base - 64 * KiB;
293 initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
294
295 if (initrd_base < kernel_high) {
296 error_report("kernel and initial ram disk too large!");
297 exit(1);
298 }
299

--- 11 unchanged lines hidden (view full) ---

311 kernel_entry = boot_menu ? 1 : 0;
312 cpu[0]->env.gr[24] = machine->boot_order[0];
313 }
314
315 /* We jump to the firmware entry routine and pass the
316 * various parameters in registers. After firmware initialization,
317 * firmware will start the Linux kernel with ramdisk and cmdline.
318 */
292 initrd_base = initrd_base - 64 * KiB;
293 initrd_base = (initrd_base - initrd_size) & TARGET_PAGE_MASK;
294
295 if (initrd_base < kernel_high) {
296 error_report("kernel and initial ram disk too large!");
297 exit(1);
298 }
299

--- 11 unchanged lines hidden (view full) ---

311 kernel_entry = boot_menu ? 1 : 0;
312 cpu[0]->env.gr[24] = machine->boot_order[0];
313 }
314
315 /* We jump to the firmware entry routine and pass the
316 * various parameters in registers. After firmware initialization,
317 * firmware will start the Linux kernel with ramdisk and cmdline.
318 */
319 cpu[0]->env.gr[26] = ram_size;
319 cpu[0]->env.gr[26] = machine->ram_size;
320 cpu[0]->env.gr[25] = kernel_entry;
321
322 /* tell firmware how many SMP CPUs to present in inventory table */
323 cpu[0]->env.gr[21] = smp_cpus;
324
325 /* tell firmware fw_cfg port */
326 cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
327}

--- 9 unchanged lines hidden (view full) ---

337 * Monarch CPU will initialize firmware, secondary CPUs
338 * will enter a small idle look and wait for rendevouz. */
339 for (i = 0; i < smp_cpus; i++) {
340 cpu_set_pc(CPU(cpu[i]), firmware_entry);
341 cpu[i]->env.gr[5] = CPU_HPA + i * 0x1000;
342 }
343
344 /* already initialized by machine_hppa_init()? */
320 cpu[0]->env.gr[25] = kernel_entry;
321
322 /* tell firmware how many SMP CPUs to present in inventory table */
323 cpu[0]->env.gr[21] = smp_cpus;
324
325 /* tell firmware fw_cfg port */
326 cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
327}

--- 9 unchanged lines hidden (view full) ---

337 * Monarch CPU will initialize firmware, secondary CPUs
338 * will enter a small idle look and wait for rendevouz. */
339 for (i = 0; i < smp_cpus; i++) {
340 cpu_set_pc(CPU(cpu[i]), firmware_entry);
341 cpu[i]->env.gr[5] = CPU_HPA + i * 0x1000;
342 }
343
344 /* already initialized by machine_hppa_init()? */
345 if (cpu[0]->env.gr[26] == ram_size) {
345 if (cpu[0]->env.gr[26] == ms->ram_size) {
346 return;
347 }
348
346 return;
347 }
348
349 cpu[0]->env.gr[26] = ram_size;
349 cpu[0]->env.gr[26] = ms->ram_size;
350 cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
351 cpu[0]->env.gr[24] = 'c';
352 /* gr22/gr23 unused, no initrd while reboot. */
353 cpu[0]->env.gr[21] = smp_cpus;
354 /* tell firmware fw_cfg port */
355 cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
356}
357

--- 17 unchanged lines hidden ---
350 cpu[0]->env.gr[25] = 0; /* no firmware boot menu */
351 cpu[0]->env.gr[24] = 'c';
352 /* gr22/gr23 unused, no initrd while reboot. */
353 cpu[0]->env.gr[21] = smp_cpus;
354 /* tell firmware fw_cfg port */
355 cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
356}
357

--- 17 unchanged lines hidden ---