From d5de68e97b529197ebadfd7d2a72f9372ed40f7d Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 12 Dec 2019 00:17:39 +0000 Subject: [PATCH] eclair and crash: clean up architecture dependent codes and comply with Linux page_offset_base Change-Id: Ie14ceb8bc9d816a9201dddd4020e2c21d6cfd686 Fujitsu: POSTK_DEBUG_ARCH_DEP_34 --- executer/user/arch/arm64/arch-eclair.c | 7 +- .../user/arch/arm64/include/arch-eclair.h | 4 - executer/user/arch/x86_64/arch-eclair.c | 22 +++- .../user/arch/x86_64/include/arch-eclair.h | 15 +-- executer/user/eclair.c | 116 +++--------------- executer/user/eclair.h | 6 +- executer/user/ldump2mcdump.c | 4 - tools/crash/mckernel.c | 42 +++++-- 8 files changed, 77 insertions(+), 139 deletions(-) diff --git a/executer/user/arch/arm64/arch-eclair.c b/executer/user/arch/arm64/arch-eclair.c index d8536b4e..ca2e583e 100644 --- a/executer/user/arch/arm64/arch-eclair.c +++ b/executer/user/arch/arm64/arch-eclair.c @@ -50,7 +50,6 @@ int print_kregs(char *rbp, size_t rbp_size, const struct arch_kregs *kregs) return total; } -#ifdef POSTK_DEBUG_ARCH_DEP_34 uintptr_t virt_to_phys(uintptr_t va) { extern uintptr_t kernel_base; @@ -65,5 +64,9 @@ uintptr_t virt_to_phys(uintptr_t va) return NOPHYS; } /* virt_to_phys() */ -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ +int arch_setup_constants(void) +{ + /* Nothing here */ + return 0; +} diff --git a/executer/user/arch/arm64/include/arch-eclair.h b/executer/user/arch/arm64/include/arch-eclair.h index a6ccb189..9140788b 100644 --- a/executer/user/arch/arm64/include/arch-eclair.h +++ b/executer/user/arch/arm64/include/arch-eclair.h @@ -61,8 +61,4 @@ struct arch_kregs { unsigned long fp, sp, pc; }; -#ifdef POSTK_DEBUG_ARCH_DEP_34 -uintptr_t virt_to_phys(uintptr_t va); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ - #endif /* HEADER_USER_ARM64_ECLAIR_H */ diff --git a/executer/user/arch/x86_64/arch-eclair.c b/executer/user/arch/x86_64/arch-eclair.c index 3e17d559..da3a7cf8 100644 --- a/executer/user/arch/x86_64/arch-eclair.c +++ b/executer/user/arch/x86_64/arch-eclair.c @@ -3,6 +3,8 @@ #include #include +unsigned long linux_page_offset = 0xffff880000000000UL; + int print_kregs(char *rbp, size_t rbp_size, const struct arch_kregs *kregs) { int i, ret, total = 0; @@ -100,16 +102,15 @@ int print_kregs(char *rbp, size_t rbp_size, const struct arch_kregs *kregs) return total; } -#ifdef POSTK_DEBUG_ARCH_DEP_34 -static uintptr_t virt_to_phys(uintptr_t va) +uintptr_t virt_to_phys(uintptr_t va) { extern uintptr_t kernel_base; if (va >= MAP_KERNEL_START) { return va - MAP_KERNEL_START + kernel_base; } - else if (va >= LINUX_PAGE_OFFSET) { - return va - LINUX_PAGE_OFFSET; + else if (va >= linux_page_offset) { + return va - linux_page_offset; } else if (va >= MAP_FIXED_START) { return va - MAP_FIXED_START; @@ -120,5 +121,16 @@ static uintptr_t virt_to_phys(uintptr_t va) return NOPHYS; } /* virt_to_phys() */ -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ + +int arch_setup_constants(void) +{ + if (read_symbol_64("linux_page_offset_base", + &linux_page_offset) != 0) { + fprintf(stderr, "error: obtaining Linux page offset\n"); + return 1; + } + + printf("x86 linux_page_offset: 0x%lx\n", linux_page_offset); + return 0; +} diff --git a/executer/user/arch/x86_64/include/arch-eclair.h b/executer/user/arch/x86_64/include/arch-eclair.h index 1dfa09c3..cc466d15 100644 --- a/executer/user/arch/x86_64/include/arch-eclair.h +++ b/executer/user/arch/x86_64/include/arch-eclair.h @@ -2,19 +2,10 @@ #ifndef HEADER_USER_X86_ECLAIR_H #define HEADER_USER_X86_ECLAIR_H -#ifndef POSTK_DEBUG_ARCH_DEP_34 #define MAP_ST_START 0xffff800000000000UL -#define MAP_VMAP_START 0xffff850000000000UL #define MAP_FIXED_START 0xffff860000000000UL -#define LINUX_PAGE_OFFSET 0xffff880000000000UL #define MAP_KERNEL_START 0xFFFFFFFFFE800000UL -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ - -/* TODO: these should be updated when McKernel changes */ -#define MCKERNEL_ELF_START "0xFFFFFFFFFE801000" -#define MCKERNEL_ELF_LEN "0x0000000000100000" - - +extern unsigned long linux_page_offset; #define ARCH_CLV_SPAN "x86_cpu_local_variables_span" #define ARCH "i386:x86-64" @@ -31,8 +22,4 @@ struct arch_kregs { uintptr_t r15, rflags, rsp0; }; -#ifdef POSTK_DEBUG_ARCH_DEP_34 -uintptr_t virt_to_phys(uintptr_t va); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ - #endif /* HEADER_USER_x86_ECLAIR_H */ diff --git a/executer/user/eclair.c b/executer/user/eclair.c index 30b31749..35a06237 100644 --- a/executer/user/eclair.c +++ b/executer/user/eclair.c @@ -57,11 +57,7 @@ struct thread_info { int idle; uintptr_t process; uintptr_t clv; -#ifdef POSTK_DEBUG_ARCH_DEP_34 uintptr_t arch_clv; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - uintptr_t x86_clv; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ }; /* struct thread_info */ static struct options opt; @@ -73,19 +69,13 @@ static dump_mem_chunks_t *mem_chunks; static int num_processors = -1; static asymbol **symtab = NULL; static ssize_t nsyms; -#ifdef POSTK_DEBUG_ARCH_DEP_34 uintptr_t kernel_base; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ -static uintptr_t kernel_base; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ static struct thread_info *tihead = NULL; static struct thread_info **titailp = &tihead; static struct thread_info *curr_thread = NULL; -#ifndef POSTK_DEBUG_ARCH_DEP_34 -static uintptr_t ihk_mc_switch_context = -1; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ -uintptr_t lookup_symbol(char *name) { +uintptr_t lookup_symbol(char *name) +{ int i; for (i = 0; i < nsyms; ++i) { @@ -97,28 +87,8 @@ uintptr_t lookup_symbol(char *name) { return NOSYMBOL; } /* lookup_symbol() */ -#ifndef POSTK_DEBUG_ARCH_DEP_34 -#define NOPHYS ((uintptr_t)-1) - -static uintptr_t virt_to_phys(uintptr_t va) { - if (va >= MAP_KERNEL_START) { - return va - MAP_KERNEL_START + kernel_base; - } - else if (va >= LINUX_PAGE_OFFSET) { - return va - LINUX_PAGE_OFFSET; - } - else if (va >= MAP_FIXED_START) { - return va - MAP_FIXED_START; - } - else if (va >= MAP_ST_START) { - return va - MAP_ST_START; - } - - return NOPHYS; -} /* virt_to_phys() */ -#endif /* !POSTK_DEBUG_ARCH_DEP_34 */ - -static int read_physmem(uintptr_t pa, void *buf, size_t size) { +static int read_physmem(uintptr_t pa, void *buf, size_t size) +{ off_t off; bfd_boolean ok; int i; @@ -162,7 +132,8 @@ static int read_physmem(uintptr_t pa, void *buf, size_t size) { return 0; } /* read_physmem() */ -static int read_mem(uintptr_t va, void *buf, size_t size) { +int read_mem(uintptr_t va, void *buf, size_t size) +{ uintptr_t pa; int error; @@ -197,15 +168,18 @@ static int read_mem(uintptr_t va, void *buf, size_t size) { return 0; } /* read_mem() */ -static int read_64(uintptr_t va, void *buf) { +int read_64(uintptr_t va, void *buf) +{ return read_mem(va, buf, sizeof(uint64_t)); } /* read_64() */ -static int read_32(uintptr_t va, void *buf) { +int read_32(uintptr_t va, void *buf) +{ return read_mem(va, buf, sizeof(uint32_t)); } /* read_32() */ -static int read_symbol_64(char *name, void *buf) { +int read_symbol_64(char *name, void *buf) +{ uintptr_t va; int error; @@ -251,6 +225,12 @@ static int setup_constants(void) { int error; uintptr_t va; + error = arch_setup_constants(); + if (error) { + fprintf(stderr, "error: setting up arch constants\n"); + return 1; + } + va = lookup_symbol("debug_constants"); if (va == NOSYMBOL) { perror("debug_constants"); @@ -302,17 +282,9 @@ static int setup_threads(void) { return 1; } -#ifdef POSTK_DEBUG_ARCH_DEP_34 error = read_symbol_64(ARCH_CLV_SPAN, &locals_span); -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - error = read_symbol_64("x86_cpu_local_variables_span", &locals_span); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ if (error) { -#ifdef POSTK_DEBUG_ARCH_DEP_34 locals_span = sysconf(_SC_PAGESIZE); -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - locals_span = 4096; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ } if (0) printf("locals 0x%lx span 0x%lx\n", locals, locals_span); @@ -322,11 +294,6 @@ static int setup_threads(void) { return 1; } -#ifndef POSTK_DEBUG_ARCH_DEP_34 - ihk_mc_switch_context = lookup_symbol("ihk_mc_switch_context"); - if (0) printf("ihk_mc_switch_context: %lx\n", ihk_mc_switch_context); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ - for (cpu = 0; cpu < num_processors; ++cpu) { uintptr_t v; uintptr_t head; @@ -396,11 +363,7 @@ static int setup_threads(void) { ti->process = thread; ti->idle = 0; ti->clv = v; -#ifdef POSTK_DEBUG_ARCH_DEP_34 ti->arch_clv = locals + locals_span*cpu; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - ti->x86_clv = locals + locals_span*cpu; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ *titailp = ti; titailp = &ti->next; @@ -476,11 +439,7 @@ static int setup_threads(void) { ti->process = thread; ti->idle = 1; ti->clv = v; -#ifdef POSTK_DEBUG_ARCH_DEP_34 - ti->arch_clv = locals + locals_span*cpu; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - ti->x86_clv = locals + locals_span*cpu; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ + ti->arch_clv = locals + locals_span * cpu; *titailp = ti; titailp = &ti->next; @@ -534,11 +493,7 @@ static int setup_threads(void) { ti->process = current; ti->idle = 1; ti->clv = v; -#ifdef POSTK_DEBUG_ARCH_DEP_34 - ti->arch_clv = locals + locals_span*cpu; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - ti->x86_clv = locals + locals_span*cpu; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ + ti->arch_clv = locals + locals_span * cpu; *titailp = ti; titailp = &ti->next; @@ -560,11 +515,7 @@ static int setup_symbols(char *fname) { ssize_t needs; bfd_boolean ok; -#ifdef POSTK_DEBUG_ARCH_DEP_34 symbfd = bfd_openr(fname, NULL); -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - symbfd = bfd_openr(fname, "elf64-x86-64"); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ if (!symbfd) { bfd_perror("bfd_openr"); @@ -611,11 +562,7 @@ static int setup_dump(char *fname) { char physmem_name[PHYSMEM_NAME_SIZE]; int i; -#ifdef POSTK_DEBUG_ARCH_DEP_34 dumpbfd = bfd_fopen(opt.dump_path, NULL, "r", -1); -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - dumpbfd = bfd_fopen(opt.dump_path, "elf64-x86-64", "r", -1); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ if (!dumpbfd) { bfd_perror("bfd_fopen"); return 1; @@ -765,17 +712,10 @@ static void command(const char *cmd, char *res, size_t res_size) { rbp += sprintf(rbp, "1"); } else if (!strncmp(p, "qXfer:features:read:target.xml:", 31)) { -#ifdef POSTK_DEBUG_ARCH_DEP_34 char *str = "" ""ARCH"" ""; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - char *str = - "" - "i386:x86-64" - ""; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ rbp += sprintf(rbp, "l"); if (0) rbp += print_hex(rbp, res_size, str); @@ -802,21 +742,12 @@ static void command(const char *cmd, char *res, size_t res_size) { } else { int error; -#ifdef POSTK_DEBUG_ARCH_DEP_34 uintptr_t regs[ARCH_REGS]; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - uintptr_t regs[21]; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ uint8_t *pu8; int i; -#ifdef POSTK_DEBUG_ARCH_DEP_34 error = read_mem(curr_thread->arch_clv+PANIC_REGS_OFFSET, ®s, sizeof(regs)); -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - error = read_mem(curr_thread->x86_clv+240, - ®s, sizeof(regs)); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ if (error) { perror("read_mem"); break; @@ -863,17 +794,10 @@ static void command(const char *cmd, char *res, size_t res_size) { rbp += sprintf(rbp, "T0;tnotrun:0"); } else if (!strncmp(p, "qXfer:memory-map:read::", 23)) { -#ifdef POSTK_DEBUG_ARCH_DEP_34 char *str = "" "" ""; -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - char *str = - "" - "" - ""; -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ rbp += sprintf(rbp, "l"); if (0) rbp += print_hex(rbp, res_size, str); diff --git a/executer/user/eclair.h b/executer/user/eclair.h index 57298f48..524c8c97 100644 --- a/executer/user/eclair.h +++ b/executer/user/eclair.h @@ -10,13 +10,15 @@ /* common */ uintptr_t lookup_symbol(char *name); +int read_symbol_64(char *name, void *buf); ssize_t print_bin(char *buf, size_t buf_size, void *data, size_t size); /* arch depend */ int print_kregs(char *rbp, size_t rbp_size, const struct arch_kregs *kregs); -#ifdef POSTK_DEBUG_ARCH_DEP_34 #define NOPHYS ((uintptr_t)-1) -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ +uintptr_t virt_to_phys(uintptr_t va); + +int arch_setup_constants(void); #endif /* HEADER_USER_COMMON_ECLAIR_H */ diff --git a/executer/user/ldump2mcdump.c b/executer/user/ldump2mcdump.c index 5b094f5e..ace7895f 100644 --- a/executer/user/ldump2mcdump.c +++ b/executer/user/ldump2mcdump.c @@ -244,11 +244,7 @@ void cmd_ldump2mcdump(void) bfd_init(); -#ifdef POSTK_DEBUG_ARCH_DEP_34 /* use bfd_open target is NULL(automatic) */ abfd = bfd_fopen(fname, NULL, "w", -1); -#else /* POSTK_DEBUG_ARCH_DEP_34 */ - abfd = bfd_fopen(fname, "elf64-x86-64", "w", -1); -#endif /* POSTK_DEBUG_ARCH_DEP_34 */ if (!abfd) { bfd_perror("bfd_fopen"); return; diff --git a/tools/crash/mckernel.c b/tools/crash/mckernel.c index 2ba7610c..5b070399 100644 --- a/tools/crash/mckernel.c +++ b/tools/crash/mckernel.c @@ -82,7 +82,11 @@ static struct mck_size_table { #define MCK_SIZE_INIT(X, Y) (MCK_ASSIGN_SIZE(X) = STRUCT_SIZE(Y)) #ifdef X86_64 -#define LINUX_PAGE_OFFSET 0xffff880000000000UL +#define MAP_FIXED_START 0xffff860000000000UL +#define MAP_KERNEL_START 0xffffffff80000000UL +#define MAP_ST_START 0xffff800000000000UL +unsigned long LINUX_PAGE_OFFSET = -1UL; +unsigned long x86_kernel_phys_base = -1UL; static inline ulong phys_to_virt(ulong phys) { return phys + LINUX_PAGE_OFFSET; @@ -100,9 +104,29 @@ static inline ulong phys_to_virt(ulong phys) int mcreadmem(ulonglong addr, int memtype, void *buffer, long size, char *type, ulong error_handle) { -#ifdef ARM64 ulong phys; - +#ifdef X86_64 + if (LINUX_PAGE_OFFSET != -1UL && + x86_kernel_phys_base != -1UL) { + if (addr >= MAP_KERNEL_START && + addr < MAP_KERNEL_START + 0x4000) { + phys = addr - MAP_KERNEL_START + x86_kernel_phys_base; + } + else if (addr >= LINUX_PAGE_OFFSET) { + phys = addr - LINUX_PAGE_OFFSET; + } + else if (addr >= MAP_FIXED_START) { + phys = addr - MAP_FIXED_START; + } + else if (addr >= MAP_ST_START) { + phys = addr - MAP_ST_START; + } + else { + kvtop(NULL, addr, &phys, 0); + } + addr = phys_to_virt(phys); + } +#elif defined ARM64 /* * Crash on ARM RedHat8 can't seem to access module space * virtual addresses, translate to kernel fixed map. @@ -148,13 +172,6 @@ get_symbol_value(char *name) close_tmpfile2(); -#ifdef X86_64 - /* adjust symbols in MAP_ST_START */ - if (value < 0xffff810000000000UL && value >= 0xffff800000000000UL) { - value += 0x80000000000UL; - } -#endif - return value; } @@ -1050,7 +1067,8 @@ static void arch_init(void) { #ifdef X86_64 - /* nothing to do */ + LINUX_PAGE_OFFSET = get_symbol_value("linux_page_offset_base"); + x86_kernel_phys_base = get_symbol_value("x86_kernel_phys_base"); #elif defined(ARM64) V2PHYS_OFFSET = get_symbol_value("memstart_addr"); @@ -1625,7 +1643,7 @@ cmd_mcinfo(void) #ifdef x86 #endif - + fprintf(fp, "LINUX_PAGE_OFFSET: 0x%lx\n", LINUX_PAGE_OFFSET); #ifdef ARM64 fprintf(fp, "V2PHYS_OFFSET: 0x%lx\n", V2PHYS_OFFSET);