aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-06-20 14:58:11 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-06-30 04:42:13 +0000
commit99c12760d07df9dba7bc69f1ae0d915badc7ee17 (patch)
tree5894851aaca61f73bb6fc93630d1add722588f63
parentf027b4f41fb1b748070928175cdf2f57baf66c3a (diff)
downloadsrc-99c12760d07df9dba7bc69f1ae0d915badc7ee17.tar.gz
src-99c12760d07df9dba7bc69f1ae0d915badc7ee17.zip
amd64: do not touch BIOS reset flag halfword, unless we boot through BIOS
(cherry picked from commit 33e1287b6a54672860d6646111ef0e544a00c569)
-rw-r--r--sys/amd64/amd64/locore.S3
-rw-r--r--sys/amd64/amd64/machdep.c12
2 files changed, 10 insertions, 5 deletions
diff --git a/sys/amd64/amd64/locore.S b/sys/amd64/amd64/locore.S
index 3addc3fb10cd..ce37288f4400 100644
--- a/sys/amd64/amd64/locore.S
+++ b/sys/amd64/amd64/locore.S
@@ -56,9 +56,6 @@
*/
NON_GPROF_ENTRY(btext)
- /* Tell the bios to warmboot next time */
- movw $0x1234,0x472
-
/* Don't trust what the loader gives for rflags. */
pushq $PSL_KERNEL
popfq
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 2901ef15e69a..0098e926d0f0 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -1613,11 +1613,20 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
struct region_descriptor r_gdt;
size_t kstack0_sz;
int late_console;
+ bool efi_boot;
TSRAW(&thread0, TS_ENTER, __func__, NULL);
kmdp = init_ops.parse_preload_data(modulep);
+ efi_boot = preload_search_info(kmdp, MODINFO_METADATA |
+ MODINFOMD_EFI_MAP) != NULL;
+
+ if (!efi_boot) {
+ /* Tell the bios to warmboot next time */
+ atomic_store_short((u_short *)0x472, 0x1234);
+ }
+
physfree += ucode_load_bsp(physfree + KERNBASE);
physfree = roundup2(physfree, PAGE_SIZE);
@@ -1769,8 +1778,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
* Once bootblocks have updated, we can test directly for
* efi_systbl != NULL here...
*/
- if (preload_search_info(kmdp, MODINFO_METADATA | MODINFOMD_EFI_MAP)
- != NULL)
+ if (efi_boot)
vty_set_preferred(VTY_VT);
TUNABLE_INT_FETCH("hw.ibrs_disable", &hw_ibrs_disable);