mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-target-arm-20221027' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target-arm queue: * Implement FEAT_E0PD * Implement FEAT_HAFDBS * honor HCR_E2H and HCR_TGE in arm_excp_unmasked() * hw/arm/virt: Fix devicetree warnings about the virtio-iommu node * hw/core/resettable: fix reset level counting * hw/hyperv/hyperv.c: Use device_cold_reset() instead of device_legacy_reset() * imx: reload cmp timer outside of the reload ptimer transaction * x86: do not re-randomize RNG seed on snapshot load * m68k/virt: do not re-randomize RNG seed on snapshot load * m68k/q800: do not re-randomize RNG seed on snapshot load * arm: re-randomize rng-seed on reboot * riscv: re-randomize rng-seed on reboot * mips/boston: re-randomize rng-seed on reboot * openrisc: re-randomize rng-seed on reboot * rx: re-randomize rng-seed on reboot # -----BEGIN PGP SIGNATURE----- # # iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmNagAQZHHBldGVyLm1h # eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3sv6D/0VXf61t6IcmQ342L5IeUeA # jixouWQhma3WwFDjbEo3BehgBhdwH2gxF8XWZNudV1x5P4JbCwiD/sm9FKtNY3IX # lOpcg4F7Ge6EHCEQ5PM75G4TNQBw1BTwGuNrXm8kpVZ7i7C4Zo3gzbqVYv59d406 # fMwZBZwwavn9xYI/ZOUq3CKv2W/xrveFIEfafQB1mmcu4azZRLlOdMXvsMY/Te1/ # GQ+0RPcemNfvfFwYfMKT9dqiCWgqzAoiGQNH2944mTnoJJMsI0JLcXP2z/4fFfYv # J1m7mhOO9KiqUWzxJofQOgQIic1q6AY0lLw272mA/rbwwlmlm/bNl1DGE5Lyw64d # t/dDWE6X8IHPqPzqqrOd8vpKIKUriDSL83D5uULpPXaQwyckTFDsAMu5VX4uswbm # B+SizTghSNwMbOq1XsQg6DDiHEelbwwrltsLOSQujXrrngtSxjWXuFgWem4gT8HL # uVQtrfrASV/gNBLRNX73vuL6pJaTEVqk53JI8MamZEIRLO1s6/nreOR13E+0611T # iMywoOhAQA3RDe9NU0zgg6EGyskRZQG1CRTDQAz1sAt8WcHokg7Yj7LlfGE+/+Bh # 4cIuJI56Uf3DJF51A52+roaQkZDJZZkfE1EG8uMDIWszP5v2GDcwx3AS3FLuaDfH # QHPsecbzEURFTmdt5VrKzg== # =RD6C # -----END PGP SIGNATURE----- # gpg: Signature made Thu 27 Oct 2022 08:56:36 EDT # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [full] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [full] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [full] # gpg: aka "Peter Maydell <peter@archaic.org.uk>" [unknown] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * tag 'pull-target-arm-20221027' of https://git.linaro.org/people/pmaydell/qemu-arm: (31 commits) mips/malta: pass RNG seed via env var and re-randomize on reboot rx: re-randomize rng-seed on reboot openrisc: re-randomize rng-seed on reboot mips/boston: re-randomize rng-seed on reboot m68k/q800: do not re-randomize RNG seed on snapshot load m68k/virt: do not re-randomize RNG seed on snapshot load riscv: re-randomize rng-seed on reboot arm: re-randomize rng-seed on reboot x86: do not re-randomize RNG seed on snapshot load device-tree: add re-randomization helper function reset: allow registering handlers that aren't called by snapshot loading target/arm: Use the max page size in a 2-stage ptw target/arm: Implement FEAT_HAFDBS, dirty bit portion target/arm: Implement FEAT_HAFDBS, access flag portion target/arm: Tidy merging of attributes from descriptor and table target/arm: Consider GP an attribute in get_phys_addr_lpae target/arm: Don't shift attrs in get_phys_addr_lpae target/arm: Fix fault reporting in get_phys_addr_lpae target/arm: Remove loop from get_phys_addr_lpae target/arm: Add ARMFault_UnsuppAtomicUpdate ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -210,9 +210,11 @@ Polling the reset state
|
||||
Resettable interface provides the ``resettable_is_in_reset()`` function.
|
||||
This function returns true if the object parameter is currently under reset.
|
||||
|
||||
An object is under reset from the beginning of the *init* phase to the end of
|
||||
the *exit* phase. During all three phases, the function will return that the
|
||||
object is in reset.
|
||||
An object is under reset from the beginning of the *enter* phase (before
|
||||
either its children or its own enter method is called) to the *exit*
|
||||
phase. During *enter* and *hold* phase only, the function will return that the
|
||||
object is in reset. The state is changed after the *exit* is propagated to
|
||||
its children and just before calling the object's own *exit* method.
|
||||
|
||||
This function may be used if the object behavior has to be adapted
|
||||
while in reset state. For example if a device has an irq input,
|
||||
|
||||
@@ -24,6 +24,7 @@ the following architecture extensions:
|
||||
- FEAT_Debugv8p4 (Debug changes for v8.4)
|
||||
- FEAT_DotProd (Advanced SIMD dot product instructions)
|
||||
- FEAT_DoubleFault (Double Fault Extension)
|
||||
- FEAT_E0PD (Preventing EL0 access to halves of address maps)
|
||||
- FEAT_ETS (Enhanced Translation Synchronization)
|
||||
- FEAT_FCMA (Floating-point complex number instructions)
|
||||
- FEAT_FHM (Floating-point half-precision multiplication instructions)
|
||||
@@ -32,6 +33,7 @@ the following architecture extensions:
|
||||
- FEAT_FlagM (Flag manipulation instructions v2)
|
||||
- FEAT_FlagM2 (Enhancements to flag manipulation instructions)
|
||||
- FEAT_GTG (Guest translation granule size)
|
||||
- FEAT_HAFDBS (Hardware management of the access flag and dirty bit state)
|
||||
- FEAT_HCX (Support for the HCRX_EL2 register)
|
||||
- FEAT_HPDS (Hierarchical permission disables)
|
||||
- FEAT_I8MM (AArch64 Int8 matrix multiplication instructions)
|
||||
|
||||
+2
-2
@@ -1356,12 +1356,12 @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
|
||||
aspeed_soc_num_cpus(amc->soc_name);
|
||||
}
|
||||
|
||||
static void fby35_reset(MachineState *state)
|
||||
static void fby35_reset(MachineState *state, ShutdownCause reason)
|
||||
{
|
||||
AspeedMachineState *bmc = ASPEED_MACHINE(state);
|
||||
AspeedGPIOState *gpio = &bmc->soc.gpio;
|
||||
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
|
||||
/* Board ID: 7 (Class-1, 4 slots) */
|
||||
object_property_set_bool(OBJECT(gpio), "gpioV4", true, &error_fatal);
|
||||
|
||||
@@ -683,6 +683,8 @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
|
||||
* the DTB is copied again upon reset, even if addr points into RAM.
|
||||
*/
|
||||
rom_add_blob_fixed_as("dtb", fdt, size, addr, as);
|
||||
qemu_register_reset_nosnapshotload(qemu_fdt_randomize_seeds,
|
||||
rom_ptr_for_as(as, addr, size));
|
||||
|
||||
g_free(fdt);
|
||||
|
||||
|
||||
+2
-2
@@ -1239,7 +1239,7 @@ static void mps2_set_remap(Object *obj, const char *value, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
static void mps2_machine_reset(MachineState *machine)
|
||||
static void mps2_machine_reset(MachineState *machine, ShutdownCause reason)
|
||||
{
|
||||
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
|
||||
|
||||
@@ -1249,7 +1249,7 @@ static void mps2_machine_reset(MachineState *machine)
|
||||
* reset see the correct mapping.
|
||||
*/
|
||||
remap_memory(mms, mms->remap);
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
}
|
||||
|
||||
static void mps2tz_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
+3
-2
@@ -1371,14 +1371,15 @@ static void create_smmu(const VirtMachineState *vms,
|
||||
|
||||
static void create_virtio_iommu_dt_bindings(VirtMachineState *vms)
|
||||
{
|
||||
const char compat[] = "virtio,pci-iommu";
|
||||
const char compat[] = "virtio,pci-iommu\0pci1af4,1057";
|
||||
uint16_t bdf = vms->virtio_iommu_bdf;
|
||||
MachineState *ms = MACHINE(vms);
|
||||
char *node;
|
||||
|
||||
vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt);
|
||||
|
||||
node = g_strdup_printf("%s/virtio_iommu@%d", vms->pciehb_nodename, bdf);
|
||||
node = g_strdup_printf("%s/virtio_iommu@%x,%x", vms->pciehb_nodename,
|
||||
PCI_SLOT(bdf), PCI_FUNC(bdf));
|
||||
qemu_fdt_add_subnode(ms->fdt, node);
|
||||
qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat));
|
||||
qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg",
|
||||
|
||||
+16
-1
@@ -33,6 +33,7 @@ typedef struct QEMUResetEntry {
|
||||
QTAILQ_ENTRY(QEMUResetEntry) entry;
|
||||
QEMUResetHandler *func;
|
||||
void *opaque;
|
||||
bool skip_on_snapshot_load;
|
||||
} QEMUResetEntry;
|
||||
|
||||
static QTAILQ_HEAD(, QEMUResetEntry) reset_handlers =
|
||||
@@ -47,6 +48,16 @@ void qemu_register_reset(QEMUResetHandler *func, void *opaque)
|
||||
QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
|
||||
}
|
||||
|
||||
void qemu_register_reset_nosnapshotload(QEMUResetHandler *func, void *opaque)
|
||||
{
|
||||
QEMUResetEntry *re = g_new0(QEMUResetEntry, 1);
|
||||
|
||||
re->func = func;
|
||||
re->opaque = opaque;
|
||||
re->skip_on_snapshot_load = true;
|
||||
QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
|
||||
}
|
||||
|
||||
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
|
||||
{
|
||||
QEMUResetEntry *re;
|
||||
@@ -60,12 +71,16 @@ void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
void qemu_devices_reset(void)
|
||||
void qemu_devices_reset(ShutdownCause reason)
|
||||
{
|
||||
QEMUResetEntry *re, *nre;
|
||||
|
||||
/* reset all devices */
|
||||
QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
|
||||
if (reason == SHUTDOWN_CAUSE_SNAPSHOT_LOAD &&
|
||||
re->skip_on_snapshot_load) {
|
||||
continue;
|
||||
}
|
||||
re->func(re->opaque);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,12 +201,11 @@ static void resettable_phase_exit(Object *obj, void *opaque, ResetType type)
|
||||
resettable_child_foreach(rc, obj, resettable_phase_exit, NULL, type);
|
||||
|
||||
assert(s->count > 0);
|
||||
if (s->count == 1) {
|
||||
if (--s->count == 0) {
|
||||
trace_resettable_phase_exit_exec(obj, obj_typename, !!rc->phases.exit);
|
||||
if (rc->phases.exit && !resettable_get_tr_func(rc, obj)) {
|
||||
rc->phases.exit(obj);
|
||||
}
|
||||
s->count = 0;
|
||||
}
|
||||
s->exit_phase_in_progress = false;
|
||||
trace_resettable_phase_exit_end(obj, obj_typename, s->count);
|
||||
|
||||
+2
-2
@@ -411,12 +411,12 @@ static void machine_hppa_init(MachineState *machine)
|
||||
cpu[0]->env.gr[19] = FW_CFG_IO_BASE;
|
||||
}
|
||||
|
||||
static void hppa_machine_reset(MachineState *ms)
|
||||
static void hppa_machine_reset(MachineState *ms, ShutdownCause reason)
|
||||
{
|
||||
unsigned int smp_cpus = ms->smp.cpus;
|
||||
int i;
|
||||
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
|
||||
/* Start all CPUs at the firmware entry point.
|
||||
* Monarch CPU will initialize firmware, secondary CPUs
|
||||
|
||||
+1
-1
@@ -157,7 +157,7 @@ void hyperv_synic_reset(CPUState *cs)
|
||||
SynICState *synic = get_synic(cs);
|
||||
|
||||
if (synic) {
|
||||
device_legacy_reset(DEVICE(synic));
|
||||
device_cold_reset(DEVICE(synic));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -467,7 +467,7 @@ static void microvm_machine_state_init(MachineState *machine)
|
||||
microvm_devices_init(mms);
|
||||
}
|
||||
|
||||
static void microvm_machine_reset(MachineState *machine)
|
||||
static void microvm_machine_reset(MachineState *machine, ShutdownCause reason)
|
||||
{
|
||||
MicrovmMachineState *mms = MICROVM_MACHINE(machine);
|
||||
CPUState *cs;
|
||||
@@ -480,7 +480,7 @@ static void microvm_machine_reset(MachineState *machine)
|
||||
mms->kernel_cmdline_fixed = true;
|
||||
}
|
||||
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
|
||||
CPU_FOREACH(cs) {
|
||||
cpu = X86_CPU(cs);
|
||||
|
||||
+3
-3
@@ -1847,12 +1847,12 @@ static void pc_machine_initfn(Object *obj)
|
||||
cxl_machine_init(obj, &pcms->cxl_devices_state);
|
||||
}
|
||||
|
||||
static void pc_machine_reset(MachineState *machine)
|
||||
static void pc_machine_reset(MachineState *machine, ShutdownCause reason)
|
||||
{
|
||||
CPUState *cs;
|
||||
X86CPU *cpu;
|
||||
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
|
||||
/* Reset APIC after devices have been reset to cancel
|
||||
* any changes that qemu_devices_reset() might have done.
|
||||
@@ -1867,7 +1867,7 @@ static void pc_machine_reset(MachineState *machine)
|
||||
static void pc_machine_wakeup(MachineState *machine)
|
||||
{
|
||||
cpu_synchronize_all_states();
|
||||
pc_machine_reset(machine);
|
||||
pc_machine_reset(machine, SHUTDOWN_CAUSE_NONE);
|
||||
cpu_synchronize_all_post_reset();
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1111,7 +1111,7 @@ void x86_load_linux(X86MachineState *x86ms,
|
||||
setup_data->type = cpu_to_le32(SETUP_RNG_SEED);
|
||||
setup_data->len = cpu_to_le32(RNG_SEED_LENGTH);
|
||||
qemu_guest_getrandom_nofail(setup_data->data, RNG_SEED_LENGTH);
|
||||
qemu_register_reset(reset_rng_seed, setup_data);
|
||||
qemu_register_reset_nosnapshotload(reset_rng_seed, setup_data);
|
||||
fw_cfg_add_bytes_callback(fw_cfg, FW_CFG_KERNEL_DATA, reset_rng_seed, NULL,
|
||||
setup_data, kernel, kernel_size, true);
|
||||
} else {
|
||||
|
||||
+13
-20
@@ -321,27 +321,23 @@ static const TypeInfo glue_info = {
|
||||
},
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
M68kCPU *cpu;
|
||||
struct bi_record *rng_seed;
|
||||
} ResetInfo;
|
||||
|
||||
static void main_cpu_reset(void *opaque)
|
||||
{
|
||||
ResetInfo *reset_info = opaque;
|
||||
M68kCPU *cpu = reset_info->cpu;
|
||||
M68kCPU *cpu = opaque;
|
||||
CPUState *cs = CPU(cpu);
|
||||
|
||||
if (reset_info->rng_seed) {
|
||||
qemu_guest_getrandom_nofail((void *)reset_info->rng_seed->data + 2,
|
||||
be16_to_cpu(*(uint16_t *)reset_info->rng_seed->data));
|
||||
}
|
||||
|
||||
cpu_reset(cs);
|
||||
cpu->env.aregs[7] = ldl_phys(cs->as, 0);
|
||||
cpu->env.pc = ldl_phys(cs->as, 4);
|
||||
}
|
||||
|
||||
static void rerandomize_rng_seed(void *opaque)
|
||||
{
|
||||
struct bi_record *rng_seed = opaque;
|
||||
qemu_guest_getrandom_nofail((void *)rng_seed->data + 2,
|
||||
be16_to_cpu(*(uint16_t *)rng_seed->data));
|
||||
}
|
||||
|
||||
static uint8_t fake_mac_rom[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
|
||||
@@ -397,7 +393,6 @@ static void q800_init(MachineState *machine)
|
||||
NubusBus *nubus;
|
||||
DeviceState *glue;
|
||||
DriveInfo *dinfo;
|
||||
ResetInfo *reset_info;
|
||||
uint8_t rng_seed[32];
|
||||
|
||||
linux_boot = (kernel_filename != NULL);
|
||||
@@ -408,12 +403,9 @@ static void q800_init(MachineState *machine)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
reset_info = g_new0(ResetInfo, 1);
|
||||
|
||||
/* init CPUs */
|
||||
cpu = M68K_CPU(cpu_create(machine->cpu_type));
|
||||
reset_info->cpu = cpu;
|
||||
qemu_register_reset(main_cpu_reset, reset_info);
|
||||
qemu_register_reset(main_cpu_reset, cpu);
|
||||
|
||||
/* RAM */
|
||||
memory_region_add_subregion(get_system_memory(), 0, machine->ram);
|
||||
@@ -687,9 +679,10 @@ static void q800_init(MachineState *machine)
|
||||
BOOTINFO0(param_ptr, BI_LAST);
|
||||
rom_add_blob_fixed_as("bootinfo", param_blob, param_ptr - param_blob,
|
||||
parameters_base, cs->as);
|
||||
reset_info->rng_seed = rom_ptr_for_as(cs->as, parameters_base,
|
||||
param_ptr - param_blob) +
|
||||
(param_rng_seed - param_blob);
|
||||
qemu_register_reset_nosnapshotload(rerandomize_rng_seed,
|
||||
rom_ptr_for_as(cs->as, parameters_base,
|
||||
param_ptr - param_blob) +
|
||||
(param_rng_seed - param_blob));
|
||||
g_free(param_blob);
|
||||
} else {
|
||||
uint8_t *ptr;
|
||||
|
||||
+11
-9
@@ -89,7 +89,6 @@ typedef struct {
|
||||
M68kCPU *cpu;
|
||||
hwaddr initial_pc;
|
||||
hwaddr initial_stack;
|
||||
struct bi_record *rng_seed;
|
||||
} ResetInfo;
|
||||
|
||||
static void main_cpu_reset(void *opaque)
|
||||
@@ -98,16 +97,18 @@ static void main_cpu_reset(void *opaque)
|
||||
M68kCPU *cpu = reset_info->cpu;
|
||||
CPUState *cs = CPU(cpu);
|
||||
|
||||
if (reset_info->rng_seed) {
|
||||
qemu_guest_getrandom_nofail((void *)reset_info->rng_seed->data + 2,
|
||||
be16_to_cpu(*(uint16_t *)reset_info->rng_seed->data));
|
||||
}
|
||||
|
||||
cpu_reset(cs);
|
||||
cpu->env.aregs[7] = reset_info->initial_stack;
|
||||
cpu->env.pc = reset_info->initial_pc;
|
||||
}
|
||||
|
||||
static void rerandomize_rng_seed(void *opaque)
|
||||
{
|
||||
struct bi_record *rng_seed = opaque;
|
||||
qemu_guest_getrandom_nofail((void *)rng_seed->data + 2,
|
||||
be16_to_cpu(*(uint16_t *)rng_seed->data));
|
||||
}
|
||||
|
||||
static void virt_init(MachineState *machine)
|
||||
{
|
||||
M68kCPU *cpu = NULL;
|
||||
@@ -289,9 +290,10 @@ static void virt_init(MachineState *machine)
|
||||
BOOTINFO0(param_ptr, BI_LAST);
|
||||
rom_add_blob_fixed_as("bootinfo", param_blob, param_ptr - param_blob,
|
||||
parameters_base, cs->as);
|
||||
reset_info->rng_seed = rom_ptr_for_as(cs->as, parameters_base,
|
||||
param_ptr - param_blob) +
|
||||
(param_rng_seed - param_blob);
|
||||
qemu_register_reset_nosnapshotload(rerandomize_rng_seed,
|
||||
rom_ptr_for_as(cs->as, parameters_base,
|
||||
param_ptr - param_blob) +
|
||||
(param_rng_seed - param_blob));
|
||||
g_free(param_blob);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/qtest.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "sysemu/reset.h"
|
||||
|
||||
#include <libfdt.h>
|
||||
#include "qom/object.h"
|
||||
@@ -810,6 +811,8 @@ static void boston_mach_init(MachineState *machine)
|
||||
/* Calculate real fdt size after filter */
|
||||
dt_size = fdt_totalsize(dtb_load_data);
|
||||
rom_add_blob_fixed("dtb", dtb_load_data, dt_size, dtb_paddr);
|
||||
qemu_register_reset_nosnapshotload(qemu_fdt_randomize_seeds,
|
||||
rom_ptr(dtb_paddr, dt_size));
|
||||
} else {
|
||||
/* Try to load file as FIT */
|
||||
fit_err = load_fit(&boston_fit_loader, machine->kernel_filename, s);
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/bitops.h"
|
||||
#include "qemu/datadir.h"
|
||||
#include "qemu/guest-random.h"
|
||||
#include "hw/clock.h"
|
||||
#include "hw/southbridge/piix.h"
|
||||
#include "hw/isa/superio.h"
|
||||
@@ -1017,6 +1018,17 @@ static void G_GNUC_PRINTF(3, 4) prom_set(uint32_t *prom_buf, int index,
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
static void reinitialize_rng_seed(void *opaque)
|
||||
{
|
||||
char *rng_seed_hex = opaque;
|
||||
uint8_t rng_seed[32];
|
||||
|
||||
qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
|
||||
for (size_t i = 0; i < sizeof(rng_seed); ++i) {
|
||||
sprintf(rng_seed_hex + i * 2, "%02x", rng_seed[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Kernel */
|
||||
static uint64_t load_kernel(void)
|
||||
{
|
||||
@@ -1028,6 +1040,9 @@ static uint64_t load_kernel(void)
|
||||
long prom_size;
|
||||
int prom_index = 0;
|
||||
uint64_t (*xlate_to_kseg0) (void *opaque, uint64_t addr);
|
||||
uint8_t rng_seed[32];
|
||||
char rng_seed_hex[sizeof(rng_seed) * 2 + 1];
|
||||
size_t rng_seed_prom_offset;
|
||||
|
||||
#if TARGET_BIG_ENDIAN
|
||||
big_endian = 1;
|
||||
@@ -1115,9 +1130,21 @@ static uint64_t load_kernel(void)
|
||||
|
||||
prom_set(prom_buf, prom_index++, "modetty0");
|
||||
prom_set(prom_buf, prom_index++, "38400n8r");
|
||||
|
||||
qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
|
||||
for (size_t i = 0; i < sizeof(rng_seed); ++i) {
|
||||
sprintf(rng_seed_hex + i * 2, "%02x", rng_seed[i]);
|
||||
}
|
||||
prom_set(prom_buf, prom_index++, "rngseed");
|
||||
rng_seed_prom_offset = prom_index * ENVP_ENTRY_SIZE +
|
||||
sizeof(uint32_t) * ENVP_NB_ENTRIES;
|
||||
prom_set(prom_buf, prom_index++, "%s", rng_seed_hex);
|
||||
|
||||
prom_set(prom_buf, prom_index++, NULL);
|
||||
|
||||
rom_add_blob_fixed("prom", prom_buf, prom_size, ENVP_PADDR);
|
||||
qemu_register_reset_nosnapshotload(reinitialize_rng_seed,
|
||||
rom_ptr(ENVP_PADDR, prom_size) + rng_seed_prom_offset);
|
||||
|
||||
g_free(prom_buf);
|
||||
return kernel_entry;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "hw/openrisc/boot.h"
|
||||
#include "sysemu/device_tree.h"
|
||||
#include "sysemu/qtest.h"
|
||||
#include "sysemu/reset.h"
|
||||
|
||||
#include <libfdt.h>
|
||||
|
||||
@@ -111,6 +112,8 @@ uint32_t openrisc_load_fdt(void *fdt, hwaddr load_start,
|
||||
|
||||
rom_add_blob_fixed_as("fdt", fdt, fdtsize, fdt_addr,
|
||||
&address_space_memory);
|
||||
qemu_register_reset_nosnapshotload(qemu_fdt_randomize_seeds,
|
||||
rom_ptr_for_as(&address_space_memory, fdt_addr, fdtsize));
|
||||
|
||||
return fdt_addr;
|
||||
}
|
||||
|
||||
+2
-2
@@ -248,14 +248,14 @@ static void pegasos2_pci_config_write(Pegasos2MachineState *pm, int bus,
|
||||
pegasos2_mv_reg_write(pm, pcicfg + 4, len, val);
|
||||
}
|
||||
|
||||
static void pegasos2_machine_reset(MachineState *machine)
|
||||
static void pegasos2_machine_reset(MachineState *machine, ShutdownCause reason)
|
||||
{
|
||||
Pegasos2MachineState *pm = PEGASOS2_MACHINE(machine);
|
||||
void *fdt;
|
||||
uint64_t d[2];
|
||||
int sz;
|
||||
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
if (!pm->vof) {
|
||||
return; /* Firmware should set up machine so nothing to do */
|
||||
}
|
||||
|
||||
+2
-2
@@ -643,13 +643,13 @@ static void pnv_powerdown_notify(Notifier *n, void *opaque)
|
||||
}
|
||||
}
|
||||
|
||||
static void pnv_reset(MachineState *machine)
|
||||
static void pnv_reset(MachineState *machine, ShutdownCause reason)
|
||||
{
|
||||
PnvMachineState *pnv = PNV_MACHINE(machine);
|
||||
IPMIBmc *bmc;
|
||||
void *fdt;
|
||||
|
||||
qemu_devices_reset();
|
||||
qemu_devices_reset(reason);
|
||||
|
||||
/*
|
||||
* The machine should provide by default an internal BMC simulator.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user