summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/ebda.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/arch/x86/ebda.c b/src/arch/x86/ebda.c
index 284b5be1b5..b5dfb413ae 100644
--- a/src/arch/x86/ebda.c
+++ b/src/arch/x86/ebda.c
@@ -22,6 +22,10 @@
void setup_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size)
{
+ u16 low_memory_kb;
+ u16 ebda_kb;
+ void *ebda;
+
/* Skip in S3 resume path */
if (acpi_is_wakeup_s3())
return;
@@ -29,15 +33,20 @@ void setup_ebda(u32 low_memory_size, u16 ebda_segment, u16 ebda_size)
if (!low_memory_size || !ebda_segment || !ebda_size)
return;
+ low_memory_kb = low_memory_size >> 10;
+ ebda_kb = ebda_size >> 10;
+ ebda = (void *)((uintptr_t)ebda_segment << 4);
+
/* clear BIOS DATA AREA */
- memset((void *)X86_BDA_BASE, 0, X86_BDA_SIZE);
+ memset(X86_BDA_BASE, 0, X86_BDA_SIZE);
- write16(X86_EBDA_LOWMEM, (low_memory_size >> 10));
- write16(X86_EBDA_SEGMENT, ebda_segment);
+ /* Avoid unaligned write16() since it's undefined behavior */
+ memcpy(X86_EBDA_LOWMEM, &low_memory_kb, sizeof(low_memory_kb));
+ memcpy(X86_EBDA_SEGMENT, &ebda_segment, sizeof(ebda_segment));
/* Set up EBDA */
- memset((void *)((uintptr_t)ebda_segment << 4), 0, ebda_size);
- write16((void *)((uintptr_t)ebda_segment << 4), (ebda_size >> 10));
+ memset(ebda, 0, ebda_size);
+ memcpy(ebda, &ebda_kb, sizeof(ebda_kb));
}
void setup_default_ebda(void)