-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathebda.c
More file actions
73 lines (48 loc) · 1.55 KB
/
ebda.c
File metadata and controls
73 lines (48 loc) · 1.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "project.h"
#define EBDA_SEG_ADDR 0x40e
#define LOW_MEM_ADDR 0x413
#define FAKE_EBDA_SEG 0x7000
#define FAKE_SMBIOS_SEG 0x8000
#define ACPI_SIZE 0x10000 /*One segment */
static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
static EFI_GUID acpi2_guid = ACPI_20_TABLE_GUID;
static EFI_GUID smbios_guid = SMBIOS_TABLE_GUID;
static uint64_t find_smbios (EFI_SYSTEM_TABLE *s)
{
unsigned i;
for (i = 0; i < s->NumberOfTableEntries; i++) {
void *guid = &s->ConfigurationTable[i].VendorGuid;
if (!memcmp (guid, &smbios_guid, sizeof (EFI_GUID)))
return (size_t) s->ConfigurationTable[i].VendorTable;
}
return 0;
}
static uint64_t find_acpi (EFI_SYSTEM_TABLE *s)
{
unsigned i;
uint64_t acpi2 = 0, acpi = 0;
for (i = 0; i < s->NumberOfTableEntries; i++) {
void *guid = &s->ConfigurationTable[i].VendorGuid;
if (!memcmp (guid, &acpi2_guid, sizeof (EFI_GUID)))
acpi2 = (size_t) s->ConfigurationTable[i].VendorTable;
if (!memcmp (guid, &acpi_guid, sizeof (EFI_GUID)))
acpi = (size_t) s->ConfigurationTable[i].VendorTable;
}
return acpi2 ? acpi2 : acpi;
}
void make_ebda (EFI_SYSTEM_TABLE *s)
{
uint16_t *ebda_seg_ptr, *low_mem_ptr;
uint64_t t;
t = find_acpi (s);
ebda_seg_ptr = (uint16_t *) EBDA_SEG_ADDR;
low_mem_ptr = (uint16_t *) LOW_MEM_ADDR;
if (t) {
*ebda_seg_ptr = FAKE_EBDA_SEG;
*low_mem_ptr = FAKE_EBDA_SEG >> 6;
memcpy ((void *) (FAKE_EBDA_SEG << 4), (void *)t, ACPI_SIZE);
}
t = find_smbios (s);
if (t)
memcpy ((void *) (FAKE_SMBIOS_SEG << 4), (void *) t, 0x20);
}