diff --git a/src/binfmt_rto/binfmt_rto.c b/src/binfmt_rto/binfmt_rto.c index bd2c88631017c0782f7ef58359ae6b2ac6f70fc7..c5e986b04c759e11d329747d4e889213c53ccc26 100644 --- a/src/binfmt_rto/binfmt_rto.c +++ b/src/binfmt_rto/binfmt_rto.c @@ -55,6 +55,7 @@ #ifdef CONFIG_ELF_SYSBOOST #include +#include "../elf_ext.h" static bool use_rto = false; module_param(use_rto, bool, 0600); @@ -65,39 +66,6 @@ static int debug = 0; module_param(debug, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(debug, "debug mode"); -#ifndef EF_AARCH64_SYMBOLIC_LINK -#define EF_AARCH64_SYMBOLIC_LINK (0x00010000U) -#endif - -#ifndef EF_AARCH64_HUGEPAGE -#define EF_AARCH64_HUGEPAGE (0x00020000U) -#endif - -#ifndef EF_AARCH64_RTO -#define EF_AARCH64_RTO (0x00040000U) -#endif - -#ifndef EF_X86_64_SYMBOLIC_LINK -#define EF_X86_64_SYMBOLIC_LINK (0x00010000U) -#endif - -#ifndef EF_X86_64_HUGEPAGE -#define EF_X86_64_HUGEPAGE (0x00020000U) -#endif -#ifndef EF_X86_64_RTO -#define EF_X86_64_RTO (0x00040000U) -#endif - -#ifdef CONFIG_ARM64 -#define OS_SPECIFIC_FLAG_SYMBOLIC_LINK EF_AARCH64_SYMBOLIC_LINK -#define OS_SPECIFIC_FLAG_HUGEPAGE EF_AARCH64_HUGEPAGE -#define OS_SPECIFIC_FLAG_RTO EF_AARCH64_RTO -#else -#define OS_SPECIFIC_FLAG_SYMBOLIC_LINK EF_X86_64_SYMBOLIC_LINK -#define OS_SPECIFIC_FLAG_HUGEPAGE EF_X86_64_HUGEPAGE -#define OS_SPECIFIC_FLAG_RTO EF_X86_64_RTO -#endif - /* compat 22.03 LTS, 22.03 LTS SP2 */ #ifndef MM_SAVED_AUXV #define MM_SAVED_AUXV(mm) mm->saved_auxv @@ -267,9 +235,9 @@ do { \ NEW_AUX_ENT(AT_IGNORE, 0); \ } while (0) +// TODO: vdso layout for ARM64 #define __arch_setup_additional_pages(bprm, uses_interp, load_bias, is_rto_format) (g_sym.arch_setup_additional_pages(bprm, uses_interp)) - #ifdef arch_elf_adjust_prot #undef arch_elf_adjust_prot #endif @@ -297,13 +265,11 @@ int __arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp, un // layout for vdso and app and ld.so // ld.so | vvar | vdso | app - // xxK | 8K | 4K | 2M+ // without ld.so // vvar | vdso | app - // 8K | 4K | 2M+ if (debug) - printk("binfmt_rto: base 0x%lx vdso 0x%lx\n", load_bias, load_bias - (PAGE_SIZE * 3)); - return g_sym.map_vdso(g_sym.vdso_image_64, load_bias - (PAGE_SIZE * 3)); + printk("binfmt_rto: base 0x%lx vvar 0x%lx\n", load_bias, load_bias - ELF_VVAR_AND_VDSO_LEN); + return g_sym.map_vdso(g_sym.vdso_image_64, load_bias - ELF_VVAR_AND_VDSO_LEN); } #ifdef SET_PERSONALITY2 @@ -885,12 +851,10 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, #ifdef CONFIG_ELF_SYSBOOST // layout for vdso and app and ld.so // ld.so | vvar | vdso | app - // xxK | 8K | 4K | 2M+ // without ld.so // vvar | vdso | app - // 8K | 4K | 2M+ if (is_rto_format) { - load_addr = no_base - (PAGE_SIZE * 3) - ELF_PAGEALIGN(total_size); + load_addr = no_base - ELF_VVAR_AND_VDSO_LEN - ELF_PAGEALIGN(total_size); load_addr_set = 1; if (debug) printk("binfmt_rto: base 0x%lx ld_so_addr 0x%lx total_size 0x%lx", no_base, load_addr, total_size); @@ -2705,6 +2669,7 @@ static int init_rto_binfmt(void) return ret; } #endif + insert_binfmt(&elf_format); return 0; } diff --git a/src/elf_ext.h b/src/elf_ext.h new file mode 100644 index 0000000000000000000000000000000000000000..2616e875abedb2fdf07a74bb21d57760b95e1aa4 --- /dev/null +++ b/src/elf_ext.h @@ -0,0 +1,76 @@ +// Copyright (c) 2023 Huawei Technologies Co.,Ltd. All rights reserved. +// +// sysboost is licensed under Mulan PSL v2. +// You can use this software according to the terms and conditions of the Mulan +// PSL v2. +// You may obtain a copy of Mulan PSL v2 at: +// http://license.coscl.org.cn/MulanPSL2 +// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +// See the Mulan PSL v2 for more details. + +#ifndef _ELF_EXT_H +#define _ELF_EXT_H + +#ifndef PAGE_SHIFT +#define PAGE_SHIFT 12 +#endif + +#ifndef PAGE_SIZE +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#endif + +#ifndef PF_HUGEPAGE +#define PF_HUGEPAGE (0x01000000) +#endif + +#ifndef EF_AARCH64_SYMBOLIC_LINK +#define EF_AARCH64_SYMBOLIC_LINK (0x00010000U) +#endif + +#ifndef EF_AARCH64_HUGEPAGE +#define EF_AARCH64_HUGEPAGE (0x00020000U) +#endif + +#ifndef EF_AARCH64_RTO +#define EF_AARCH64_RTO (0x00040000U) +#endif + +#ifndef EF_X86_64_SYMBOLIC_LINK +#define EF_X86_64_SYMBOLIC_LINK (0x00010000U) +#endif + +#ifndef EF_X86_64_HUGEPAGE +#define EF_X86_64_HUGEPAGE (0x00020000U) +#endif + +#ifndef EF_X86_64_RTO +#define EF_X86_64_RTO (0x00040000U) +#endif + +#ifdef __aarch64__ +#define OS_SPECIFIC_FLAG_SYMBOLIC_LINK EF_AARCH64_SYMBOLIC_LINK +#define OS_SPECIFIC_FLAG_HUGEPAGE EF_AARCH64_HUGEPAGE +#define OS_SPECIFIC_FLAG_RTO EF_AARCH64_RTO + +#define ELF_VDSO_LEN (1 * PAGE_SIZE) +// VVAR_NR_PAGES * PAGE_SIZE +#define ELF_VVAR_LEN (2 * PAGE_SIZE) + +#else +#define OS_SPECIFIC_FLAG_SYMBOLIC_LINK EF_X86_64_SYMBOLIC_LINK +#define OS_SPECIFIC_FLAG_HUGEPAGE EF_X86_64_HUGEPAGE +#define OS_SPECIFIC_FLAG_RTO EF_X86_64_RTO + +#define ELF_VDSO_LEN (2 * PAGE_SIZE) +// -vvar_start +#define ELF_VVAR_LEN (4 * PAGE_SIZE) + +#endif + +#define OS_SPECIFIC_MASK (0xffffffffU ^ OS_SPECIFIC_FLAG_SYMBOLIC_LINK ^ OS_SPECIFIC_FLAG_HUGEPAGE ^ OS_SPECIFIC_FLAG_RTO) + +#define ELF_VVAR_AND_VDSO_LEN (ELF_VVAR_LEN + ELF_VDSO_LEN) + +#endif /* _ELF_EXT_H */ diff --git a/src/elf_hugepage.c b/src/elf_hugepage.c index 43d5705fc98b5d95c1381d4a263682b93c95f0b0..feb3d70ee5c86d38b986303a9421a90769d4b2a0 100644 --- a/src/elf_hugepage.c +++ b/src/elf_hugepage.c @@ -21,48 +21,11 @@ #include #include -#include "elf_link_common.h" #include #include -#ifndef PF_HUGEPAGE -#define PF_HUGEPAGE (0x01000000) -#endif - -#ifndef EF_AARCH64_SYMBOLIC_LINK -#define EF_AARCH64_SYMBOLIC_LINK (0x00010000U) -#endif - -#ifndef EF_AARCH64_HUGEPAGE -#define EF_AARCH64_HUGEPAGE (0x00020000U) -#endif - -#ifndef EF_AARCH64_RTO -#define EF_AARCH64_RTO (0x00040000U) -#endif - -#ifndef EF_X86_64_SYMBOLIC_LINK -#define EF_X86_64_SYMBOLIC_LINK (0x00010000U) -#endif - -#ifndef EF_X86_64_HUGEPAGE -#define EF_X86_64_HUGEPAGE (0x00020000U) -#endif - -#ifndef EF_X86_64_RTO -#define EF_X86_64_RTO (0x00040000U) -#endif - -#ifdef __aarch64__ -#define OS_SPECIFIC_FLAG_SYMBOLIC_LINK EF_AARCH64_SYMBOLIC_LINK -#define OS_SPECIFIC_FLAG_HUGEPAGE EF_AARCH64_HUGEPAGE -#define OS_SPECIFIC_FLAG_RTO EF_AARCH64_RTO -#else -#define OS_SPECIFIC_FLAG_SYMBOLIC_LINK EF_X86_64_SYMBOLIC_LINK -#define OS_SPECIFIC_FLAG_HUGEPAGE EF_X86_64_HUGEPAGE -#define OS_SPECIFIC_FLAG_RTO EF_X86_64_RTO -#endif -#define OS_SPECIFIC_MASK (0xffffffffU ^ OS_SPECIFIC_FLAG_SYMBOLIC_LINK ^ OS_SPECIFIC_FLAG_HUGEPAGE ^ OS_SPECIFIC_FLAG_RTO) +#include "elf_link_common.h" +#include "elf_ext.h" static int _elf_set_flags(char *path, unsigned int flags) { diff --git a/src/elf_link_common.c b/src/elf_link_common.c index 0632b54f019542e97a3c4f73d57cbda87d4004f2..8c3d6ed6fedf52d052275390b098a9ab1b3ab266 100644 --- a/src/elf_link_common.c +++ b/src/elf_link_common.c @@ -29,6 +29,9 @@ #include #include +#include "elf_link_common.h" +#include "elf_ext.h" + #define INDEX_ZERO 0 #define INDEX_ONE 1 #define INDEX_TWO 2 @@ -158,10 +161,8 @@ static void init_static_mode_symbol_change(elf_link_t *elf_link) // layout for vdso and app and ld.so // ld.so | vvar | vdso | app -// xxK | 8K | 4K | 2M+ // without ld.so // vvar | vdso | app -// 8K | 4K | 2M+ static unsigned long ld_hdr_addr_to_main_elf(elf_file_t *ef) { Elf64_Phdr *p = ef->data_Phdr; @@ -173,7 +174,7 @@ static unsigned long ld_hdr_addr_to_main_elf(elf_file_t *ef) } unsigned long load_len = p->p_vaddr + p->p_memsz; load_len = ALIGN(load_len, PAGE_SIZE); - return 0UL - (PAGE_SIZE * 3) - load_len; + return 0UL - ELF_VVAR_AND_VDSO_LEN - load_len; } static unsigned long ld_get_new_addr(unsigned long hdr_addr, Elf64_Sym *sym) @@ -184,7 +185,7 @@ static unsigned long ld_get_new_addr(unsigned long hdr_addr, Elf64_Sym *sym) static unsigned long vdso_get_new_addr(Elf64_Sym *sym) { // user space PAGE_SIZE is 4K - return 0UL - PAGE_SIZE + (unsigned long)sym->st_value; + return 0UL - ELF_VDSO_LEN + (unsigned long)sym->st_value; } #ifdef __aarch64__