From nobody Wed May 15 20:21:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16666039230746.255461667979944; Mon, 24 Oct 2022 02:32:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1omtIH-0005XQ-9C; Mon, 24 Oct 2022 04:58:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1omtIF-0005Wo-Jo for qemu-devel@nongnu.org; Mon, 24 Oct 2022 04:58:47 -0400 Received: from mout.kundenserver.de ([217.72.192.74]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1omtID-0003O5-Rw for qemu-devel@nongnu.org; Mon, 24 Oct 2022 04:58:47 -0400 Received: from quad ([82.142.8.70]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MyKYE-1p1Fmw0u44-00yl1d; Mon, 24 Oct 2022 10:58:42 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Cc: Laurent Vivier , "Jason A. Donenfeld" , Geert Uytterhoeven Subject: [PULL 1/2] m68k: rework BI_VIRT_RNG_SEED as BI_RNG_SEED Date: Mon, 24 Oct 2022 10:58:39 +0200 Message-Id: <20221024085840.3023854-2-laurent@vivier.eu> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221024085840.3023854-1-laurent@vivier.eu> References: <20221024085840.3023854-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:tO1zXLDnDq5Xi8kd9cO5PxuAvVyxvn0IBUrcd4JzP0YntTDbD7F wP4Mk+Xt7UqFR/bDqgjOJnbH+Ckklk3nvrmTXnUaTO5rjPBEHp9Wmxdve8YRC4wlzJ2EagX lkZsiFnbCdJs8uY/pvWrq39yxiddxLR+RZAPBsDcoAo0nFS+Hc9xz15Px9XoUZmiHmP2ojb l4FN2CEbjGShVW+A1kHOg== X-UI-Out-Filterresults: notjunk:1;V03:K0:H0mOahc9Qwg=:OL6wj43YqE30Rmeq8hEsN5 luw5lrzY3ebST6zPrskZKsgosI5FL7zOGjStNuXvgiBf392c3QKsomiXNSJOnyRNGPHAI/U2Y nubFsiL3T7OJhUE6OphT3SjIQfWuwJza2zYVrV0kICJmuNFzl8+TK4BrIdkL+PZPNLp+TejQ0 a9ZGy8bNCMOhiqepe/bbv9tTTglHCHnl4gK8tESpSVnOyG2hp0BTdEoEENq3YtOqu6PbU8OeJ Z1g4sz7MA1a0MQLtk+qryu2nz4Xn6tJO9w4nxLYW5vdjJflVQAtGeYHor+NQK5oS/HQRqvP7r al2ITHM6eJP/el1TiTy4ku6yMuCKNvD6qeMqfez3/IZ93IbTpW9m9Nro1ebryWqiPCxh6yUly D3W6Ppozy5OOuPVXDVPwEsxVGsLz5oI1j+xdqPfiSpjTAQgGb62VkivFcZAJ8ABIjGujfn9pl NE40eSWQUWfC/9l5GyI59/g0lsh71TTVB4UwaZjvbfWALm+lAzd8twfLc8mXO4W8iogAXSEYj FVVVgO/XVV+T/S+YJSslv32eXRBj/4IYQ0OExXP9w4C1XD4ivFFbo8yFivaTL+wMC2SGfv7lR 7XsfVjNG7TohjvGsN2Z5NQh+xT6YqPyNkJlsC3tlu5Zfd5Zzf52TqblDGFS8IcO6duBkfx6sn PTysMNiPxjxUjYB08KUGFRn5VB4dGyoEoWp5i9R+DlwKzF4TcI0Eb2jbic+kfJ7VW2H4QSEnC D+o24PoMRx1BcvIWF92vquj0DUcsprGgG6RBS0Zhm4DFoJvWjH4xOPWp+SjtleXcsPS6oRI91 6RnKQH+ Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=217.72.192.74; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Qemu-devel" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1666603923830100001 Content-Type: text/plain; charset="utf-8" From: "Jason A. Donenfeld" Following a change on the kernel side (see link), pass BI_RNG_SEED instead of BI_VIRT_RNG_SEED. This should have no impact on compatibility, as there will simply be no effect if it's an old kernel, which is how things have always been. We then use this as an opportunity to add this to q800, since now we can, which is a nice improvement. Cc: Geert Uytterhoeven Cc: Laurent Vivier Link: https://lore.kernel.org/lkml/20220923170340.4099226-3-Jason@zx2c4.com/ Signed-off-by: Jason A. Donenfeld Message-Id: <20220926113900.1256630-1-Jason@zx2c4.com> [lv: s/^I/ /g] Signed-off-by: Laurent Vivier --- include/standard-headers/asm-m68k/bootinfo-virt.h | 4 +++- include/standard-headers/asm-m68k/bootinfo.h | 8 +++++++- hw/m68k/q800.c | 7 +++++++ hw/m68k/virt.c | 8 ++++---- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/standard-headers/asm-m68k/bootinfo-virt.h b/include/st= andard-headers/asm-m68k/bootinfo-virt.h index 1b1ffd4705d6..75ac6bbd7d73 100644 --- a/include/standard-headers/asm-m68k/bootinfo-virt.h +++ b/include/standard-headers/asm-m68k/bootinfo-virt.h @@ -12,7 +12,9 @@ #define BI_VIRT_GF_TTY_BASE 0x8003 #define BI_VIRT_VIRTIO_BASE 0x8004 #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 ind= ex: + * #define BI_VIRT_RNG_SEED 0x8006 */ =20 #define VIRT_BOOTI_VERSION MK_BI_VERSION(2, 0) =20 diff --git a/include/standard-headers/asm-m68k/bootinfo.h b/include/standar= d-headers/asm-m68k/bootinfo.h index 7b790e8ec8d6..b7a8dd2514fe 100644 --- a/include/standard-headers/asm-m68k/bootinfo.h +++ b/include/standard-headers/asm-m68k/bootinfo.h @@ -57,7 +57,13 @@ struct mem_info { /* (struct mem_info) */ #define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */ /* (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 ali= gnment ] + */ +#define BI_RNG_SEED 0x0008 =20 /* * Linux/m68k Architectures (BI_MACHTYPE) diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index 101ab0f803f6..a4590c2cb0b1 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -23,6 +23,7 @@ #include "qemu/osdep.h" #include "qemu/units.h" #include "qemu/datadir.h" +#include "qemu/guest-random.h" #include "sysemu/sysemu.h" #include "cpu.h" #include "hw/boards.h" @@ -385,6 +386,7 @@ static void q800_init(MachineState *machine) NubusBus *nubus; DeviceState *glue; DriveInfo *dinfo; + uint8_t rng_seed[32]; =20 linux_boot =3D (kernel_filename !=3D NULL); =20 @@ -634,6 +636,11 @@ static void q800_init(MachineState *machine) kernel_cmdline); } =20 + /* Pass seed to RNG. */ + qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); + BOOTINFODATA(cs->as, parameters_base, BI_RNG_SEED, + rng_seed, sizeof(rng_seed)); + /* load initrd */ if (initrd_filename) { initrd_size =3D get_image_size(initrd_filename); diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index 2f3ffc0de677..f7b903ea1b62 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -248,10 +248,10 @@ static void virt_init(MachineState *machine) kernel_cmdline); } =20 - /* Pass seed to RNG. */ - qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); - BOOTINFODATA(cs->as, parameters_base, BI_VIRT_RNG_SEED, - rng_seed, sizeof(rng_seed)); + /* Pass seed to RNG. */ + qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); + BOOTINFODATA(cs->as, parameters_base, BI_RNG_SEED, + rng_seed, sizeof(rng_seed)); =20 /* load initrd */ if (initrd_filename) { --=20 2.37.3 From nobody Wed May 15 20:21:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1666609414095959.0482627215745; Mon, 24 Oct 2022 04:03:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1omtII-0005Y2-TL; Mon, 24 Oct 2022 04:58:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1omtIH-0005XS-Hg for qemu-devel@nongnu.org; Mon, 24 Oct 2022 04:58:49 -0400 Received: from mout.kundenserver.de ([217.72.192.74]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1omtIF-0003OE-A0 for qemu-devel@nongnu.org; Mon, 24 Oct 2022 04:58:49 -0400 Received: from quad ([82.142.8.70]) by mrelayeu.kundenserver.de (mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MfZDK-1pK17q2wBM-00fz9h; Mon, 24 Oct 2022 10:58:43 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Cc: Laurent Vivier , "Jason A. Donenfeld" , Geert Uytterhoeven Subject: [PULL 2/2] m68k: write bootinfo as rom section and re-randomize on reboot Date: Mon, 24 Oct 2022 10:58:40 +0200 Message-Id: <20221024085840.3023854-3-laurent@vivier.eu> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20221024085840.3023854-1-laurent@vivier.eu> References: <20221024085840.3023854-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:8GY44FuE/6PvAW6MnlCeDjZ46QZhrY8KG8UyqeSN8E0W0ZmYfrr ZjGWjwtldFuXeY5x5AACL8Yx8BFmgl6zNY50t2RjaVoQ1MDQ8n9/K7nHMZ6kXbldS8tUItH yWZuHJ4ID0qM3SXPsPzzGAy49wiBlyXhM4bNui4YnZNVuXawPqRt36gSYQkzicm5OFImqYd cVE5pNPCAQAIl5CMb+9rQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:7FPOqRsGifo=:xeOJXafCU228moVADSMICL S73ETLUFJd5YFkRSeGdA6j8bwGirEFcwkxi17WvSwtEOjhY1c1QuvyEXkcmLGmNelxggzTpsC FTBs95ICC5G2Rl6C24gHX9e4Bnj05ZAXYGtnSSTRwLZxxUpm207x2kQ8b6B1r9zxLOEhm09b5 xzkLTEzythIjrekMPRiwutKs0XA023LsT4pKdlss+40Cahf+M59e+4lv6PDvXWHmxcc+3ru/0 l/NPMZmnFJavRAHP7OiCvqSRCEj7bhJtgSS+ylR1rkv1BKaTvxvXOMJ16XqfSM3hotPWcFX5i //0tQS2eAgInhMt3HxYt0vBlTZ0R4wRlbbteQE32GdULCPjZ1bEoBnnd4v3b53DWG5XZRUZNk mlCYro7U+CJK2u3wgGrt7w9swnlD0mtZ1cian0CV6wONW/53dt4JsXOLyP4Gqn3TUn84gO0JF YivAJeGeWz6/nurT9XjTREvVr/rfG3B+T1kKbvyRWDTEQUkJ95gb4DcXNK+doKmKafX9wk6/O TED41/Mb+nXd+zMtoJ8eFsP3fb2EQPLyd7EJ8cwy5H+4Es9rfLb4GCsNH548c2t7kpf+QVJOP qg2djep9GxWzgLiT7y69CnDpdNf141lUERaSHZtPltxkdTj7SkcpOqUygwvMJzGi+OmHbov0h T588gOTWb4H3AVGjHQUvRzRKv3uCdY2wQRHR/YWQLCcDClEi9GXe8cWzQFZUbixFrqxojfy7p +572KhUmTNopbvNALX67I90cATX9SJFDws1qojCRIQfoaO2NRgy3iurc6mOkxab670w9KPJJV +iNhBYT Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=217.72.192.74; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Qemu-devel" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1666609415760100003 Content-Type: text/plain; charset="utf-8" From: "Jason A. Donenfeld" Rather than poking directly into RAM, add the bootinfo block as a proper ROM, so that it's restored when rebooting the system. This way, if the guest corrupts any of the bootinfo items, but then tries to reboot, it'll still be restored back to normal as expected. Then, since the RNG seed needs to be fresh on each boot, regenerate the RNG seed in the ROM when reseting the CPU. Cc: Geert Uytterhoeven Cc: Laurent Vivier Signed-off-by: Jason A. Donenfeld Message-Id: <20221023191340.36238-1-Jason@zx2c4.com> Signed-off-by: Laurent Vivier --- hw/m68k/bootinfo.h | 48 +++++++++++++++---------------- hw/m68k/q800.c | 71 +++++++++++++++++++++++++++++++++------------- hw/m68k/virt.c | 51 +++++++++++++++++++++++---------- 3 files changed, 111 insertions(+), 59 deletions(-) diff --git a/hw/m68k/bootinfo.h b/hw/m68k/bootinfo.h index 897162b8189c..a3d37e3c8094 100644 --- a/hw/m68k/bootinfo.h +++ b/hw/m68k/bootinfo.h @@ -12,66 +12,66 @@ #ifndef HW_M68K_BOOTINFO_H #define HW_M68K_BOOTINFO_H =20 -#define BOOTINFO0(as, base, id) \ +#define BOOTINFO0(base, id) \ do { \ - stw_phys(as, base, id); \ + stw_p(base, id); \ base +=3D 2; \ - stw_phys(as, base, sizeof(struct bi_record)); \ + stw_p(base, sizeof(struct bi_record)); \ base +=3D 2; \ } while (0) =20 -#define BOOTINFO1(as, base, id, value) \ +#define BOOTINFO1(base, id, value) \ do { \ - stw_phys(as, base, id); \ + stw_p(base, id); \ base +=3D 2; \ - stw_phys(as, base, sizeof(struct bi_record) + 4); \ + stw_p(base, sizeof(struct bi_record) + 4); \ base +=3D 2; \ - stl_phys(as, base, value); \ + stl_p(base, value); \ base +=3D 4; \ } while (0) =20 -#define BOOTINFO2(as, base, id, value1, value2) \ +#define BOOTINFO2(base, id, value1, value2) \ do { \ - stw_phys(as, base, id); \ + stw_p(base, id); \ base +=3D 2; \ - stw_phys(as, base, sizeof(struct bi_record) + 8); \ + stw_p(base, sizeof(struct bi_record) + 8); \ base +=3D 2; \ - stl_phys(as, base, value1); \ + stl_p(base, value1); \ base +=3D 4; \ - stl_phys(as, base, value2); \ + stl_p(base, value2); \ base +=3D 4; \ } while (0) =20 -#define BOOTINFOSTR(as, base, id, string) \ +#define BOOTINFOSTR(base, id, string) \ do { \ int i; \ - stw_phys(as, base, id); \ + stw_p(base, id); \ base +=3D 2; \ - stw_phys(as, base, \ + stw_p(base, \ (sizeof(struct bi_record) + strlen(string) + \ 1 /* null termination */ + 3 /* padding */) & ~3); \ base +=3D 2; \ for (i =3D 0; string[i]; i++) { \ - stb_phys(as, base++, string[i]); \ + stb_p(base++, string[i]); \ } \ - stb_phys(as, base++, 0); \ - base =3D (base + 3) & ~3; \ + stb_p(base++, 0); \ + base =3D QEMU_ALIGN_PTR_UP(base, 4); \ } while (0) =20 -#define BOOTINFODATA(as, base, id, data, len) \ +#define BOOTINFODATA(base, id, data, len) \ do { \ int i; \ - stw_phys(as, base, id); \ + stw_p(base, id); \ base +=3D 2; \ - stw_phys(as, base, \ + stw_p(base, \ (sizeof(struct bi_record) + len + \ 2 /* length field */ + 3 /* padding */) & ~3); \ base +=3D 2; \ - stw_phys(as, base, len); \ + stw_p(base, len); \ base +=3D 2; \ for (i =3D 0; i < len; ++i) { \ - stb_phys(as, base++, data[i]); \ + stb_p(base++, data[i]); \ } \ - base =3D (base + 3) & ~3; \ + base =3D QEMU_ALIGN_PTR_UP(base, 4); \ } while (0) #endif diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c index a4590c2cb0b1..e09e244ddc1d 100644 --- a/hw/m68k/q800.c +++ b/hw/m68k/q800.c @@ -321,11 +321,22 @@ static const TypeInfo glue_info =3D { }, }; =20 +typedef struct { + M68kCPU *cpu; + struct bi_record *rng_seed; +} ResetInfo; + static void main_cpu_reset(void *opaque) { - M68kCPU *cpu =3D opaque; + ResetInfo *reset_info =3D opaque; + M68kCPU *cpu =3D reset_info->cpu; CPUState *cs =3D CPU(cpu); =20 + 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] =3D ldl_phys(cs->as, 0); cpu->env.pc =3D ldl_phys(cs->as, 4); @@ -386,6 +397,7 @@ static void q800_init(MachineState *machine) NubusBus *nubus; DeviceState *glue; DriveInfo *dinfo; + ResetInfo *reset_info; uint8_t rng_seed[32]; =20 linux_boot =3D (kernel_filename !=3D NULL); @@ -396,9 +408,12 @@ static void q800_init(MachineState *machine) exit(1); } =20 + reset_info =3D g_new0(ResetInfo, 1); + /* init CPUs */ cpu =3D M68K_CPU(cpu_create(machine->cpu_type)); - qemu_register_reset(main_cpu_reset, cpu); + reset_info->cpu =3D cpu; + qemu_register_reset(main_cpu_reset, reset_info); =20 /* RAM */ memory_region_add_subregion(get_system_memory(), 0, machine->ram); @@ -598,6 +613,14 @@ static void q800_init(MachineState *machine) cs =3D CPU(cpu); if (linux_boot) { uint64_t high; + void *param_blob, *param_ptr, *param_rng_seed; + + if (kernel_cmdline) { + param_blob =3D g_malloc(strlen(kernel_cmdline) + 1024); + } else { + param_blob =3D g_malloc(1024); + } + kernel_size =3D load_elf(kernel_filename, NULL, NULL, NULL, &elf_entry, NULL, &high, NULL, 1, EM_68K, 0, 0); @@ -607,23 +630,24 @@ static void q800_init(MachineState *machine) } stl_phys(cs->as, 4, elf_entry); /* reset initial PC */ parameters_base =3D (high + 1) & ~1; - - BOOTINFO1(cs->as, parameters_base, BI_MACHTYPE, MACH_MAC); - BOOTINFO1(cs->as, parameters_base, BI_FPUTYPE, FPU_68040); - BOOTINFO1(cs->as, parameters_base, BI_MMUTYPE, MMU_68040); - BOOTINFO1(cs->as, parameters_base, BI_CPUTYPE, CPU_68040); - BOOTINFO1(cs->as, parameters_base, BI_MAC_CPUID, CPUB_68040); - BOOTINFO1(cs->as, parameters_base, BI_MAC_MODEL, MAC_MODEL_Q800); - BOOTINFO1(cs->as, parameters_base, + param_ptr =3D param_blob; + + BOOTINFO1(param_ptr, BI_MACHTYPE, MACH_MAC); + BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68040); + BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68040); + BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68040); + BOOTINFO1(param_ptr, BI_MAC_CPUID, CPUB_68040); + BOOTINFO1(param_ptr, BI_MAC_MODEL, MAC_MODEL_Q800); + BOOTINFO1(param_ptr, BI_MAC_MEMSIZE, ram_size >> 20); /* in MB */ - BOOTINFO2(cs->as, parameters_base, BI_MEMCHUNK, 0, ram_size); - BOOTINFO1(cs->as, parameters_base, BI_MAC_VADDR, + BOOTINFO2(param_ptr, BI_MEMCHUNK, 0, ram_size); + BOOTINFO1(param_ptr, BI_MAC_VADDR, VIDEO_BASE + macfb_mode->offset); - BOOTINFO1(cs->as, parameters_base, BI_MAC_VDEPTH, graphic_depth); - BOOTINFO1(cs->as, parameters_base, BI_MAC_VDIM, + BOOTINFO1(param_ptr, BI_MAC_VDEPTH, graphic_depth); + BOOTINFO1(param_ptr, BI_MAC_VDIM, (graphic_height << 16) | graphic_width); - BOOTINFO1(cs->as, parameters_base, BI_MAC_VROW, macfb_mode->stride= ); - BOOTINFO1(cs->as, parameters_base, BI_MAC_SCCBASE, SCC_BASE); + BOOTINFO1(param_ptr, BI_MAC_VROW, macfb_mode->stride); + BOOTINFO1(param_ptr, BI_MAC_SCCBASE, SCC_BASE); =20 rom =3D g_malloc(sizeof(*rom)); memory_region_init_ram_ptr(rom, NULL, "m68k_fake_mac.rom", @@ -632,13 +656,14 @@ static void q800_init(MachineState *machine) memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom); =20 if (kernel_cmdline) { - BOOTINFOSTR(cs->as, parameters_base, BI_COMMAND_LINE, + BOOTINFOSTR(param_ptr, BI_COMMAND_LINE, kernel_cmdline); } =20 /* Pass seed to RNG. */ + param_rng_seed =3D param_ptr; qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); - BOOTINFODATA(cs->as, parameters_base, BI_RNG_SEED, + BOOTINFODATA(param_ptr, BI_RNG_SEED, rng_seed, sizeof(rng_seed)); =20 /* load initrd */ @@ -653,13 +678,19 @@ static void q800_init(MachineState *machine) initrd_base =3D (ram_size - initrd_size) & TARGET_PAGE_MASK; load_image_targphys(initrd_filename, initrd_base, ram_size - initrd_base); - BOOTINFO2(cs->as, parameters_base, BI_RAMDISK, initrd_base, + BOOTINFO2(param_ptr, BI_RAMDISK, initrd_base, initrd_size); } else { initrd_base =3D 0; initrd_size =3D 0; } - BOOTINFO0(cs->as, parameters_base, BI_LAST); + BOOTINFO0(param_ptr, BI_LAST); + rom_add_blob_fixed_as("bootinfo", param_blob, param_ptr - param_bl= ob, + parameters_base, cs->as); + reset_info->rng_seed =3D 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; /* allocate and load BIOS */ diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index f7b903ea1b62..89c4108eb545 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -89,6 +89,7 @@ typedef struct { M68kCPU *cpu; hwaddr initial_pc; hwaddr initial_stack; + struct bi_record *rng_seed; } ResetInfo; =20 static void main_cpu_reset(void *opaque) @@ -97,6 +98,11 @@ static void main_cpu_reset(void *opaque) M68kCPU *cpu =3D reset_info->cpu; CPUState *cs =3D CPU(cpu); =20 + 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] =3D reset_info->initial_stack; cpu->env.pc =3D reset_info->initial_pc; @@ -212,6 +218,13 @@ static void virt_init(MachineState *machine) if (kernel_filename) { CPUState *cs =3D CPU(cpu); uint64_t high; + void *param_blob, *param_ptr, *param_rng_seed; + + if (kernel_cmdline) { + param_blob =3D g_malloc(strlen(kernel_cmdline) + 1024); + } else { + param_blob =3D g_malloc(1024); + } =20 kernel_size =3D load_elf(kernel_filename, NULL, NULL, NULL, &elf_entry, NULL, &high, NULL, 1, @@ -222,35 +235,37 @@ static void virt_init(MachineState *machine) } reset_info->initial_pc =3D elf_entry; parameters_base =3D (high + 1) & ~1; + param_ptr =3D param_blob; =20 - BOOTINFO1(cs->as, parameters_base, BI_MACHTYPE, MACH_VIRT); - BOOTINFO1(cs->as, parameters_base, BI_FPUTYPE, FPU_68040); - BOOTINFO1(cs->as, parameters_base, BI_MMUTYPE, MMU_68040); - BOOTINFO1(cs->as, parameters_base, BI_CPUTYPE, CPU_68040); - BOOTINFO2(cs->as, parameters_base, BI_MEMCHUNK, 0, ram_size); + BOOTINFO1(param_ptr, BI_MACHTYPE, MACH_VIRT); + BOOTINFO1(param_ptr, BI_FPUTYPE, FPU_68040); + BOOTINFO1(param_ptr, BI_MMUTYPE, MMU_68040); + BOOTINFO1(param_ptr, BI_CPUTYPE, CPU_68040); + BOOTINFO2(param_ptr, BI_MEMCHUNK, 0, ram_size); =20 - 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_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); - 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); - 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); - BOOTINFO2(cs->as, parameters_base, BI_VIRT_CTRL_BASE, + BOOTINFO2(param_ptr, BI_VIRT_CTRL_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); =20 if (kernel_cmdline) { - BOOTINFOSTR(cs->as, parameters_base, BI_COMMAND_LINE, + BOOTINFOSTR(param_ptr, BI_COMMAND_LINE, kernel_cmdline); } =20 /* Pass seed to RNG. */ + param_rng_seed =3D param_ptr; qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); - BOOTINFODATA(cs->as, parameters_base, BI_RNG_SEED, + BOOTINFODATA(param_ptr, BI_RNG_SEED, rng_seed, sizeof(rng_seed)); =20 /* load initrd */ @@ -265,13 +280,19 @@ static void virt_init(MachineState *machine) initrd_base =3D (ram_size - initrd_size) & TARGET_PAGE_MASK; load_image_targphys(initrd_filename, initrd_base, ram_size - initrd_base); - BOOTINFO2(cs->as, parameters_base, BI_RAMDISK, initrd_base, + BOOTINFO2(param_ptr, BI_RAMDISK, initrd_base, initrd_size); } else { initrd_base =3D 0; initrd_size =3D 0; } - BOOTINFO0(cs->as, parameters_base, BI_LAST); + BOOTINFO0(param_ptr, BI_LAST); + rom_add_blob_fixed_as("bootinfo", param_blob, param_ptr - param_bl= ob, + parameters_base, cs->as); + reset_info->rng_seed =3D rom_ptr_for_as(cs->as, parameters_base, + param_ptr - param_blob) + + (param_rng_seed - param_blob); + g_free(param_blob); } } =20 --=20 2.37.3