Skip to content

Commit 2a37a4d

Browse files
zhenggenjren1
authored andcommitted
ACPI: bug fix on address convertion
Before referencing to phisical address of acpi tables, switch it to virtual address. Signed-off-by: Zheng, Gen <gen.zheng@intel.com>
1 parent c5f860e commit 2a37a4d

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

hypervisor/boot/acpi.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ struct acpi_madt_local_apic {
107107
};
108108

109109
static void *global_rsdp;
110-
static uint64_t madt;
111110

112111
static struct acpi_table_rsdp*
113112
biosacpi_search_rsdp(char *base, int length)
@@ -150,14 +149,14 @@ static void *get_rsdp(void)
150149
#endif
151150

152151
/* EBDA is addressed by the 16 bit pointer at 0x40E */
153-
addr = (uint16_t *)0x40E;
152+
addr = (uint16_t *)HPA2HVA(0x40E);
154153

155-
rsdp = biosacpi_search_rsdp((char *)((uint64_t)(*addr << 4)), 0x400);
154+
rsdp = biosacpi_search_rsdp((char *)HPA2HVA((uint64_t)(*addr << 4)), 0x400);
156155
if (rsdp != NULL)
157156
return rsdp;
158157

159158
/* Check the upper memory BIOS space, 0xe0000 - 0xfffff. */
160-
rsdp = biosacpi_search_rsdp((char *)0xe0000, 0x20000);
159+
rsdp = biosacpi_search_rsdp((char *)HPA2HVA(0xe0000), 0x20000);
161160
if (rsdp != NULL)
162161
return rsdp;
163162

@@ -167,15 +166,16 @@ static void *get_rsdp(void)
167166
static int
168167
probe_table(uint64_t address, const char *sig)
169168
{
170-
struct acpi_table_header *table = (struct acpi_table_header *)address;
169+
void *va = HPA2HVA(address);
170+
struct acpi_table_header *table = (struct acpi_table_header *)va;
171171

172172
if (strncmp(table->signature, sig, ACPI_NAME_SIZE) != 0)
173173
return 0;
174174

175175
return 1;
176176
}
177177

178-
uint64_t get_acpi_tbl(char *sig)
178+
void *get_acpi_tbl(char *sig)
179179
{
180180
struct acpi_table_rsdp *rsdp;
181181
struct acpi_table_rsdt *rsdt;
@@ -191,7 +191,7 @@ uint64_t get_acpi_tbl(char *sig)
191191
* the version 1.0 portion of the RSDP. Version 2.0 has
192192
* an additional checksum that we verify first.
193193
*/
194-
xsdt = (struct acpi_table_xsdt *)(rsdp->xsdt_physical_address);
194+
xsdt = (struct acpi_table_xsdt *)HPA2HVA(rsdp->xsdt_physical_address);
195195
count = (xsdt->header.length -
196196
sizeof(struct acpi_table_header)) /
197197
sizeof(uint64_t);
@@ -205,7 +205,7 @@ uint64_t get_acpi_tbl(char *sig)
205205
} else {
206206
/* Root table is an RSDT (32-bit physical addresses) */
207207
rsdt = (struct acpi_table_rsdt *)
208-
((void *)(uint64_t)rsdp->rsdt_physical_address);
208+
HPA2HVA((uint64_t)rsdp->rsdt_physical_address);
209209
count = (rsdt->header.length -
210210
sizeof(struct acpi_table_header)) /
211211
sizeof(uint32_t);
@@ -218,10 +218,10 @@ uint64_t get_acpi_tbl(char *sig)
218218
}
219219
}
220220

221-
return addr;
221+
return HPA2HVA(addr);
222222
}
223223

224-
static int _parse_madt(uint64_t madt, uint8_t *lapic_id_base)
224+
static int _parse_madt(void *madt, uint8_t *lapic_id_base)
225225
{
226226
int pcpu_id = 0;
227227
struct acpi_madt_local_apic *processor;
@@ -257,6 +257,8 @@ static int _parse_madt(uint64_t madt, uint8_t *lapic_id_base)
257257
/* The lapic_id info gotten from madt will be returned in lapic_id_base */
258258
int parse_madt(uint8_t *lapic_id_base)
259259
{
260+
void *madt;
261+
260262
global_rsdp = get_rsdp();
261263
ASSERT(global_rsdp != NULL, "fail to get rsdp");
262264

@@ -266,7 +268,7 @@ int parse_madt(uint8_t *lapic_id_base)
266268
return _parse_madt(madt, lapic_id_base);
267269
}
268270

269-
uint64_t get_dmar_table(void)
271+
void *get_dmar_table(void)
270272
{
271273
return get_acpi_tbl(ACPI_SIG_DMAR);
272274
}

hypervisor/boot/include/acpi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,5 @@ struct acpi_table_header {
5454

5555
int parse_madt(uint8_t *lapic_id_base);
5656

57-
uint64_t get_dmar_table(void);
57+
void *get_dmar_table(void);
5858
#endif /* !ACPI_H */

hypervisor/bsp/uefi/uefi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void *get_rsdp_from_uefi(void)
166166
if (!efi_initialized)
167167
efi_init();
168168

169-
return efi_ctx->rsdp;
169+
return HPA2HVA(efi_ctx->rsdp);
170170
}
171171

172172
static void efi_init(void)

0 commit comments

Comments
 (0)