Pull request m68k branch 20221024

Update rng seed boot parameter
 -----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEEzS913cjjpNwuT1Fz8ww4vT8vvjwFAmNWU7YSHGxhdXJlbnRA
 dml2aWVyLmV1AAoJEPMMOL0/L748C/kQAJHbVrDGCCfw+imsOAOqXBL3K0WpUadP
 T+lCIHpqCPsppJ2ikQlZ95ky0RZREPiRwmwJHQsgaTiVJgKDGJ3hsDuGNAyu3sn4
 C/QFVyH2E7dcrDjSNk+n1nGVw+h6gnH9G6qRYrJZHlQXN9WsaMrcofhjDdPUC9bK
 o2IexKWBs80wJ/k/O9be8hPARkdwbVYRbR3+khtcUVv7sgeoKfUmpUiliIhi1G3G
 jphHEMgWtjyK8HmTyeOujmbOO4RZGhScnCJpUnYitBmun6YWedP+DrOz5kXU5xgP
 vIJOalpPqQt+Fpe6OF5fBXwLl0QNPlLjhBP+YXe6inKWHk3RYZRYbFNz4+HZt6WY
 i5wO0pz77vzL6+7nnESS7Q9g/8ASQcUgOsswUBY2uhQoGUG8LuUl2O5SyJWGB41o
 MjNq+h7PcFD8MalLMMvf5jKIuZ0lJrkirUXbTXlGu19ynyf0lASY773cENch+ApS
 fu2De777qwYDx3CvR+K5oObiTqUTplQT9Mq+yUlD5mgJs1bCP+XPFGlL+JemgR25
 EjV5kLDY2f5i0hb7ZQ8IEL3O4siW9GoHXBBFkLY3WPO36Nd71cfhzVv2jUaoSyom
 xsFsJ/TGBapdiDj2Y5DjZQWrUIsm3TgcwATLhEyH2+Bt4hLd+yI6s1m16vVUn74O
 UgMzybUqLwk0
 =B+rc
 -----END PGP SIGNATURE-----

Merge tag 'm68k-for-7.2-pull-request' of https://github.com/vivier/qemu-m68k into staging

Pull request m68k branch 20221024

Update rng seed boot parameter

# -----BEGIN PGP SIGNATURE-----
#
# iQJGBAABCAAwFiEEzS913cjjpNwuT1Fz8ww4vT8vvjwFAmNWU7YSHGxhdXJlbnRA
# dml2aWVyLmV1AAoJEPMMOL0/L748C/kQAJHbVrDGCCfw+imsOAOqXBL3K0WpUadP
# T+lCIHpqCPsppJ2ikQlZ95ky0RZREPiRwmwJHQsgaTiVJgKDGJ3hsDuGNAyu3sn4
# C/QFVyH2E7dcrDjSNk+n1nGVw+h6gnH9G6qRYrJZHlQXN9WsaMrcofhjDdPUC9bK
# o2IexKWBs80wJ/k/O9be8hPARkdwbVYRbR3+khtcUVv7sgeoKfUmpUiliIhi1G3G
# jphHEMgWtjyK8HmTyeOujmbOO4RZGhScnCJpUnYitBmun6YWedP+DrOz5kXU5xgP
# vIJOalpPqQt+Fpe6OF5fBXwLl0QNPlLjhBP+YXe6inKWHk3RYZRYbFNz4+HZt6WY
# i5wO0pz77vzL6+7nnESS7Q9g/8ASQcUgOsswUBY2uhQoGUG8LuUl2O5SyJWGB41o
# MjNq+h7PcFD8MalLMMvf5jKIuZ0lJrkirUXbTXlGu19ynyf0lASY773cENch+ApS
# fu2De777qwYDx3CvR+K5oObiTqUTplQT9Mq+yUlD5mgJs1bCP+XPFGlL+JemgR25
# EjV5kLDY2f5i0hb7ZQ8IEL3O4siW9GoHXBBFkLY3WPO36Nd71cfhzVv2jUaoSyom
# xsFsJ/TGBapdiDj2Y5DjZQWrUIsm3TgcwATLhEyH2+Bt4hLd+yI6s1m16vVUn74O
# UgMzybUqLwk0
# =B+rc
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 24 Oct 2022 04:58:30 EDT
# gpg:                using RSA key CD2F75DDC8E3A4DC2E4F5173F30C38BD3F2FBE3C
# gpg:                issuer "laurent@vivier.eu"
# gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" [full]
# gpg:                 aka "Laurent Vivier <laurent@vivier.eu>" [full]
# gpg:                 aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" [full]
# Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F  5173 F30C 38BD 3F2F BE3C

* tag 'm68k-for-7.2-pull-request' of https://github.com/vivier/qemu-m68k:
  m68k: write bootinfo as rom section and re-randomize on reboot
  m68k: rework BI_VIRT_RNG_SEED as BI_RNG_SEED

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2022-10-24 14:26:57 -04:00
commit ce58c8ee4d
5 changed files with 129 additions and 62 deletions

View File

@ -12,66 +12,66 @@
#ifndef HW_M68K_BOOTINFO_H #ifndef HW_M68K_BOOTINFO_H
#define HW_M68K_BOOTINFO_H #define HW_M68K_BOOTINFO_H
#define BOOTINFO0(as, base, id) \ #define BOOTINFO0(base, id) \
do { \ do { \
stw_phys(as, base, id); \ stw_p(base, id); \
base += 2; \ base += 2; \
stw_phys(as, base, sizeof(struct bi_record)); \ stw_p(base, sizeof(struct bi_record)); \
base += 2; \ base += 2; \
} while (0) } while (0)
#define BOOTINFO1(as, base, id, value) \ #define BOOTINFO1(base, id, value) \
do { \ do { \
stw_phys(as, base, id); \ stw_p(base, id); \
base += 2; \ base += 2; \
stw_phys(as, base, sizeof(struct bi_record) + 4); \ stw_p(base, sizeof(struct bi_record) + 4); \
base += 2; \ base += 2; \
stl_phys(as, base, value); \ stl_p(base, value); \
base += 4; \ base += 4; \
} while (0) } while (0)
#define BOOTINFO2(as, base, id, value1, value2) \ #define BOOTINFO2(base, id, value1, value2) \
do { \ do { \
stw_phys(as, base, id); \ stw_p(base, id); \
base += 2; \ base += 2; \
stw_phys(as, base, sizeof(struct bi_record) + 8); \ stw_p(base, sizeof(struct bi_record) + 8); \
base += 2; \ base += 2; \
stl_phys(as, base, value1); \ stl_p(base, value1); \
base += 4; \ base += 4; \
stl_phys(as, base, value2); \ stl_p(base, value2); \
base += 4; \ base += 4; \
} while (0) } while (0)
#define BOOTINFOSTR(as, base, id, string) \ #define BOOTINFOSTR(base, id, string) \
do { \ do { \
int i; \ int i; \
stw_phys(as, base, id); \ stw_p(base, id); \
base += 2; \ base += 2; \
stw_phys(as, base, \ stw_p(base, \
(sizeof(struct bi_record) + strlen(string) + \ (sizeof(struct bi_record) + strlen(string) + \
1 /* null termination */ + 3 /* padding */) & ~3); \ 1 /* null termination */ + 3 /* padding */) & ~3); \
base += 2; \ base += 2; \
for (i = 0; string[i]; i++) { \ for (i = 0; string[i]; i++) { \
stb_phys(as, base++, string[i]); \ stb_p(base++, string[i]); \
} \ } \
stb_phys(as, base++, 0); \ stb_p(base++, 0); \
base = (base + 3) & ~3; \ base = QEMU_ALIGN_PTR_UP(base, 4); \
} while (0) } while (0)
#define BOOTINFODATA(as, base, id, data, len) \ #define BOOTINFODATA(base, id, data, len) \
do { \ do { \
int i; \ int i; \
stw_phys(as, base, id); \ stw_p(base, id); \
base += 2; \ base += 2; \
stw_phys(as, base, \ stw_p(base, \
(sizeof(struct bi_record) + len + \ (sizeof(struct bi_record) + len + \
2 /* length field */ + 3 /* padding */) & ~3); \ 2 /* length field */ + 3 /* padding */) & ~3); \
base += 2; \ base += 2; \
stw_phys(as, base, len); \ stw_p(base, len); \
base += 2; \ base += 2; \
for (i = 0; i < len; ++i) { \ for (i = 0; i < len; ++i) { \
stb_phys(as, base++, data[i]); \ stb_p(base++, data[i]); \
} \ } \
base = (base + 3) & ~3; \ base = QEMU_ALIGN_PTR_UP(base, 4); \
} while (0) } while (0)
#endif #endif

View File

@ -23,6 +23,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/datadir.h" #include "qemu/datadir.h"
#include "qemu/guest-random.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "cpu.h" #include "cpu.h"
#include "hw/boards.h" #include "hw/boards.h"
@ -320,11 +321,22 @@ static const TypeInfo glue_info = {
}, },
}; };
typedef struct {
M68kCPU *cpu;
struct bi_record *rng_seed;
} ResetInfo;
static void main_cpu_reset(void *opaque) static void main_cpu_reset(void *opaque)
{ {
M68kCPU *cpu = opaque; ResetInfo *reset_info = opaque;
M68kCPU *cpu = reset_info->cpu;
CPUState *cs = CPU(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_reset(cs);
cpu->env.aregs[7] = ldl_phys(cs->as, 0); cpu->env.aregs[7] = ldl_phys(cs->as, 0);
cpu->env.pc = ldl_phys(cs->as, 4); cpu->env.pc = ldl_phys(cs->as, 4);
@ -385,6 +397,8 @@ static void q800_init(MachineState *machine)
NubusBus *nubus; NubusBus *nubus;
DeviceState *glue; DeviceState *glue;
DriveInfo *dinfo; DriveInfo *dinfo;
ResetInfo *reset_info;
uint8_t rng_seed[32];
linux_boot = (kernel_filename != NULL); linux_boot = (kernel_filename != NULL);
@ -394,9 +408,12 @@ static void q800_init(MachineState *machine)
exit(1); exit(1);
} }
reset_info = g_new0(ResetInfo, 1);
/* init CPUs */ /* init CPUs */
cpu = M68K_CPU(cpu_create(machine->cpu_type)); cpu = M68K_CPU(cpu_create(machine->cpu_type));
qemu_register_reset(main_cpu_reset, cpu); reset_info->cpu = cpu;
qemu_register_reset(main_cpu_reset, reset_info);
/* RAM */ /* RAM */
memory_region_add_subregion(get_system_memory(), 0, machine->ram); memory_region_add_subregion(get_system_memory(), 0, machine->ram);
@ -596,6 +613,14 @@ static void q800_init(MachineState *machine)
cs = CPU(cpu); cs = CPU(cpu);
if (linux_boot) { if (linux_boot) {
uint64_t high; uint64_t high;
void *param_blob, *param_ptr, *param_rng_seed;
if (kernel_cmdline) {
param_blob = g_malloc(strlen(kernel_cmdline) + 1024);
} else {
param_blob = g_malloc(1024);
}
kernel_size = load_elf(kernel_filename, NULL, NULL, NULL, kernel_size = load_elf(kernel_filename, NULL, NULL, NULL,
&elf_entry, NULL, &high, NULL, 1, &elf_entry, NULL, &high, NULL, 1,
EM_68K, 0, 0); EM_68K, 0, 0);
@ -605,23 +630,24 @@ static void q800_init(MachineState *machine)
} }
stl_phys(cs->as, 4, elf_entry); /* reset initial PC */ stl_phys(cs->as, 4, elf_entry); /* reset initial PC */
parameters_base = (high + 1) & ~1; parameters_base = (high + 1) & ~1;
param_ptr = param_blob;
BOOTINFO1(cs->as, parameters_base, BI_MACHTYPE, MACH_MAC); BOOTINFO1(param_ptr, BI_MACHTYPE, MACH_MAC);
BOOTINFO1(cs->as, parameters_base, BI_FPUTYPE, FPU_68040); BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68040);
BOOTINFO1(cs->as, parameters_base, BI_MMUTYPE, MMU_68040); BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68040);
BOOTINFO1(cs->as, parameters_base, BI_CPUTYPE, CPU_68040); BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68040);
BOOTINFO1(cs->as, parameters_base, BI_MAC_CPUID, CPUB_68040); BOOTINFO1(param_ptr, BI_MAC_CPUID, CPUB_68040);
BOOTINFO1(cs->as, parameters_base, BI_MAC_MODEL, MAC_MODEL_Q800); BOOTINFO1(param_ptr, BI_MAC_MODEL, MAC_MODEL_Q800);
BOOTINFO1(cs->as, parameters_base, BOOTINFO1(param_ptr,
BI_MAC_MEMSIZE, ram_size >> 20); /* in MB */ BI_MAC_MEMSIZE, ram_size >> 20); /* in MB */
BOOTINFO2(cs->as, parameters_base, BI_MEMCHUNK, 0, ram_size); BOOTINFO2(param_ptr, BI_MEMCHUNK, 0, ram_size);
BOOTINFO1(cs->as, parameters_base, BI_MAC_VADDR, BOOTINFO1(param_ptr, BI_MAC_VADDR,
VIDEO_BASE + macfb_mode->offset); VIDEO_BASE + macfb_mode->offset);
BOOTINFO1(cs->as, parameters_base, BI_MAC_VDEPTH, graphic_depth); BOOTINFO1(param_ptr, BI_MAC_VDEPTH, graphic_depth);
BOOTINFO1(cs->as, parameters_base, BI_MAC_VDIM, BOOTINFO1(param_ptr, BI_MAC_VDIM,
(graphic_height << 16) | graphic_width); (graphic_height << 16) | graphic_width);
BOOTINFO1(cs->as, parameters_base, BI_MAC_VROW, macfb_mode->stride); BOOTINFO1(param_ptr, BI_MAC_VROW, macfb_mode->stride);
BOOTINFO1(cs->as, parameters_base, BI_MAC_SCCBASE, SCC_BASE); BOOTINFO1(param_ptr, BI_MAC_SCCBASE, SCC_BASE);
rom = g_malloc(sizeof(*rom)); rom = g_malloc(sizeof(*rom));
memory_region_init_ram_ptr(rom, NULL, "m68k_fake_mac.rom", memory_region_init_ram_ptr(rom, NULL, "m68k_fake_mac.rom",
@ -630,10 +656,16 @@ static void q800_init(MachineState *machine)
memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom); memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom);
if (kernel_cmdline) { if (kernel_cmdline) {
BOOTINFOSTR(cs->as, parameters_base, BI_COMMAND_LINE, BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
kernel_cmdline); kernel_cmdline);
} }
/* Pass seed to RNG. */
param_rng_seed = param_ptr;
qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
BOOTINFODATA(param_ptr, BI_RNG_SEED,
rng_seed, sizeof(rng_seed));
/* load initrd */ /* load initrd */
if (initrd_filename) { if (initrd_filename) {
initrd_size = get_image_size(initrd_filename); initrd_size = get_image_size(initrd_filename);
@ -646,13 +678,19 @@ static void q800_init(MachineState *machine)
initrd_base = (ram_size - initrd_size) & TARGET_PAGE_MASK; initrd_base = (ram_size - initrd_size) & TARGET_PAGE_MASK;
load_image_targphys(initrd_filename, initrd_base, load_image_targphys(initrd_filename, initrd_base,
ram_size - initrd_base); ram_size - initrd_base);
BOOTINFO2(cs->as, parameters_base, BI_RAMDISK, initrd_base, BOOTINFO2(param_ptr, BI_RAMDISK, initrd_base,
initrd_size); initrd_size);
} else { } else {
initrd_base = 0; initrd_base = 0;
initrd_size = 0; initrd_size = 0;
} }
BOOTINFO0(cs->as, parameters_base, BI_LAST); 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);
g_free(param_blob);
} else { } else {
uint8_t *ptr; uint8_t *ptr;
/* allocate and load BIOS */ /* allocate and load BIOS */

View File

@ -89,6 +89,7 @@ typedef struct {
M68kCPU *cpu; M68kCPU *cpu;
hwaddr initial_pc; hwaddr initial_pc;
hwaddr initial_stack; hwaddr initial_stack;
struct bi_record *rng_seed;
} ResetInfo; } ResetInfo;
static void main_cpu_reset(void *opaque) static void main_cpu_reset(void *opaque)
@ -97,6 +98,11 @@ static void main_cpu_reset(void *opaque)
M68kCPU *cpu = reset_info->cpu; M68kCPU *cpu = reset_info->cpu;
CPUState *cs = CPU(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_reset(cs);
cpu->env.aregs[7] = reset_info->initial_stack; cpu->env.aregs[7] = reset_info->initial_stack;
cpu->env.pc = reset_info->initial_pc; cpu->env.pc = reset_info->initial_pc;
@ -212,6 +218,13 @@ static void virt_init(MachineState *machine)
if (kernel_filename) { if (kernel_filename) {
CPUState *cs = CPU(cpu); CPUState *cs = CPU(cpu);
uint64_t high; uint64_t high;
void *param_blob, *param_ptr, *param_rng_seed;
if (kernel_cmdline) {
param_blob = g_malloc(strlen(kernel_cmdline) + 1024);
} else {
param_blob = g_malloc(1024);
}
kernel_size = load_elf(kernel_filename, NULL, NULL, NULL, kernel_size = load_elf(kernel_filename, NULL, NULL, NULL,
&elf_entry, NULL, &high, NULL, 1, &elf_entry, NULL, &high, NULL, 1,
@ -222,36 +235,38 @@ static void virt_init(MachineState *machine)
} }
reset_info->initial_pc = elf_entry; reset_info->initial_pc = elf_entry;
parameters_base = (high + 1) & ~1; parameters_base = (high + 1) & ~1;
param_ptr = param_blob;
BOOTINFO1(cs->as, parameters_base, BI_MACHTYPE, MACH_VIRT); BOOTINFO1(param_ptr, BI_MACHTYPE, MACH_VIRT);
BOOTINFO1(cs->as, parameters_base, BI_FPUTYPE, FPU_68040); BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68040);
BOOTINFO1(cs->as, parameters_base, BI_MMUTYPE, MMU_68040); BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68040);
BOOTINFO1(cs->as, parameters_base, BI_CPUTYPE, CPU_68040); BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68040);
BOOTINFO2(cs->as, parameters_base, BI_MEMCHUNK, 0, ram_size); BOOTINFO2(param_ptr, BI_MEMCHUNK, 0, ram_size);
BOOTINFO1(cs->as, parameters_base, BI_VIRT_QEMU_VERSION, BOOTINFO1(param_ptr, BI_VIRT_QEMU_VERSION,
((QEMU_VERSION_MAJOR << 24) | (QEMU_VERSION_MINOR << 16) | ((QEMU_VERSION_MAJOR << 24) | (QEMU_VERSION_MINOR << 16) |
(QEMU_VERSION_MICRO << 8))); (QEMU_VERSION_MICRO << 8)));
BOOTINFO2(cs->as, parameters_base, BI_VIRT_GF_PIC_BASE, BOOTINFO2(param_ptr, BI_VIRT_GF_PIC_BASE,
VIRT_GF_PIC_MMIO_BASE, VIRT_GF_PIC_IRQ_BASE); VIRT_GF_PIC_MMIO_BASE, VIRT_GF_PIC_IRQ_BASE);
BOOTINFO2(cs->as, parameters_base, BI_VIRT_GF_RTC_BASE, BOOTINFO2(param_ptr, BI_VIRT_GF_RTC_BASE,
VIRT_GF_RTC_MMIO_BASE, VIRT_GF_RTC_IRQ_BASE); VIRT_GF_RTC_MMIO_BASE, VIRT_GF_RTC_IRQ_BASE);
BOOTINFO2(cs->as, parameters_base, BI_VIRT_GF_TTY_BASE, BOOTINFO2(param_ptr, BI_VIRT_GF_TTY_BASE,
VIRT_GF_TTY_MMIO_BASE, VIRT_GF_TTY_IRQ_BASE); VIRT_GF_TTY_MMIO_BASE, VIRT_GF_TTY_IRQ_BASE);
BOOTINFO2(cs->as, parameters_base, BI_VIRT_CTRL_BASE, BOOTINFO2(param_ptr, BI_VIRT_CTRL_BASE,
VIRT_CTRL_MMIO_BASE, VIRT_CTRL_IRQ_BASE); VIRT_CTRL_MMIO_BASE, VIRT_CTRL_IRQ_BASE);
BOOTINFO2(cs->as, parameters_base, BI_VIRT_VIRTIO_BASE, BOOTINFO2(param_ptr, BI_VIRT_VIRTIO_BASE,
VIRT_VIRTIO_MMIO_BASE, VIRT_VIRTIO_IRQ_BASE); VIRT_VIRTIO_MMIO_BASE, VIRT_VIRTIO_IRQ_BASE);
if (kernel_cmdline) { if (kernel_cmdline) {
BOOTINFOSTR(cs->as, parameters_base, BI_COMMAND_LINE, BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
kernel_cmdline); kernel_cmdline);
} }
/* Pass seed to RNG. */ /* Pass seed to RNG. */
qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); param_rng_seed = param_ptr;
BOOTINFODATA(cs->as, parameters_base, BI_VIRT_RNG_SEED, qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));
rng_seed, sizeof(rng_seed)); BOOTINFODATA(param_ptr, BI_RNG_SEED,
rng_seed, sizeof(rng_seed));
/* load initrd */ /* load initrd */
if (initrd_filename) { if (initrd_filename) {
@ -265,13 +280,19 @@ static void virt_init(MachineState *machine)
initrd_base = (ram_size - initrd_size) & TARGET_PAGE_MASK; initrd_base = (ram_size - initrd_size) & TARGET_PAGE_MASK;
load_image_targphys(initrd_filename, initrd_base, load_image_targphys(initrd_filename, initrd_base,
ram_size - initrd_base); ram_size - initrd_base);
BOOTINFO2(cs->as, parameters_base, BI_RAMDISK, initrd_base, BOOTINFO2(param_ptr, BI_RAMDISK, initrd_base,
initrd_size); initrd_size);
} else { } else {
initrd_base = 0; initrd_base = 0;
initrd_size = 0; initrd_size = 0;
} }
BOOTINFO0(cs->as, parameters_base, BI_LAST); 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);
g_free(param_blob);
} }
} }

View File

@ -12,7 +12,9 @@
#define BI_VIRT_GF_TTY_BASE 0x8003 #define BI_VIRT_GF_TTY_BASE 0x8003
#define BI_VIRT_VIRTIO_BASE 0x8004 #define BI_VIRT_VIRTIO_BASE 0x8004
#define BI_VIRT_CTRL_BASE 0x8005 #define BI_VIRT_CTRL_BASE 0x8005
#define BI_VIRT_RNG_SEED 0x8006
/* No longer used -- replaced with BI_RNG_SEED -- but don't reuse this index:
* #define BI_VIRT_RNG_SEED 0x8006 */
#define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0) #define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0)

View File

@ -57,7 +57,13 @@ struct mem_info {
/* (struct mem_info) */ /* (struct mem_info) */
#define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */ #define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */
/* (string) */ /* (string) */
/*
* A random seed used to initialize the RNG. Record format:
*
* - length [ 2 bytes, 16-bit big endian ]
* - seed data [ `length` bytes, padded to preserve 4-byte struct alignment ]
*/
#define BI_RNG_SEED 0x0008
/* /*
* Linux/m68k Architectures (BI_MACHTYPE) * Linux/m68k Architectures (BI_MACHTYPE)