From 9800f9d3b103485b3f4abaa34fb225b8586cba71 Mon Sep 17 00:00:00 2001 From: zhilan Date: Mon, 24 Apr 2023 10:12:10 +0800 Subject: [PATCH 1/3] podmem: adaptive for 5.10 kernel --- source/tools/detect/mem/podmem/entry/Makefile | 1 + .../tools/detect/mem/podmem/memcache/cache.h | 44 ++++++++++++++++++- .../detect/mem/podmem/memcache/memread.cpp | 15 ++++++- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/source/tools/detect/mem/podmem/entry/Makefile b/source/tools/detect/mem/podmem/entry/Makefile index a52b0bd3..da8727a7 100644 --- a/source/tools/detect/mem/podmem/entry/Makefile +++ b/source/tools/detect/mem/podmem/entry/Makefile @@ -1,3 +1,4 @@ target = podmem +pymods += pagealloc DEPEND := "python-dep{all}" include $(SRC)/mk/py.mk diff --git a/source/tools/detect/mem/podmem/memcache/cache.h b/source/tools/detect/mem/podmem/memcache/cache.h index b48008ba..4b493cd6 100644 --- a/source/tools/detect/mem/podmem/memcache/cache.h +++ b/source/tools/detect/mem/podmem/memcache/cache.h @@ -9,6 +9,7 @@ #include #include #include +#include #define MAX_ORDER 11 #define PAGE_SHIT 12 @@ -36,12 +37,53 @@ extern unsigned long vmemmap_base; extern unsigned long page_offset_base; extern uint64_t g_max_phy_addr; +extern unsigned long memstart_addr; #define PAGE_STRUCT_SIZE 64 +#ifdef __aarch64__ /*arm arch*/ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) /*kernel 510*/ +#define VA_BITS (48) +#define SZ_2M 0x00200000 +#define STRUCT_PAGE_MAX_SHIFT (6) +#define VA_BITS_MIN (48) + +#define _PAGE_END(va) (-((unsigned long )(1) << ((va) - 1))) +#define _PAGE_OFFSET(va) (-((unsigned long )(1) << (va))) +#define PAGE_OFFSET (_PAGE_OFFSET(VA_BITS)) +#define VMEMMAP_SIZE ((_PAGE_END(VA_BITS_MIN) - PAGE_OFFSET) \ + >> (PAGE_SHIT - STRUCT_PAGE_MAX_SHIFT)) +#define PHYS_OFFSET (memstart_addr) +#define VMEMMAP_START (-VMEMMAP_SIZE - SZ_2M) +#define vmemmap (VMEMMAP_START - (memstart_addr >> PAGE_SHIT)*PAGE_STRUCT_SIZE) + +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 9)/*kernel 419*/ +#define VA_BITS (48) +#define VA_START ((unsigned long )(0xffffffffffffffff) - \ + ((unsigned long )(1) << VA_BITS) + 1) +#define PAGE_OFFSET ((unsigned long )(0xffffffffffffffff) - \ + ((unsigned long )(1) << (VA_BITS - 1)) + 1) +#define STRUCT_PAGE_MAX_SHIFT (6) +#define VMEMMAP_SIZE ((unsigned long )(1) << (VA_BITS - PAGE_SHIT - 1 + STRUCT_PAGE_MAX_SHIFT)) +#define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE) +#define vmemmap (VMEMMAP_START - (memstart_addr >> PAGE_SHIT)*PAGE_STRUCT_SIZE) + +#else /*others*/ +#define SZ_64K 0x00010000 +#define PAGE_OFFSET (unsigned long )(0xffffffc000000000) +#define VMALLOC_END (PAGE_OFFSET - (unsigned long)(0x400000000) - SZ_64K) +#define vmemmap ((struct page *)(VMALLOC_END + SZ_64K)) + +#endif /*end to check ver, arm arch*/ +#define PFN_TO_VIRT(pfn) (((unsigned long)((pfn) - PHYS_OFFSET) | PAGE_OFFSET) + ((pfn) << PAGE_SHIT)) +#define PFN_TO_PAGE(pfn) (vmemmap + (pfn) * PAGE_STRUCT_SIZE) +#define is_kvaddr(kvaddr) (!!(kvaddr >= PAGE_OFFSET)) +#else /*x86 arch*/ + #define PFN_TO_VIRT(pfn) (page_offset_base + ((pfn) << PAGE_SHIT)) #define PFN_TO_PAGE(pfn) (vmemmap_base + (pfn) * PAGE_STRUCT_SIZE) -#define max_pfn (g_max_phy_addr>>12) #define is_kvaddr(kvaddr) (!!(kvaddr >= page_offset_base)) +#endif +#define max_pfn (g_max_phy_addr>>12) struct options { bool podmem; diff --git a/source/tools/detect/mem/podmem/memcache/memread.cpp b/source/tools/detect/mem/podmem/memcache/memread.cpp index 3c7ebb4d..f4489956 100644 --- a/source/tools/detect/mem/podmem/memcache/memread.cpp +++ b/source/tools/detect/mem/podmem/memcache/memread.cpp @@ -63,6 +63,7 @@ uint64_t g_max_phy_addr; */ unsigned long vmemmap_base = 0xffffea0000000000UL; unsigned long page_offset_base = 0xffff880000000000UL; +unsigned long memstart_addr = 0x0; /* * Routines of kpageflags, i.e., /proc/kpageflags @@ -168,8 +169,9 @@ static int kcore_elf_init(void) static int kcore_init(void) { - unsigned long vmemmap_symbol_addr; - unsigned long page_offset_symbol_addr; + unsigned long vmemmap_symbol_addr; + unsigned long page_offset_symbol_addr; + unsigned long memstart_addr_addr; int size; if ((kcore_fd = open("/proc/kcore", O_RDONLY)) < 0) { @@ -200,6 +202,15 @@ static int kcore_init(void) goto failed; } + memstart_addr_addr = lookup_kernel_symbol("memstart_addr"); + if (memstart_addr_addr == (unsigned long)-1) { + LOG_WARN("continue to use default memstart_addr_base: 0x%lx\n", + memstart_addr); + } else { + size = kcore_readmem(memstart_addr_addr, &memstart_addr, 8); + if (size < 8) + goto failed; + } return 0; failed: -- Gitee From efae2648b8d3148516aad8a1a8078d5d0a327892 Mon Sep 17 00:00:00 2001 From: zhilan Date: Mon, 24 Apr 2023 14:51:03 +0800 Subject: [PATCH 2/3] podmem: get page shift dynamically --- .../tools/detect/mem/podmem/memcache/cache.h | 16 +++++++------- .../detect/mem/podmem/memcache/memread.cpp | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/source/tools/detect/mem/podmem/memcache/cache.h b/source/tools/detect/mem/podmem/memcache/cache.h index 4b493cd6..47eb37aa 100644 --- a/source/tools/detect/mem/podmem/memcache/cache.h +++ b/source/tools/detect/mem/podmem/memcache/cache.h @@ -11,9 +11,9 @@ #include #include +extern unsigned long page_shift; #define MAX_ORDER 11 -#define PAGE_SHIT 12 -#define PAGE_SIZE (1UL << PAGE_SHIT) +#define PAGE_SIZE (1UL << page_shift) #define HUGE_SIZE (PAGE_SIZE * HUGE_PAGE_NR) #define BUFF_MAX 4096 #define SIZE_KB (1UL << 10) @@ -51,10 +51,10 @@ extern unsigned long memstart_addr; #define _PAGE_OFFSET(va) (-((unsigned long )(1) << (va))) #define PAGE_OFFSET (_PAGE_OFFSET(VA_BITS)) #define VMEMMAP_SIZE ((_PAGE_END(VA_BITS_MIN) - PAGE_OFFSET) \ - >> (PAGE_SHIT - STRUCT_PAGE_MAX_SHIFT)) + >> (page_shift - STRUCT_PAGE_MAX_SHIFT)) #define PHYS_OFFSET (memstart_addr) #define VMEMMAP_START (-VMEMMAP_SIZE - SZ_2M) -#define vmemmap (VMEMMAP_START - (memstart_addr >> PAGE_SHIT)*PAGE_STRUCT_SIZE) +#define vmemmap (VMEMMAP_START - (memstart_addr >> page_shift)*PAGE_STRUCT_SIZE) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 9)/*kernel 419*/ #define VA_BITS (48) @@ -63,9 +63,9 @@ extern unsigned long memstart_addr; #define PAGE_OFFSET ((unsigned long )(0xffffffffffffffff) - \ ((unsigned long )(1) << (VA_BITS - 1)) + 1) #define STRUCT_PAGE_MAX_SHIFT (6) -#define VMEMMAP_SIZE ((unsigned long )(1) << (VA_BITS - PAGE_SHIT - 1 + STRUCT_PAGE_MAX_SHIFT)) +#define VMEMMAP_SIZE ((unsigned long )(1) << (VA_BITS - page_shift - 1 + STRUCT_PAGE_MAX_SHIFT)) #define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE) -#define vmemmap (VMEMMAP_START - (memstart_addr >> PAGE_SHIT)*PAGE_STRUCT_SIZE) +#define vmemmap (VMEMMAP_START - (memstart_addr >> page_shift)*PAGE_STRUCT_SIZE) #else /*others*/ #define SZ_64K 0x00010000 @@ -74,12 +74,12 @@ extern unsigned long memstart_addr; #define vmemmap ((struct page *)(VMALLOC_END + SZ_64K)) #endif /*end to check ver, arm arch*/ -#define PFN_TO_VIRT(pfn) (((unsigned long)((pfn) - PHYS_OFFSET) | PAGE_OFFSET) + ((pfn) << PAGE_SHIT)) +#define PFN_TO_VIRT(pfn) (((unsigned long)((pfn) - PHYS_OFFSET) | PAGE_OFFSET) + ((pfn) << page_shift)) #define PFN_TO_PAGE(pfn) (vmemmap + (pfn) * PAGE_STRUCT_SIZE) #define is_kvaddr(kvaddr) (!!(kvaddr >= PAGE_OFFSET)) #else /*x86 arch*/ -#define PFN_TO_VIRT(pfn) (page_offset_base + ((pfn) << PAGE_SHIT)) +#define PFN_TO_VIRT(pfn) (page_offset_base + ((pfn) << page_shift)) #define PFN_TO_PAGE(pfn) (vmemmap_base + (pfn) * PAGE_STRUCT_SIZE) #define is_kvaddr(kvaddr) (!!(kvaddr >= page_offset_base)) #endif diff --git a/source/tools/detect/mem/podmem/memcache/memread.cpp b/source/tools/detect/mem/podmem/memcache/memread.cpp index f4489956..de2bb484 100644 --- a/source/tools/detect/mem/podmem/memcache/memread.cpp +++ b/source/tools/detect/mem/podmem/memcache/memread.cpp @@ -64,6 +64,7 @@ uint64_t g_max_phy_addr; unsigned long vmemmap_base = 0xffffea0000000000UL; unsigned long page_offset_base = 0xffff880000000000UL; unsigned long memstart_addr = 0x0; +unsigned long page_shift = 0; /* * Routines of kpageflags, i.e., /proc/kpageflags @@ -346,6 +347,21 @@ static void cleanup(void) kcore_exit(); } +static int get_pageshift() +{ + int page_size = getpagesize(); + + if(page_size <= 0 ) + { + LOG_ERROR("failed to get page size\n"); + return -1; + } + while (page_size > 1) { + page_size >>= 1; + page_shift++; + } + return 0; +} static void show_usage(void) { @@ -413,6 +429,12 @@ int main(int argc, char *argv[]) goto out; } + ret = get_pageshift(); + if (ret != 0) { + LOG_ERROR("failed to page shift\n"); + goto out; + } + ret = setup(); if (ret != 0) { LOG_ERROR("failed to setup\n"); -- Gitee From 399c484893361a22e96a17c525bb8c3f16963846 Mon Sep 17 00:00:00 2001 From: zhilan Date: Mon, 24 Apr 2023 15:21:14 +0800 Subject: [PATCH 3/3] podmem: fix bugs in download bpf --- source/tools/detect/mem/podmem/memcache/offset.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/tools/detect/mem/podmem/memcache/offset.cpp b/source/tools/detect/mem/podmem/memcache/offset.cpp index 182ead21..cc70dad0 100644 --- a/source/tools/detect/mem/podmem/memcache/offset.cpp +++ b/source/tools/detect/mem/podmem/memcache/offset.cpp @@ -128,7 +128,7 @@ static int download_btf(void) char arch[LEN] = {0}; char kernel[LEN] = {0}; char dw[LEN+LEN] = {0}; - char sysak_path[LEN+LEN] = "/boot"; + string sysak_path = "/boot" string timeout = "-internal"; string cmd = "curl -s --connect-timeout 2 http://100.100.100.200/latest/meta-data/region-id 2>&1"; @@ -147,9 +147,12 @@ static int download_btf(void) //printf("kernel:%s\n", kernel); if(getenv("SYSAK_WORK_PATH") != NULL) - strcpy(sysak_path,getenv("SYSAK_WORK_PATH")); + { + sysak_path = getenv("SYSAK_WORK_PATH") ; + sysak_path += "/tools" + } - snprintf(dw, LEN + LEN, "wget -T 5 -t 2 -q -O %s/tools/%s/vmlinux-%s https://sysom-cn-%s.oss-cn-%s%s.aliyuncs.com/home/hive/btf/%s/vmlinux-%s",sysak_path, kernel, kernel, ®ion[3],®ion[3],timeout.c_str(),arch, kernel); + snprintf(dw, LEN + LEN + LEN, "wget -T 5 -t 2 -q -O %s/%s/vmlinux-%s https://sysom-cn-%s.oss-cn-%s%s.aliyuncs.com/home/hive/btf/%s/vmlinux-%s",sysak_path.c_str(), kernel, kernel, ®ion[3],®ion[3],timeout.c_str(),arch, kernel); do_cmd(dw, kernel, LEN); return 0; -- Gitee