diff --git a/source/tools/detect/mem/podmem/entry/Makefile b/source/tools/detect/mem/podmem/entry/Makefile index a52b0bd3e1f301b5eda0bec621500199c8b5b3e7..da8727a757ebdcad79addffa42d06f37eef8ea51 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 b48008ba030b7eb6a815eb20fc4eb66c3cb1e00e..47eb37aa0f6b3f5b2f027d050b69cbc3fbe998a4 100644 --- a/source/tools/detect/mem/podmem/memcache/cache.h +++ b/source/tools/detect/mem/podmem/memcache/cache.h @@ -9,10 +9,11 @@ #include #include #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) @@ -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 -#define PFN_TO_VIRT(pfn) (page_offset_base + ((pfn) << PAGE_SHIT)) +#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_shift - STRUCT_PAGE_MAX_SHIFT)) +#define PHYS_OFFSET (memstart_addr) +#define VMEMMAP_START (-VMEMMAP_SIZE - SZ_2M) +#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) +#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_shift - 1 + STRUCT_PAGE_MAX_SHIFT)) +#define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE) +#define vmemmap (VMEMMAP_START - (memstart_addr >> page_shift)*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_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_shift)) #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 3c7ebb4dbdbe011baab560374e72d1f31e7ede6b..de2bb4842559eb2e7647d8244ef65990b7044387 100644 --- a/source/tools/detect/mem/podmem/memcache/memread.cpp +++ b/source/tools/detect/mem/podmem/memcache/memread.cpp @@ -63,6 +63,8 @@ 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 @@ -168,8 +170,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 +203,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: @@ -335,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) { @@ -402,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"); diff --git a/source/tools/detect/mem/podmem/memcache/offset.cpp b/source/tools/detect/mem/podmem/memcache/offset.cpp index 182ead21b881b74c7fc8b514b4f918f12f72bd6a..cc70dad02725e4e9113e75ac932290af02ef9835 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;