Module Name:    src
Committed By:   martin
Date:           Wed Feb 12 20:10:10 UTC 2020

Modified Files:
        src/sys/arch/aarch64/aarch64 [netbsd-9]: aarch64_machdep.c
        src/sys/arch/aarch64/include [netbsd-9]: machdep.h
        src/sys/arch/arm/arm32 [netbsd-9]: arm32_machdep.c
        src/sys/arch/arm/include/arm32 [netbsd-9]: machdep.h
        src/sys/arch/evbarm/fdt [netbsd-9]: fdt_machdep.c
        src/sys/stand/efiboot [netbsd-9]: boot.c efiboot.h efifdt.c efifdt.h
            exec.c version

Log Message:
Pull up following revision(s) (requested by riastradh in ticket #705):

        sys/arch/aarch64/aarch64/aarch64_machdep.c: revision 1.35
        sys/stand/efiboot/efifdt.c: revision 1.20
        sys/stand/efiboot/efifdt.h: revision 1.7
        sys/arch/aarch64/include/machdep.h: revision 1.9
        sys/stand/efiboot/efiboot.h: revision 1.11
        sys/arch/arm/arm32/arm32_machdep.c: revision 1.129
        sys/arch/arm/include/arm32/machdep.h: revision 1.30
        sys/stand/efiboot/exec.c: revision 1.12
        sys/arch/evbarm/fdt/fdt_machdep.c: revision 1.65
        sys/stand/efiboot/version: revision 1.14
        sys/stand/efiboot/boot.c: revision 1.19

New function cpu_startup_hook on arm.

Called at end of cpu_startup.  Can be defined in, e.g., evbarm to do
additional stuff after cpu_startup.  Defined as a weak alias to a
function that does nothing, so optional.
ok jmcneill

Implement rndseed support in efiboot and fdt arm.

The EFI environment variable `rndseed' specifies the path to the
random seed.  It is loaded only for fdt platforms at the moment.
Since the rndseed (an rndsave_t object as defined in <sys/rndio.h>)
is 536 bytes long (for hysterical raisins), and to avoid having to
erase parts of the fdt tree, we load it into a physical page whose
address is passed in the fdt tree, rather than passing the content of
the file as an fdt node directly; the kernel then reserves the page
from uvm, and maps it into kva to call rnd_seed.

For now, the only kernel that does use efiboot with fdt is evbarm,
which knows to handle the rndseed.  Any new kernels that use efiboot
with fdt must do the same; otherwise uvm may hand out the page with
the secret key on it for a normal page allocation in the kernel --
which should be OK if there are no kernel memory disclosure bugs, but
would lead to worse consequences than simply loading the seed late in
userland with /etc/rc.d/random_seed otherwise.

ok jmcneill


To generate a diff of this commit:
cvs rdiff -u -r1.28.4.2 -r1.28.4.3 \
    src/sys/arch/aarch64/aarch64/aarch64_machdep.c
cvs rdiff -u -r1.8 -r1.8.2.1 src/sys/arch/aarch64/include/machdep.h
cvs rdiff -u -r1.128 -r1.128.2.1 src/sys/arch/arm/arm32/arm32_machdep.c
cvs rdiff -u -r1.29 -r1.29.2.1 src/sys/arch/arm/include/arm32/machdep.h
cvs rdiff -u -r1.64 -r1.64.2.1 src/sys/arch/evbarm/fdt/fdt_machdep.c
cvs rdiff -u -r1.18.4.1 -r1.18.4.2 src/sys/stand/efiboot/boot.c
cvs rdiff -u -r1.10 -r1.10.4.1 src/sys/stand/efiboot/efiboot.h
cvs rdiff -u -r1.17.2.2 -r1.17.2.3 src/sys/stand/efiboot/efifdt.c
cvs rdiff -u -r1.6 -r1.6.2.1 src/sys/stand/efiboot/efifdt.h
cvs rdiff -u -r1.11.2.1 -r1.11.2.2 src/sys/stand/efiboot/exec.c
cvs rdiff -u -r1.11.2.2 -r1.11.2.3 src/sys/stand/efiboot/version

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/aarch64/aarch64/aarch64_machdep.c
diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.28.4.2 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.28.4.3
--- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.28.4.2	Tue Jan 21 11:11:00 2020
+++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.28.4.2 2020/01/21 11:11:00 martin Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.28.4.3 2020/02/12 20:10:09 martin Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.28.4.2 2020/01/21 11:11:00 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.28.4.3 2020/02/12 20:10:09 martin Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_ddb.h"
@@ -599,6 +599,14 @@ cpu_startup(void)
 
 	/* Hello! */
 	banner();
+
+	cpu_startup_hook();
+}
+
+__weak_alias(cpu_startup_hook,cpu_startup_default)
+void
+cpu_startup_default(void)
+{
 }
 
 /*

Index: src/sys/arch/aarch64/include/machdep.h
diff -u src/sys/arch/aarch64/include/machdep.h:1.8 src/sys/arch/aarch64/include/machdep.h:1.8.2.1
--- src/sys/arch/aarch64/include/machdep.h:1.8	Tue Jul 16 16:18:56 2019
+++ src/sys/arch/aarch64/include/machdep.h	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.h,v 1.8 2019/07/16 16:18:56 skrll Exp $	*/
+/*	$NetBSD: machdep.h,v 1.8.2.1 2020/02/12 20:10:09 martin Exp $	*/
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <[email protected]>
@@ -83,6 +83,9 @@ void uartputc(int);
 void parse_mi_bootargs(char *);
 void dumpsys(void);
 
+void cpu_startup_hook(void);
+void cpu_startup_default(void);
+
 struct trapframe;
 
 /* fault.c */

Index: src/sys/arch/arm/arm32/arm32_machdep.c
diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.128 src/sys/arch/arm/arm32/arm32_machdep.c:1.128.2.1
--- src/sys/arch/arm/arm32/arm32_machdep.c:1.128	Fri May 10 16:43:09 2019
+++ src/sys/arch/arm/arm32/arm32_machdep.c	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_machdep.c,v 1.128 2019/05/10 16:43:09 skrll Exp $	*/
+/*	$NetBSD: arm32_machdep.c,v 1.128.2.1 2020/02/12 20:10:09 martin Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.128 2019/05/10 16:43:09 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.128.2.1 2020/02/12 20:10:09 martin Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_arm_start.h"
@@ -353,6 +353,14 @@ cpu_startup(void)
 #else
  	tf->tf_spsr = PSR_USR32_MODE;
 #endif
+
+	cpu_startup_hook();
+}
+
+__weak_alias(cpu_startup_hook,cpu_startup_default)
+void
+cpu_startup_default(void)
+{
 }
 
 /*

Index: src/sys/arch/arm/include/arm32/machdep.h
diff -u src/sys/arch/arm/include/arm32/machdep.h:1.29 src/sys/arch/arm/include/arm32/machdep.h:1.29.2.1
--- src/sys/arch/arm/include/arm32/machdep.h:1.29	Tue Jul 16 14:41:43 2019
+++ src/sys/arch/arm/include/arm32/machdep.h	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.h,v 1.29 2019/07/16 14:41:43 skrll Exp $ */
+/* $NetBSD: machdep.h,v 1.29.2.1 2020/02/12 20:10:09 martin Exp $ */
 
 #ifndef _ARM32_MACHDEP_H_
 #define _ARM32_MACHDEP_H_
@@ -73,6 +73,9 @@ vaddr_t initarm(void *);
 struct pmap_devmap;
 struct boot_physmem;
 
+void cpu_startup_hook(void);
+void cpu_startup_default(void);
+
 static inline paddr_t
 aarch32_kern_vtophys(vaddr_t va)
 {

Index: src/sys/arch/evbarm/fdt/fdt_machdep.c
diff -u src/sys/arch/evbarm/fdt/fdt_machdep.c:1.64 src/sys/arch/evbarm/fdt/fdt_machdep.c:1.64.2.1
--- src/sys/arch/evbarm/fdt/fdt_machdep.c:1.64	Tue Jul 16 14:41:45 2019
+++ src/sys/arch/evbarm/fdt/fdt_machdep.c	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_machdep.c,v 1.64 2019/07/16 14:41:45 skrll Exp $ */
+/* $NetBSD: fdt_machdep.c,v 1.64.2.1 2020/02/12 20:10:09 martin Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.64 2019/07/16 14:41:45 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.64.2.1 2020/02/12 20:10:09 martin Exp $");
 
 #include "opt_machdep.h"
 #include "opt_bootconfig.h"
@@ -64,6 +64,7 @@ __KERNEL_RCSID(0, "$NetBSD: fdt_machdep.
 #include <sys/disk.h>
 #include <sys/md5.h>
 #include <sys/pserialize.h>
+#include <sys/rnd.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -117,6 +118,7 @@ u_long uboot_args[4] __attribute__((__se
 const uint8_t *fdt_addr_r __attribute__((__section__(".data")));
 
 static uint64_t initrd_start, initrd_end;
+static uint64_t rndseed_start, rndseed_end;
 
 #include <libfdt.h>
 #include <dev/fdt/fdtvar.h>
@@ -311,6 +313,10 @@ fdt_build_bootconfig(uint64_t mem_start,
 	if (initrd_size > 0)
 		fdt_memory_remove_range(initrd_start, initrd_size);
 
+	const uint64_t rndseed_size = rndseed_end - rndseed_start;
+	if (rndseed_size > 0)
+		fdt_memory_remove_range(rndseed_start, rndseed_size);
+
 	const int framebuffer = OF_finddevice("/chosen/framebuffer");
 	if (framebuffer >= 0) {
 		for (index = 0;
@@ -390,6 +396,65 @@ fdt_setup_initrd(void)
 #endif
 }
 
+static void
+fdt_probe_rndseed(uint64_t *pstart, uint64_t *pend)
+{
+	int chosen, len;
+	const void *start_data, *end_data;
+
+	*pstart = *pend = 0;
+	chosen = OF_finddevice("/chosen");
+	if (chosen < 0)
+		return;
+
+	start_data = fdtbus_get_prop(chosen, "netbsd,rndseed-start", &len);
+	end_data = fdtbus_get_prop(chosen, "netbsd,rndseed-end", NULL);
+	if (start_data == NULL || end_data == NULL)
+		return;
+
+	switch (len) {
+	case 4:
+		*pstart = be32dec(start_data);
+		*pend = be32dec(end_data);
+		break;
+	case 8:
+		*pstart = be64dec(start_data);
+		*pend = be64dec(end_data);
+		break;
+	default:
+		printf("Unsupported len %d for /chosen/rndseed-start\n", len);
+		return;
+	}
+}
+
+static void
+fdt_setup_rndseed(void)
+{
+	const uint64_t rndseed_size = rndseed_end - rndseed_start;
+	const paddr_t startpa = trunc_page(rndseed_start);
+	const paddr_t endpa = round_page(rndseed_end);
+	paddr_t pa;
+	vaddr_t va;
+	void *rndseed;
+
+	if (rndseed_size == 0)
+		return;
+
+	va = uvm_km_alloc(kernel_map, endpa - startpa, 0,
+	    UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
+	if (va == 0) {
+		printf("Failed to allocate VA for rndseed\n");
+		return;
+	}
+	rndseed = (void *)va;
+
+	for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
+		pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
+	pmap_update(pmap_kernel());
+
+	rnd_seed(rndseed, rndseed_size);
+}
+
 #ifdef EFI_RUNTIME
 static void
 fdt_map_efi_runtime(const char *prop, enum arm_efirt_mem_type type)
@@ -518,6 +583,9 @@ initarm(void *arg)
 	/* Parse ramdisk info */
 	fdt_probe_initrd(&initrd_start, &initrd_end);
 
+	/* Parse rndseed */
+	fdt_probe_rndseed(&rndseed_start, &rndseed_end);
+
 	/*
 	 * Populate bootconfig structure for the benefit of
 	 * dodumpsys
@@ -629,6 +697,13 @@ consinit(void)
 }
 
 void
+cpu_startup_hook(void)
+{
+
+	fdt_setup_rndseed();
+}
+
+void
 delay(u_int us)
 {
 	const struct arm_platform *plat = arm_fdt_platform();

Index: src/sys/stand/efiboot/boot.c
diff -u src/sys/stand/efiboot/boot.c:1.18.4.1 src/sys/stand/efiboot/boot.c:1.18.4.2
--- src/sys/stand/efiboot/boot.c:1.18.4.1	Sun Jan 26 11:21:58 2020
+++ src/sys/stand/efiboot/boot.c	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: boot.c,v 1.18.4.1 2020/01/26 11:21:58 martin Exp $	*/
+/*	$NetBSD: boot.c,v 1.18.4.2 2020/02/12 20:10:09 martin Exp $	*/
 
 /*-
  * Copyright (c) 2016 Kimihiro Nonaka <[email protected]>
@@ -75,6 +75,7 @@ static char dtb_path[255];
 static char efibootplist_path[255];
 static char netbsd_path[255];
 static char netbsd_args[255];
+static char rndseed_path[255];
 
 #define	DEFTIMEOUT	5
 #define DEFFILENAME	names[0]
@@ -87,6 +88,7 @@ void	command_dev(char *);
 void	command_dtb(char *);
 void	command_plist(char *);
 void	command_initrd(char *);
+void	command_rndseed(char *);
 void	command_ls(char *);
 void	command_mem(char *);
 void	command_printenv(char *);
@@ -103,6 +105,7 @@ const struct boot_command commands[] = {
 	{ "dtb",	command_dtb,		"dtb [dev:][filename]" },
 	{ "plist",	command_plist,		"plist [dev:][filename]" },
 	{ "initrd",	command_initrd,		"initrd [dev:][filename]" },
+	{ "rndseed",	command_rndseed,	"rndseed [dev:][filename]" },
 	{ "ls",		command_ls,		"ls [hdNn:/path]" },
 	{ "mem",	command_mem,		"mem" },
 	{ "printenv",	command_printenv,	"printenv [key]" },
@@ -183,6 +186,12 @@ command_initrd(char *arg)
 }
 
 void
+command_rndseed(char *arg)
+{
+	set_rndseed_path(arg);
+}
+
+void
 command_ls(char *arg)
 {
 	ls(arg);
@@ -350,6 +359,21 @@ char *get_efibootplist_path(void)
 }
 
 int
+set_rndseed_path(const char *arg)
+{
+	if (strlen(arg) + 1 > sizeof(rndseed_path))
+		return ERANGE;
+	strcpy(rndseed_path, arg);
+	return 0;
+}
+
+char *
+get_rndseed_path(void)
+{
+	return rndseed_path;
+}
+
+int
 set_bootfile(const char *arg)
 {
 	if (strlen(arg) + 1 > sizeof(netbsd_path))
@@ -439,6 +463,15 @@ read_env(void)
 		set_bootargs(s);
 		FreePool(s);
 	}
+
+	s = efi_env_get("rndseed");
+	if (s) {
+#ifdef EFIBOOT_DEBUG
+		printf(">> Setting rndseed path to '%s' from environment\n", s);
+#endif
+		set_rndseed_path(s);
+		FreePool(s);
+	}
 }
 
 void

Index: src/sys/stand/efiboot/efiboot.h
diff -u src/sys/stand/efiboot/efiboot.h:1.10 src/sys/stand/efiboot/efiboot.h:1.10.4.1
--- src/sys/stand/efiboot/efiboot.h:1.10	Sun Apr 21 22:30:41 2019
+++ src/sys/stand/efiboot/efiboot.h	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: efiboot.h,v 1.10 2019/04/21 22:30:41 thorpej Exp $	*/
+/*	$NetBSD: efiboot.h,v 1.10.4.1 2020/02/12 20:10:09 martin Exp $	*/
 
 /*-
  * Copyright (c) 2016 Kimihiro Nonaka <[email protected]>
@@ -64,6 +64,8 @@ int set_dtb_path(const char *);
 char *get_dtb_path(void);
 int set_efibootplist_path(const char *);
 char *get_efibootplist_path(void);
+int set_rndseed_path(const char *);
+char *get_rndseed_path(void);
 
 /* console.c */
 int ischar(void);

Index: src/sys/stand/efiboot/efifdt.c
diff -u src/sys/stand/efiboot/efifdt.c:1.17.2.2 src/sys/stand/efiboot/efifdt.c:1.17.2.3
--- src/sys/stand/efiboot/efifdt.c:1.17.2.2	Sun Sep  1 13:25:22 2019
+++ src/sys/stand/efiboot/efifdt.c	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: efifdt.c,v 1.17.2.2 2019/09/01 13:25:22 martin Exp $ */
+/* $NetBSD: efifdt.c,v 1.17.2.3 2020/02/12 20:10:09 martin Exp $ */
 
 /*-
  * Copyright (c) 2019 Jason R. Thorpe
@@ -383,3 +383,25 @@ efi_fdt_initrd(u_long initrd_addr, u_lon
 	fdt_setprop_u64(fdt_data, chosen, "linux,initrd-start", initrd_addr);
 	fdt_setprop_u64(fdt_data, chosen, "linux,initrd-end", initrd_addr + initrd_size);
 }
+
+void
+efi_fdt_rndseed(u_long rndseed_addr, u_long rndseed_size)
+{
+	int chosen;
+
+	if (rndseed_size == 0)
+		return;
+
+	chosen = fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH);
+	if (chosen < 0)
+		chosen = fdt_add_subnode(fdt_data,
+		    fdt_path_offset(fdt_data, "/"),
+		    FDT_CHOSEN_NODE_NAME);
+	if (chosen < 0)
+		panic("FDT: Failed to create " FDT_CHOSEN_NODE_PATH " node");
+
+	fdt_setprop_u64(fdt_data, chosen, "netbsd,rndseed-start",
+	    rndseed_addr);
+	fdt_setprop_u64(fdt_data, chosen, "netbsd,rndseed-end",
+	    rndseed_addr + rndseed_size);
+}

Index: src/sys/stand/efiboot/efifdt.h
diff -u src/sys/stand/efiboot/efifdt.h:1.6 src/sys/stand/efiboot/efifdt.h:1.6.2.1
--- src/sys/stand/efiboot/efifdt.h:1.6	Wed Jul 24 11:40:36 2019
+++ src/sys/stand/efiboot/efifdt.h	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: efifdt.h,v 1.6 2019/07/24 11:40:36 jmcneill Exp $ */
+/* $NetBSD: efifdt.h,v 1.6.2.1 2020/02/12 20:10:09 martin Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <[email protected]>
@@ -37,5 +37,6 @@ int efi_fdt_overlay_apply(void *, int *)
 void efi_fdt_show(void);
 void efi_fdt_bootargs(const char *);
 void efi_fdt_initrd(u_long, u_long);
+void efi_fdt_rndseed(u_long, u_long);
 void efi_fdt_init(u_long, u_long);
 void efi_fdt_fini(void);

Index: src/sys/stand/efiboot/exec.c
diff -u src/sys/stand/efiboot/exec.c:1.11.2.1 src/sys/stand/efiboot/exec.c:1.11.2.2
--- src/sys/stand/efiboot/exec.c:1.11.2.1	Sun Jan 26 11:21:58 2020
+++ src/sys/stand/efiboot/exec.c	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: exec.c,v 1.11.2.1 2020/01/26 11:21:58 martin Exp $ */
+/* $NetBSD: exec.c,v 1.11.2.2 2020/02/12 20:10:09 martin Exp $ */
 
 /*-
  * Copyright (c) 2019 Jason R. Thorpe
@@ -41,8 +41,8 @@ u_long load_offset = 0;
 #define	FDT_SPACE	(4 * 1024 * 1024)
 #define	FDT_ALIGN	((2 * 1024 * 1024) - 1)
 
-static EFI_PHYSICAL_ADDRESS initrd_addr, dtb_addr;
-static u_long initrd_size = 0, dtb_size = 0;
+static EFI_PHYSICAL_ADDRESS initrd_addr, dtb_addr, rndseed_addr;
+static u_long initrd_size = 0, dtb_size = 0, rndseed_size = 0;
 
 static int
 load_file(const char *path, u_long extra, bool quiet_errors,
@@ -333,9 +333,19 @@ exec_netbsd(const char *fname, const cha
 	}
 
 	if (efi_fdt_size() > 0) {
+		/*
+		 * Load the rndseed as late as possible -- after we
+		 * have committed to using fdt and executing this
+		 * kernel -- so that it doesn't hang around in memory
+		 * if we have to bail or the kernel won't use it.
+		 */
+		load_file(get_rndseed_path(), 0, false,
+		    &rndseed_addr, &rndseed_size);
+
 		efi_fdt_init((marks[MARK_END] + FDT_ALIGN) & ~FDT_ALIGN, FDT_ALIGN + 1);
 		load_fdt_overlays();
 		efi_fdt_initrd(initrd_addr, initrd_size);
+		efi_fdt_rndseed(rndseed_addr, rndseed_size);
 		efi_fdt_bootargs(args);
 #ifdef EFIBOOT_ACPI
 		if (efi_acpi_available())

Index: src/sys/stand/efiboot/version
diff -u src/sys/stand/efiboot/version:1.11.2.2 src/sys/stand/efiboot/version:1.11.2.3
--- src/sys/stand/efiboot/version:1.11.2.2	Sun Dec  8 13:13:06 2019
+++ src/sys/stand/efiboot/version	Wed Feb 12 20:10:09 2020
@@ -1,4 +1,4 @@
-$NetBSD: version,v 1.11.2.2 2019/12/08 13:13:06 martin Exp $
+$NetBSD: version,v 1.11.2.3 2020/02/12 20:10:09 martin Exp $
 
 NOTE ANY CHANGES YOU MAKE TO THE EFI BOOTLOADER HERE.  The format of this
 file is important - make sure the entries are appended on end, last item
@@ -17,3 +17,4 @@ is taken as the current.
 1.10:	Add support for EFI GOP framebuffers in ACPI mode.
 1.11:	Add full UEFI memory map to /chosen node.
 1.12:	Derive ACPI model string from SMBIOS.
+1.13:	Add rndseed support.

Reply via email to