hv: treewide: fix 'Array has no bounds specified'

MISRAC requires that the array size should be declared explicitly.

This patch fixes the issues caused by the arrays that are defined in
link_ram.ld.in or assembly file.

v1 -> v2:
 * Update the solution based on the info from the following link.
   https://sourceware.org/binutils/docs/ld/Source-Code-Reference.html

   Fix pattern is like below:
   extern char start_of_ROM, end_of_ROM, start_of_FLASH;
   memcpy (& start_of_FLASH, & start_of_ROM, & end_of_ROM - &
start_of_ROM);

Signed-off-by: Shiqing Gao <shiqing.gao@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Shiqing Gao 2018-07-31 14:05:57 +08:00 committed by lijinxia
parent a3b44a2fa8
commit a71dedecd4
5 changed files with 40 additions and 35 deletions

View File

@ -369,7 +369,8 @@ void bsp_boot_init(void)
start_tsc = rdtsc();
/* Clear BSS */
(void)memset(_ld_bss_start, 0U, (size_t)(_ld_bss_end - _ld_bss_start));
(void)memset(&_ld_bss_start, 0U,
(size_t)(&_ld_bss_end - &_ld_bss_start));
/* Build time sanity checks to make sure hard-coded offset
* is matching the actual offset!

34
hypervisor/boot/include/reloc.h Executable file → Normal file
View File

@ -14,25 +14,25 @@ extern void write_trampoline_sym(void *sym, uint64_t val);
extern uint64_t prepare_trampoline(void);
/* external symbols that are helpful for relocation */
extern uint8_t _DYNAMIC[];
extern const uint8_t _ld_trampoline_load[];
extern uint8_t _ld_trampoline_start[];
extern uint8_t _ld_trampoline_end[];
extern const uint64_t _ld_trampoline_size;
extern uint8_t _DYNAMIC[1];
extern const uint8_t _ld_trampoline_load;
extern uint8_t _ld_trampoline_start;
extern uint8_t _ld_trampoline_end;
extern const uint64_t _ld_trampoline_size;
extern uint8_t cpu_primary_start_32[];
extern uint8_t cpu_primary_start_64[];
extern uint8_t cpu_primary_start_32;
extern uint8_t cpu_primary_start_64;
extern uint8_t trampoline_fixup_cs[];
extern uint8_t trampoline_fixup_ip[];
extern uint8_t trampoline_fixup_target[];
extern uint8_t CPU_Boot_Page_Tables_Start[];
extern uint8_t CPU_Boot_Page_Tables_ptr[];
extern uint8_t trampoline_pdpt_addr[];
extern uint8_t trampoline_gdt_ptr[];
extern uint8_t trampoline_start64_fixup[];
extern uint8_t trampoline_spinlock_ptr[];
extern uint8_t trampoline_fixup_cs;
extern uint8_t trampoline_fixup_ip;
extern uint8_t trampoline_fixup_target;
extern uint8_t CPU_Boot_Page_Tables_Start;
extern uint8_t CPU_Boot_Page_Tables_ptr;
extern uint8_t trampoline_pdpt_addr;
extern uint8_t trampoline_gdt_ptr;
extern uint8_t trampoline_start64_fixup;
extern uint8_t trampoline_spinlock_ptr;
extern uint64_t trampoline_start16_paddr;
extern uint64_t trampoline_start16_paddr;
#endif /* RELOCATE_H */

View File

@ -107,8 +107,8 @@ void _relocate(void)
* absolute addresses
*/
trampoline_end = (uint64_t)_ld_trampoline_end - delta;
primary_32_start = (uint64_t)cpu_primary_start_32 - delta;
primary_32_end = (uint64_t)cpu_primary_start_64 - delta;
primary_32_start = (uint64_t)(&cpu_primary_start_32) - delta;
primary_32_end = (uint64_t)(&cpu_primary_start_64) - delta;
while (start < end) {
if ((ELF64_R_TYPE(start->r_info)) == R_X86_64_RELATIVE) {
@ -168,31 +168,34 @@ static void update_trampoline_code_refs(uint64_t dest_pa)
* trampoline code starts in real mode,
* so the target addres is HPA
*/
val = dest_pa + trampoline_relo_addr(trampoline_fixup_target);
val = dest_pa + trampoline_relo_addr(&trampoline_fixup_target);
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_cs));
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_fixup_cs));
*(uint16_t *)(ptr) = (uint16_t)((val >> 4) & 0xFFFFU);
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_fixup_ip));
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_fixup_ip));
*(uint16_t *)(ptr) = (uint16_t)(val & 0xfU);
/* Update temporary page tables */
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_ptr));
ptr = HPA2HVA(dest_pa +
trampoline_relo_addr(&CPU_Boot_Page_Tables_ptr));
*(uint32_t *)(ptr) += (uint32_t)dest_pa;
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(CPU_Boot_Page_Tables_Start));
ptr = HPA2HVA(dest_pa +
trampoline_relo_addr(&CPU_Boot_Page_Tables_Start));
*(uint64_t *)(ptr) += dest_pa;
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_pdpt_addr));
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_pdpt_addr));
for (i = 0; i < 4; i++)
*(uint64_t *)(ptr + sizeof(uint64_t) * i) += dest_pa;
/* update the gdt base pointer with relocated offset */
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_gdt_ptr));
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_gdt_ptr));
*(uint64_t *)(ptr + 2) += dest_pa;
/* update trampoline jump pointer with relocated offset */
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_start64_fixup));
ptr = HPA2HVA(dest_pa +
trampoline_relo_addr(&trampoline_start64_fixup));
*(uint32_t *)ptr += dest_pa;
/* update trampoline's main entry pointer */
@ -200,7 +203,7 @@ static void update_trampoline_code_refs(uint64_t dest_pa)
*(uint64_t *)ptr += get_hv_image_delta();
/* update trampoline's spinlock pointer */
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(trampoline_spinlock_ptr));
ptr = HPA2HVA(dest_pa + trampoline_relo_addr(&trampoline_spinlock_ptr));
*(uint64_t *)ptr += get_hv_image_delta();
}
@ -208,7 +211,7 @@ uint64_t prepare_trampoline(void)
{
uint64_t size, dest_pa;
size = (uint64_t)_ld_trampoline_end - (uint64_t)_ld_trampoline_start;
size = (uint64_t)(&_ld_trampoline_end - &_ld_trampoline_start);
#ifndef CONFIG_EFI_STUB
dest_pa = e820_alloc_low_memory(CONFIG_LOW_RAM_SIZE);
#else
@ -218,7 +221,8 @@ uint64_t prepare_trampoline(void)
pr_dbg("trampoline code: %llx size %x", dest_pa, size);
/* Copy segment for AP initialization code below 1MB */
memcpy_s(HPA2HVA(dest_pa), (size_t)size, _ld_trampoline_load, (size_t)size);
memcpy_s(HPA2HVA(dest_pa), (size_t)size, &_ld_trampoline_load,
(size_t)size);
update_trampoline_code_refs(dest_pa);
trampoline_start16_paddr = dest_pa;

View File

@ -155,8 +155,8 @@
/**********************************/
/* EXTERNAL VARIABLES */
/**********************************/
extern uint8_t _ld_bss_start[];
extern uint8_t _ld_bss_end[];
extern uint8_t _ld_bss_start;
extern uint8_t _ld_bss_end;
/* In trampoline range, hold the jump target which trampline will jump to */
extern uint64_t main_entry[1];

View File

@ -93,14 +93,14 @@ void init_e820(void);
void obtain_e820_mem_info(void);
extern uint32_t e820_entries;
extern struct e820_entry e820[E820_MAX_ENTRIES];
extern uint32_t boot_regs[];
extern uint32_t boot_regs[2];
extern struct e820_mem_params e820_mem;
int rdmsr_vmexit_handler(struct vcpu *vcpu);
int wrmsr_vmexit_handler(struct vcpu *vcpu);
void init_msr_emulation(struct vcpu *vcpu);
extern const char vm_exit[];
extern const char vm_exit;
struct run_context;
int vmx_vmrun(struct run_context *context, int ops, int ibrs);