mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-29 08:47:24 +00:00
hv: enable early pr_xxx() logs
Currently panic() and pr_xxx() statements before init_primary_pcpu_post() won't be printed, which is inconvenient and misleading for debugging. This patch makes pr_xxx() APIs working before init_pcpu_pre(): - clear .bss in init.c, which makes sense to clear .bss at the very beginning of initialization code. Also this makes it possible to call init_logmsg() before init_pcpu_pre(). - move parse_hv_cmdline() and uart16550_init(true) to init.c. - refine ticks_to_us() to handle the case that it's called before calibrate_tsc(). As a side effect, it prints "0us" in early pr_xxx() calls. - call init_debug_pre() in init_primary_pcpu() and after this point, both printf() and pr_xxx() APIs are available. However, this patch doesn't address the issue that pr_xxx() could be called on PCPUs that set_current_pcpu_id() hasn't been called, which implies that the PCPU ID shown in early logs may not be accurate. Tracked-On: #2987 Signed-off-by: Zide Chen <zide.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
db6fe1e347
commit
f3249e77bd
@ -22,7 +22,6 @@
|
|||||||
#include <vmx.h>
|
#include <vmx.h>
|
||||||
#include <msr.h>
|
#include <msr.h>
|
||||||
#include <ptdev.h>
|
#include <ptdev.h>
|
||||||
#include <ld_sym.h>
|
|
||||||
#include <logmsg.h>
|
#include <logmsg.h>
|
||||||
#include <cat.h>
|
#include <cat.h>
|
||||||
#include <vboot.h>
|
#include <vboot.h>
|
||||||
@ -108,16 +107,6 @@ void init_pcpu_pre(bool is_bsp)
|
|||||||
pcpu_id = BOOT_CPU_ID;
|
pcpu_id = BOOT_CPU_ID;
|
||||||
start_tsc = rdtsc();
|
start_tsc = rdtsc();
|
||||||
|
|
||||||
/* Clear BSS */
|
|
||||||
(void)memset(&ld_bss_start, 0U, (size_t)(&ld_bss_end - &ld_bss_start));
|
|
||||||
|
|
||||||
(void)parse_hv_cmdline();
|
|
||||||
/*
|
|
||||||
* Enable UART as early as possible.
|
|
||||||
* Then we could use printf for debugging on early boot stage.
|
|
||||||
*/
|
|
||||||
uart16550_init(true);
|
|
||||||
|
|
||||||
/* Get CPU capabilities thru CPUID, including the physical address bit
|
/* Get CPU capabilities thru CPUID, including the physical address bit
|
||||||
* limit which is required for initializing paging.
|
* limit which is required for initializing paging.
|
||||||
*/
|
*/
|
||||||
|
@ -15,6 +15,9 @@
|
|||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
#include <logmsg.h>
|
#include <logmsg.h>
|
||||||
#include <seed.h>
|
#include <seed.h>
|
||||||
|
#include <uart16550.h>
|
||||||
|
#include <ld_sym.h>
|
||||||
|
#include <vboot.h>
|
||||||
|
|
||||||
/* Push sp magic to top of stack for call trace */
|
/* Push sp magic to top of stack for call trace */
|
||||||
#define SWITCH_TO(rsp, to) \
|
#define SWITCH_TO(rsp, to) \
|
||||||
@ -29,6 +32,12 @@
|
|||||||
/*TODO: move into debug module */
|
/*TODO: move into debug module */
|
||||||
static void init_debug_pre(void)
|
static void init_debug_pre(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Enable UART as early as possible.
|
||||||
|
* Then we could use printf for debugging on early boot stage.
|
||||||
|
*/
|
||||||
|
uart16550_init(true);
|
||||||
|
|
||||||
/* Initialize console */
|
/* Initialize console */
|
||||||
console_init();
|
console_init();
|
||||||
|
|
||||||
@ -58,8 +67,6 @@ static void init_guest_mode(uint16_t pcpu_id)
|
|||||||
|
|
||||||
static void init_primary_pcpu_post(void)
|
static void init_primary_pcpu_post(void)
|
||||||
{
|
{
|
||||||
init_debug_pre();
|
|
||||||
|
|
||||||
init_seed();
|
init_seed();
|
||||||
|
|
||||||
init_pcpu_post(BOOT_CPU_ID);
|
init_pcpu_post(BOOT_CPU_ID);
|
||||||
@ -78,6 +85,13 @@ void init_primary_pcpu(void)
|
|||||||
{
|
{
|
||||||
uint64_t rsp;
|
uint64_t rsp;
|
||||||
|
|
||||||
|
/* Clear BSS */
|
||||||
|
(void)memset(&ld_bss_start, 0U, (size_t)(&ld_bss_end - &ld_bss_start));
|
||||||
|
|
||||||
|
(void)parse_hv_cmdline();
|
||||||
|
|
||||||
|
init_debug_pre();
|
||||||
|
|
||||||
init_pcpu_pre(true);
|
init_pcpu_pre(true);
|
||||||
|
|
||||||
/* Switch to run-time stack */
|
/* Switch to run-time stack */
|
||||||
|
@ -318,7 +318,13 @@ uint64_t us_to_ticks(uint32_t us)
|
|||||||
|
|
||||||
uint64_t ticks_to_us(uint64_t ticks)
|
uint64_t ticks_to_us(uint64_t ticks)
|
||||||
{
|
{
|
||||||
return (ticks * 1000UL) / (uint64_t)tsc_khz;
|
uint64_t us = 0UL;
|
||||||
|
|
||||||
|
if (tsc_khz != 0U ) {
|
||||||
|
us = (ticks * 1000UL) / (uint64_t)tsc_khz;
|
||||||
|
}
|
||||||
|
|
||||||
|
return us;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t ticks_to_ms(uint64_t ticks)
|
uint64_t ticks_to_ms(uint64_t ticks)
|
||||||
|
Loading…
Reference in New Issue
Block a user