Skip to content

Commit 5cb9972

Browse files
ZideChen0lijinxia
authored andcommitted
hv: cleanup cpu.c and cpu.h
- move all relocatoin code from cpu.c and cpu.h to reloc.c and reloc.h - no any logic changes Signed-off-by: Zide Chen <zide.chen@intel.com> Reviewed-by: Yin fengwei <fengwei.yin@intel.com>
1 parent 6c9e451 commit 5cb9972

File tree

4 files changed

+91
-92
lines changed

4 files changed

+91
-92
lines changed

hypervisor/arch/x86/cpu.c

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@
99
#include <version.h>
1010
#include <reloc.h>
1111

12-
#ifdef CONFIG_EFI_STUB
13-
#include <acrn_efi.h>
14-
#endif
15-
1612
spinlock_t trampoline_spinlock = {
1713
.head = 0U,
1814
.tail = 0U
@@ -31,8 +27,6 @@ volatile uint16_t up_count = 0U;
3127
/* physical cpu active bitmap, support up to 64 cpus */
3228
uint64_t pcpu_active_bitmap = 0UL;
3329

34-
uint64_t trampoline_start16_paddr;
35-
3630
/* TODO: add more capability per requirement */
3731
/*APICv features*/
3832
#define VAPIC_FEATURE_VIRT_ACCESS (1U << 0)
@@ -650,76 +644,6 @@ static uint16_t get_cpu_id_from_lapic_id(uint8_t lapic_id)
650644
return INVALID_CPU_ID;
651645
}
652646

653-
static void update_trampoline_code_refs(uint64_t dest_pa)
654-
{
655-
void *ptr;
656-
uint64_t val;
657-
int i;
658-
659-
/*
660-
* calculate the fixup CS:IP according to fixup target address
661-
* dynamically.
662-
*
663-
* trampoline code starts in real mode,
664-
* so the target addres is HPA
665-
*/
666-
val = dest_pa + trampoline_relo_addr(trampoline_fixup_target);
667-
668-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_cs));
669-
*(uint16_t *)(ptr) = (uint16_t)((val >> 4) & 0xFFFFU);
670-
671-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_ip));
672-
*(uint16_t *)(ptr) = (uint16_t)(val & 0xfU);
673-
674-
/* Update temporary page tables */
675-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_ptr));
676-
*(uint32_t *)(ptr) += dest_pa;
677-
678-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_Start));
679-
*(uint64_t *)(ptr) += dest_pa;
680-
681-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_pdpt_addr));
682-
for (i = 0; i < 4; i++)
683-
*(uint64_t *)(ptr + sizeof(uint64_t) * i) += dest_pa;
684-
685-
/* update the gdt base pointer with relocated offset */
686-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_gdt_ptr));
687-
*(uint64_t *)(ptr + 2) += dest_pa;
688-
689-
/* update trampoline jump pointer with relocated offset */
690-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_start64_fixup));
691-
*(uint32_t *)ptr += (uint32_t)dest_pa;
692-
693-
/* update trampoline's main entry pointer */
694-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(main_entry));
695-
*(uint64_t *)ptr += get_hv_image_delta();
696-
697-
/* update trampoline's spinlock pointer */
698-
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_spinlock_ptr));
699-
*(uint64_t *)ptr += get_hv_image_delta();
700-
}
701-
702-
static uint64_t prepare_trampoline(void)
703-
{
704-
uint64_t size, dest_pa;
705-
706-
size = (uint64_t)_ld_trampoline_end - (uint64_t)_ld_trampoline_start;
707-
#ifndef CONFIG_EFI_STUB
708-
dest_pa = e820_alloc_low_memory(CONFIG_LOW_RAM_SIZE);
709-
#else
710-
dest_pa = (uint64_t)get_ap_trampoline_buf();
711-
#endif
712-
713-
pr_dbg("trampoline code: %llx size %x", dest_pa, size);
714-
715-
/* Copy segment for AP initialization code below 1MB */
716-
(void)memcpy_s(HPA2HVA(dest_pa), (size_t)size, _ld_trampoline_load, (size_t)size);
717-
update_trampoline_code_refs(dest_pa);
718-
trampoline_start16_paddr = dest_pa;
719-
720-
return dest_pa;
721-
}
722-
723647
/*
724648
* Start all secondary CPUs.
725649
*/

hypervisor/boot/include/reloc.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,30 @@
99
extern void _relocate(void);
1010
extern uint64_t get_hv_image_delta(void);
1111
extern uint64_t get_hv_image_base(void);
12-
extern uint64_t trampoline_relo_addr(void *addr);
1312
extern uint64_t read_trampoline_sym(void *sym);
1413
extern void write_trampoline_sym(void *sym, uint64_t val);
14+
extern uint64_t prepare_trampoline(void);
1515

1616
/* external symbols that are helpful for relocation */
1717
extern uint8_t _DYNAMIC[];
18+
extern const uint8_t _ld_trampoline_load[];
19+
extern uint8_t _ld_trampoline_start[];
20+
extern uint8_t _ld_trampoline_end[];
21+
extern const uint64_t _ld_trampoline_size;
1822

1923
extern uint8_t cpu_primary_start_32[];
2024
extern uint8_t cpu_primary_start_64[];
2125

26+
extern uint8_t trampoline_fixup_cs[];
27+
extern uint8_t trampoline_fixup_ip[];
28+
extern uint8_t trampoline_fixup_target[];
29+
extern uint8_t CPU_Boot_Page_Tables_Start[];
30+
extern uint8_t CPU_Boot_Page_Tables_ptr[];
31+
extern uint8_t trampoline_pdpt_addr[];
32+
extern uint8_t trampoline_gdt_ptr[];
33+
extern uint8_t trampoline_start64_fixup[];
2234
extern uint8_t trampoline_spinlock_ptr[];
2335

36+
extern uint64_t trampoline_start16_paddr;
37+
2438
#endif /* RELOCATE_H */

hypervisor/boot/reloc.c

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
#include <hypervisor.h>
88
#include <reloc.h>
9+
#ifdef CONFIG_EFI_STUB
10+
#include <acrn_efi.h>
11+
#endif
912

1013
struct Elf64_Dyn {
1114
uint64_t d_tag;
@@ -26,6 +29,8 @@ struct Elf64_Rel {
2629
#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
2730
#define R_X86_64_RELATIVE 8
2831

32+
uint64_t trampoline_start16_paddr;
33+
2934
/* get the delta between CONFIG_RAM_START and the actual load address */
3035
uint64_t get_hv_image_delta(void)
3136
{
@@ -58,7 +63,7 @@ uint64_t get_hv_image_base(void)
5863
* - The HV code is always relocated to higher address, compared
5964
* with CONFIG_RAM_START
6065
*/
61-
uint64_t trampoline_relo_addr(void *addr)
66+
static uint64_t trampoline_relo_addr(void *addr)
6267
{
6368
return (uint64_t)addr - get_hv_image_delta();
6469
}
@@ -147,3 +152,73 @@ void write_trampoline_sym(void *sym, uint64_t val)
147152
hva = HPA2HVA(trampoline_start16_paddr) + trampoline_relo_addr(sym);
148153
*hva = val;
149154
}
155+
156+
static void update_trampoline_code_refs(uint64_t dest_pa)
157+
{
158+
void *ptr;
159+
uint64_t val;
160+
int i;
161+
162+
/*
163+
* calculate the fixup CS:IP according to fixup target address
164+
* dynamically.
165+
*
166+
* trampoline code starts in real mode,
167+
* so the target addres is HPA
168+
*/
169+
val = dest_pa + trampoline_relo_addr(trampoline_fixup_target);
170+
171+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_cs));
172+
*(uint16_t *)(ptr) = (uint16_t)((val >> 4) & 0xFFFFU);
173+
174+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_ip));
175+
*(uint16_t *)(ptr) = (uint16_t)(val & 0xfU);
176+
177+
/* Update temporary page tables */
178+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_ptr));
179+
*(uint32_t *)(ptr) += (uint32_t)dest_pa;
180+
181+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_Start));
182+
*(uint64_t *)(ptr) += dest_pa;
183+
184+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_pdpt_addr));
185+
for (i = 0; i < 4; i++)
186+
*(uint64_t *)(ptr + sizeof(uint64_t) * i) += dest_pa;
187+
188+
/* update the gdt base pointer with relocated offset */
189+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_gdt_ptr));
190+
*(uint64_t *)(ptr + 2) += dest_pa;
191+
192+
/* update trampoline jump pointer with relocated offset */
193+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_start64_fixup));
194+
*(uint32_t *)ptr += dest_pa;
195+
196+
/* update trampoline's main entry pointer */
197+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(main_entry));
198+
*(uint64_t *)ptr += get_hv_image_delta();
199+
200+
/* update trampoline's spinlock pointer */
201+
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_spinlock_ptr));
202+
*(uint64_t *)ptr += get_hv_image_delta();
203+
}
204+
205+
uint64_t prepare_trampoline(void)
206+
{
207+
uint64_t size, dest_pa;
208+
209+
size = (uint64_t)_ld_trampoline_end - (uint64_t)_ld_trampoline_start;
210+
#ifndef CONFIG_EFI_STUB
211+
dest_pa = e820_alloc_low_memory(CONFIG_LOW_RAM_SIZE);
212+
#else
213+
dest_pa = (uint64_t)get_ap_trampoline_buf();
214+
#endif
215+
216+
pr_dbg("trampoline code: %llx size %x", dest_pa, size);
217+
218+
/* Copy segment for AP initialization code below 1MB */
219+
memcpy_s(HPA2HVA(dest_pa), (size_t)size, _ld_trampoline_load, (size_t)size);
220+
update_trampoline_code_refs(dest_pa);
221+
trampoline_start16_paddr = dest_pa;
222+
223+
return dest_pa;
224+
}

hypervisor/include/arch/x86/cpu.h

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -149,26 +149,12 @@
149149
/**********************************/
150150
/* EXTERNAL VARIABLES */
151151
/**********************************/
152-
extern const uint8_t _ld_trampoline_load[];
153-
extern uint8_t _ld_trampoline_start[];
154-
extern uint8_t _ld_trampoline_end[];
155-
extern const uint64_t _ld_trampoline_size;
156152
extern uint8_t _ld_bss_start[];
157153
extern uint8_t _ld_bss_end[];
158154

159-
extern uint8_t trampoline_fixup_cs[];
160-
extern uint8_t trampoline_fixup_ip[];
161-
extern uint8_t trampoline_fixup_target[];
162-
extern uint8_t CPU_Boot_Page_Tables_Start[];
163-
extern uint8_t CPU_Boot_Page_Tables_ptr[];
164-
extern uint8_t trampoline_pdpt_addr[];
165-
extern uint8_t trampoline_gdt_ptr[];
166-
extern uint8_t trampoline_start64_fixup[];
167-
168155
/* In trampoline range, hold the jump target which trampline will jump to */
169156
extern uint64_t main_entry[1];
170157

171-
extern uint64_t trampoline_start16_paddr;
172158
extern int ibrs_type;
173159
extern spinlock_t trampoline_spinlock;
174160

0 commit comments

Comments
 (0)