Module Name: src Committed By: riastradh Date: Thu Jun 27 23:58:47 UTC 2024
Modified Files: src/sys/arch/amd64/amd64: machdep.c src/sys/arch/i386/i386: machdep.c Log Message: x86: Defer x86_rndseed until after pmap_bootstrap. Loading the random seed, which is what x86_rndseed does, requires direct map access on KASLR kernels, which requires pmap_bootstrap to have run. This had been broken in amd64/machdep.c 1.359 i386/machdep.c 1.832 because we apparently don't have any automatic test setup for KASLR kernels, which we should address. This change shouldn't cause any security regression on kernels that previously owrked, because none of the logic that now happens before x86_rndseed uses the entropy pool anyway (uvm_md_init, init_x86_clusters, xen_parse_cmdline). PR port-amd64/58366 To generate a diff of this commit: cvs rdiff -u -r1.368 -r1.369 src/sys/arch/amd64/amd64/machdep.c cvs rdiff -u -r1.841 -r1.842 src/sys/arch/i386/i386/machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/amd64/machdep.c diff -u src/sys/arch/amd64/amd64/machdep.c:1.368 src/sys/arch/amd64/amd64/machdep.c:1.369 --- src/sys/arch/amd64/amd64/machdep.c:1.368 Tue Mar 5 14:15:28 2024 +++ src/sys/arch/amd64/amd64/machdep.c Thu Jun 27 23:58:46 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.368 2024/03/05 14:15:28 thorpej Exp $ */ +/* $NetBSD: machdep.c,v 1.369 2024/06/27 23:58:46 riastradh Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008, 2011 @@ -110,7 +110,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.368 2024/03/05 14:15:28 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.369 2024/06/27 23:58:46 riastradh Exp $"); #include "opt_modular.h" #include "opt_user_ldt.h" @@ -1755,15 +1755,6 @@ init_x86_64(paddr_t first_avail) consinit(); /* XXX SHOULD NOT BE DONE HERE */ /* - * Initialize RNG to get entropy ASAP either from CPU - * RDRAND/RDSEED or from seed on disk. Must happen after - * cpu_init_msrs. Prefer to happen after consinit so we have - * the opportunity to print useful feedback. - */ - cpu_rng_init(); - x86_rndseed(); - - /* * Initialize PAGE_SIZE-dependent variables. */ uvm_md_init(); @@ -1803,6 +1794,22 @@ init_x86_64(paddr_t first_avail) */ pmap_bootstrap(VM_MIN_KERNEL_ADDRESS); + /* + * Initialize RNG to get entropy ASAP either from CPU + * RDRAND/RDSEED or from seed on disk. Constraints: + * + * - Must happen after cpu_init_msrs so that curcpu() and + * curlwp work. + * + * - Must happen after consinit so we have the opportunity to + * print useful feedback. + * + * - On KASLR kernels, must happen after pmap_bootstrap because + * x86_rndseed requires access to the direct map. + */ + cpu_rng_init(); + x86_rndseed(); + #ifndef XENPV /* Internalize the physical pages into the VM system. */ init_x86_vm(avail_start); Index: src/sys/arch/i386/i386/machdep.c diff -u src/sys/arch/i386/i386/machdep.c:1.841 src/sys/arch/i386/i386/machdep.c:1.842 --- src/sys/arch/i386/i386/machdep.c:1.841 Tue Mar 5 14:15:32 2024 +++ src/sys/arch/i386/i386/machdep.c Thu Jun 27 23:58:46 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.841 2024/03/05 14:15:32 thorpej Exp $ */ +/* $NetBSD: machdep.c,v 1.842 2024/06/27 23:58:46 riastradh Exp $ */ /* * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009, 2017 @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.841 2024/03/05 14:15:32 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.842 2024/06/27 23:58:46 riastradh Exp $"); #include "opt_beep.h" #include "opt_compat_freebsd.h" @@ -1280,15 +1280,6 @@ init386(paddr_t first_avail) consinit(); /* XXX SHOULD NOT BE DONE HERE */ - /* - * Initialize RNG to get entropy ASAP either from CPU - * RDRAND/RDSEED or from seed on disk. Must happen after - * cpu_init_msrs. Prefer to happen after consinit so we have - * the opportunity to print useful feedback. - */ - cpu_rng_init(); - x86_rndseed(); - #ifdef DEBUG_MEMLOAD printf("mem_cluster_count: %d\n", mem_cluster_cnt); #endif @@ -1299,6 +1290,22 @@ init386(paddr_t first_avail) */ pmap_bootstrap((vaddr_t)atdevbase + IOM_SIZE); + /* + * Initialize RNG to get entropy ASAP either from CPU + * RDRAND/RDSEED or from seed on disk. Constraints: + * + * - Must happen after cpu_init_msrs so that curcpu() and + * curlwp work. + * + * - Must happen after consinit so we have the opportunity to + * print useful feedback. + * + * - On KASLR kernels, must happen after pmap_bootstrap because + * x86_rndseed requires access to the direct map. + */ + cpu_rng_init(); + x86_rndseed(); + #ifndef XENPV /* Initialize the memory clusters. */ init_x86_clusters();