aboutsummaryrefslogtreecommitdiff
path: root/src/post.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-01-12 14:22:33 -0500
committerKevin O'Connor <kevin@koconnor.net>2016-01-12 14:22:33 -0500
commita48f602c2099d3bd325729fe64e5b237d1b597f8 (patch)
treeb7e4688da07656fc7bbf3b79de763899fe849108 /src/post.c
parentb837e68d5a6c1a5945513f1995875445a1594c8a (diff)
downloadseabios-hppa-a48f602c2099d3bd325729fe64e5b237d1b597f8.zip
seabios-hppa-a48f602c2099d3bd325729fe64e5b237d1b597f8.tar.gz
seabios-hppa-a48f602c2099d3bd325729fe64e5b237d1b597f8.tar.bz2
post: Always set HaveRunPost prior to setting any other global variable
The HaveRunPost flag controls whether post or reboot handling is entered on a reset signal. The flag needs to be set before any other global variable because an external reboot signal could occur at any time. (If any global variable is modified prior to setting HaveRunPost then the code might enter post with global variables in a dirty state.) Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/post.c')
-rw-r--r--src/post.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/post.c b/src/post.c
index 49c22b8..e5fa4be 100644
--- a/src/post.c
+++ b/src/post.c
@@ -41,10 +41,6 @@ ivt_init(void)
{
dprintf(3, "init ivt\n");
- // Setup reset-vector entry point (controls legacy reboots).
- HaveRunPost = 1;
- rtc_write(CMOS_RESET_CODE, 0);
-
// Initialize all vectors to the default handler.
int i;
for (i=0; i<256; i++)
@@ -304,10 +300,26 @@ reloc_preinit(void *f, void *arg)
func(arg);
}
+// Runs after all code is present and prior to any modifications
+void
+code_mutable_preinit(void)
+{
+ if (HaveRunPost)
+ // Already run
+ return;
+ // Setup reset-vector entry point (controls legacy reboots).
+ rtc_write(CMOS_RESET_CODE, 0);
+ barrier();
+ HaveRunPost = 1;
+ barrier();
+}
+
// Setup for code relocation and then relocate.
void VISIBLE32INIT
dopost(void)
{
+ code_mutable_preinit();
+
// Detect ram and setup internal malloc.
qemu_preinit();
coreboot_preinit();