[PATCH] KVM: arm64: nVHE: gen-hyprel: Silent build warnings
kernel test robot
lkp at intel.com
Tue Oct 15 23:19:06 PDT 2024
Hi Tianjia,
kernel test robot noticed the following build warnings:
[auto build test WARNING on kvmarm/next]
[also build test WARNING on linus/master v6.12-rc3 next-20241015]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Tianjia-Zhang/KVM-arm64-nVHE-gen-hyprel-Silent-build-warnings/20241009-170027
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git next
patch link: https://lore.kernel.org/r/20241009085751.35976-1-tianjia.zhang%40linux.alibaba.com
patch subject: [PATCH] KVM: arm64: nVHE: gen-hyprel: Silent build warnings
config: arm64-defconfig (https://download.01.org/0day-ci/archive/20241016/202410161313.tSgr3bAj-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241016/202410161313.tSgr3bAj-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410161313.tSgr3bAj-lkp@intel.com/
All warnings (new ones prefixed by >>):
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c: In function 'section_by_off':
>> arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:166:33: warning: format '%llu' expects argument of type 'long long unsigned int', but argument 4 has type 'Elf64_Off' {aka 'long unsigned int'} [-Wformat=]
166 | fprintf(stderr, "error: %s: " fmt "\n", \
| ^~~~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:186:25: note: in expansion of macro 'fatal_error'
186 | fatal_error("assertion " #lhs " " #op " " #rhs \
| ^~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:193:41: note: in expansion of macro 'assert_op'
193 | #define assert_ne(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, !=)
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:233:9: note: in expansion of macro 'assert_ne'
233 | assert_ne(off, 0ULL, "%llu");
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c: In function 'init_elf':
>> arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:166:33: warning: format '%llu' expects argument of type 'long long unsigned int', but argument 4 has type '__off_t' {aka 'long int'} [-Wformat=]
166 | fprintf(stderr, "error: %s: " fmt "\n", \
| ^~~~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:186:25: note: in expansion of macro 'fatal_error'
186 | fatal_error("assertion " #lhs " " #op " " #rhs \
| ^~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:195:41: note: in expansion of macro 'assert_op'
195 | #define assert_ge(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, >=)
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:279:9: note: in expansion of macro 'assert_ge'
279 | assert_ge(stat.st_size, (off_t)sizeof(*elf.ehdr), "%llu");
| ^~~~~~~~~
>> arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:166:33: warning: format '%llu' expects argument of type 'long long unsigned int', but argument 5 has type 'long int' [-Wformat=]
166 | fprintf(stderr, "error: %s: " fmt "\n", \
| ^~~~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:186:25: note: in expansion of macro 'fatal_error'
186 | fatal_error("assertion " #lhs " " #op " " #rhs \
| ^~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:195:41: note: in expansion of macro 'assert_op'
195 | #define assert_ge(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, >=)
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:279:9: note: in expansion of macro 'assert_ge'
279 | assert_ge(stat.st_size, (off_t)sizeof(*elf.ehdr), "%llu");
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c: In function 'emit_rela_abs64':
>> arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:343:59: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 5 has type '__uint64_t' {aka 'long unsigned int'} [-Wformat=]
343 | printf(".reloc %lu, R_AARCH64_PREL32, %s%s + 0x%llx\n",
| ~~~^
| |
| long long unsigned int
| %lx
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c: In function 'emit_rela_section':
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:166:33: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 4 has type '__uint64_t' {aka 'long unsigned int'} [-Wformat=]
166 | fprintf(stderr, "error: %s: " fmt "\n", \
| ^~~~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:186:25: note: in expansion of macro 'fatal_error'
186 | fatal_error("assertion " #lhs " " #op " " #rhs \
| ^~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:194:41: note: in expansion of macro 'assert_op'
194 | #define assert_lt(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, <)
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:379:17: note: in expansion of macro 'assert_lt'
379 | assert_lt(elf64toh(rela->r_offset), elf64toh(sh_orig->sh_size), "0x%llx");
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:166:33: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 5 has type '__uint64_t' {aka 'long unsigned int'} [-Wformat=]
166 | fprintf(stderr, "error: %s: " fmt "\n", \
| ^~~~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:186:25: note: in expansion of macro 'fatal_error'
186 | fatal_error("assertion " #lhs " " #op " " #rhs \
| ^~~~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:194:41: note: in expansion of macro 'assert_op'
194 | #define assert_lt(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, <)
| ^~~~~~~~~
arch/arm64/kvm/hyp/nvhe/gen-hyprel.c:379:17: note: in expansion of macro 'assert_lt'
379 | assert_lt(elf64toh(rela->r_offset), elf64toh(sh_orig->sh_size), "0x%llx");
| ^~~~~~~~~
vim +166 arch/arm64/kvm/hyp/nvhe/gen-hyprel.c
bc93763f178fd0 Marc Zyngier 2021-01-30 163
8c49b5d43d4c45 David Brazdil 2021-01-05 164 #define fatal_error(fmt, ...) \
8c49b5d43d4c45 David Brazdil 2021-01-05 165 ({ \
8c49b5d43d4c45 David Brazdil 2021-01-05 @166 fprintf(stderr, "error: %s: " fmt "\n", \
8c49b5d43d4c45 David Brazdil 2021-01-05 167 elf.path, ## __VA_ARGS__); \
8c49b5d43d4c45 David Brazdil 2021-01-05 168 exit(EXIT_FAILURE); \
8c49b5d43d4c45 David Brazdil 2021-01-05 169 __builtin_unreachable(); \
8c49b5d43d4c45 David Brazdil 2021-01-05 170 })
8c49b5d43d4c45 David Brazdil 2021-01-05 171
8c49b5d43d4c45 David Brazdil 2021-01-05 172 #define fatal_perror(msg) \
8c49b5d43d4c45 David Brazdil 2021-01-05 173 ({ \
8c49b5d43d4c45 David Brazdil 2021-01-05 174 fprintf(stderr, "error: %s: " msg ": %s\n", \
8c49b5d43d4c45 David Brazdil 2021-01-05 175 elf.path, strerror(errno)); \
8c49b5d43d4c45 David Brazdil 2021-01-05 176 exit(EXIT_FAILURE); \
8c49b5d43d4c45 David Brazdil 2021-01-05 177 __builtin_unreachable(); \
8c49b5d43d4c45 David Brazdil 2021-01-05 178 })
8c49b5d43d4c45 David Brazdil 2021-01-05 179
8c49b5d43d4c45 David Brazdil 2021-01-05 180 #define assert_op(lhs, rhs, fmt, op) \
8c49b5d43d4c45 David Brazdil 2021-01-05 181 ({ \
8c49b5d43d4c45 David Brazdil 2021-01-05 182 typeof(lhs) _lhs = (lhs); \
8c49b5d43d4c45 David Brazdil 2021-01-05 183 typeof(rhs) _rhs = (rhs); \
8c49b5d43d4c45 David Brazdil 2021-01-05 184 \
8c49b5d43d4c45 David Brazdil 2021-01-05 185 if (!(_lhs op _rhs)) { \
8c49b5d43d4c45 David Brazdil 2021-01-05 @186 fatal_error("assertion " #lhs " " #op " " #rhs \
8c49b5d43d4c45 David Brazdil 2021-01-05 187 " failed (lhs=" fmt ", rhs=" fmt \
8c49b5d43d4c45 David Brazdil 2021-01-05 188 ", line=%d)", _lhs, _rhs, __LINE__); \
8c49b5d43d4c45 David Brazdil 2021-01-05 189 } \
8c49b5d43d4c45 David Brazdil 2021-01-05 190 })
8c49b5d43d4c45 David Brazdil 2021-01-05 191
8c49b5d43d4c45 David Brazdil 2021-01-05 192 #define assert_eq(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, ==)
8c49b5d43d4c45 David Brazdil 2021-01-05 @193 #define assert_ne(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, !=)
8c49b5d43d4c45 David Brazdil 2021-01-05 194 #define assert_lt(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, <)
8c49b5d43d4c45 David Brazdil 2021-01-05 @195 #define assert_ge(lhs, rhs, fmt) assert_op(lhs, rhs, fmt, >=)
8c49b5d43d4c45 David Brazdil 2021-01-05 196
8c49b5d43d4c45 David Brazdil 2021-01-05 197 /*
8c49b5d43d4c45 David Brazdil 2021-01-05 198 * Return a pointer of a given type at a given offset from
8c49b5d43d4c45 David Brazdil 2021-01-05 199 * the beginning of the ELF file.
8c49b5d43d4c45 David Brazdil 2021-01-05 200 */
8c49b5d43d4c45 David Brazdil 2021-01-05 201 #define elf_ptr(type, off) ((type *)(elf.begin + (off)))
8c49b5d43d4c45 David Brazdil 2021-01-05 202
8c49b5d43d4c45 David Brazdil 2021-01-05 203 /* Iterate over all sections in the ELF. */
8c49b5d43d4c45 David Brazdil 2021-01-05 204 #define for_each_section(var) \
bc93763f178fd0 Marc Zyngier 2021-01-30 205 for (var = elf.sh_table; var < elf.sh_table + elf16toh(elf.ehdr->e_shnum); ++var)
8c49b5d43d4c45 David Brazdil 2021-01-05 206
8c49b5d43d4c45 David Brazdil 2021-01-05 207 /* Iterate over all Elf64_Rela relocations in a given section. */
8c49b5d43d4c45 David Brazdil 2021-01-05 208 #define for_each_rela(shdr, var) \
bc93763f178fd0 Marc Zyngier 2021-01-30 209 for (var = elf_ptr(Elf64_Rela, elf64toh(shdr->sh_offset)); \
bc93763f178fd0 Marc Zyngier 2021-01-30 210 var < elf_ptr(Elf64_Rela, elf64toh(shdr->sh_offset) + elf64toh(shdr->sh_size)); var++)
8c49b5d43d4c45 David Brazdil 2021-01-05 211
8c49b5d43d4c45 David Brazdil 2021-01-05 212 /* True if a string starts with a given prefix. */
8c49b5d43d4c45 David Brazdil 2021-01-05 213 static inline bool starts_with(const char *str, const char *prefix)
8c49b5d43d4c45 David Brazdil 2021-01-05 214 {
8c49b5d43d4c45 David Brazdil 2021-01-05 215 return memcmp(str, prefix, strlen(prefix)) == 0;
8c49b5d43d4c45 David Brazdil 2021-01-05 216 }
8c49b5d43d4c45 David Brazdil 2021-01-05 217
8c49b5d43d4c45 David Brazdil 2021-01-05 218 /* Returns a string containing the name of a given section. */
8c49b5d43d4c45 David Brazdil 2021-01-05 219 static inline const char *section_name(Elf64_Shdr *shdr)
8c49b5d43d4c45 David Brazdil 2021-01-05 220 {
bc93763f178fd0 Marc Zyngier 2021-01-30 221 return elf.sh_string + elf32toh(shdr->sh_name);
8c49b5d43d4c45 David Brazdil 2021-01-05 222 }
8c49b5d43d4c45 David Brazdil 2021-01-05 223
8c49b5d43d4c45 David Brazdil 2021-01-05 224 /* Returns a pointer to the first byte of section data. */
8c49b5d43d4c45 David Brazdil 2021-01-05 225 static inline const char *section_begin(Elf64_Shdr *shdr)
8c49b5d43d4c45 David Brazdil 2021-01-05 226 {
bc93763f178fd0 Marc Zyngier 2021-01-30 227 return elf_ptr(char, elf64toh(shdr->sh_offset));
8c49b5d43d4c45 David Brazdil 2021-01-05 228 }
8c49b5d43d4c45 David Brazdil 2021-01-05 229
8c49b5d43d4c45 David Brazdil 2021-01-05 230 /* Find a section by its offset from the beginning of the file. */
8c49b5d43d4c45 David Brazdil 2021-01-05 231 static inline Elf64_Shdr *section_by_off(Elf64_Off off)
8c49b5d43d4c45 David Brazdil 2021-01-05 232 {
83de54b4bb92bc Tianjia Zhang 2024-10-09 233 assert_ne(off, 0ULL, "%llu");
8c49b5d43d4c45 David Brazdil 2021-01-05 234 return elf_ptr(Elf64_Shdr, off);
8c49b5d43d4c45 David Brazdil 2021-01-05 235 }
8c49b5d43d4c45 David Brazdil 2021-01-05 236
8c49b5d43d4c45 David Brazdil 2021-01-05 237 /* Find a section by its index. */
8c49b5d43d4c45 David Brazdil 2021-01-05 238 static inline Elf64_Shdr *section_by_idx(uint16_t idx)
8c49b5d43d4c45 David Brazdil 2021-01-05 239 {
8c49b5d43d4c45 David Brazdil 2021-01-05 240 assert_ne(idx, SHN_UNDEF, "%u");
8c49b5d43d4c45 David Brazdil 2021-01-05 241 return &elf.sh_table[idx];
8c49b5d43d4c45 David Brazdil 2021-01-05 242 }
8c49b5d43d4c45 David Brazdil 2021-01-05 243
8c49b5d43d4c45 David Brazdil 2021-01-05 244 /*
8c49b5d43d4c45 David Brazdil 2021-01-05 245 * Memory-map the given ELF file, perform sanity checks, and
8c49b5d43d4c45 David Brazdil 2021-01-05 246 * populate global state.
8c49b5d43d4c45 David Brazdil 2021-01-05 247 */
8c49b5d43d4c45 David Brazdil 2021-01-05 248 static void init_elf(const char *path)
8c49b5d43d4c45 David Brazdil 2021-01-05 249 {
8c49b5d43d4c45 David Brazdil 2021-01-05 250 int fd, ret;
8c49b5d43d4c45 David Brazdil 2021-01-05 251 struct stat stat;
8c49b5d43d4c45 David Brazdil 2021-01-05 252
8c49b5d43d4c45 David Brazdil 2021-01-05 253 /* Store path in the global struct for error printing. */
8c49b5d43d4c45 David Brazdil 2021-01-05 254 elf.path = path;
8c49b5d43d4c45 David Brazdil 2021-01-05 255
8c49b5d43d4c45 David Brazdil 2021-01-05 256 /* Open the ELF file. */
8c49b5d43d4c45 David Brazdil 2021-01-05 257 fd = open(path, O_RDONLY);
8c49b5d43d4c45 David Brazdil 2021-01-05 258 if (fd < 0)
8c49b5d43d4c45 David Brazdil 2021-01-05 259 fatal_perror("Could not open ELF file");
8c49b5d43d4c45 David Brazdil 2021-01-05 260
8c49b5d43d4c45 David Brazdil 2021-01-05 261 /* Get status of ELF file to obtain its size. */
8c49b5d43d4c45 David Brazdil 2021-01-05 262 ret = fstat(fd, &stat);
8c49b5d43d4c45 David Brazdil 2021-01-05 263 if (ret < 0) {
8c49b5d43d4c45 David Brazdil 2021-01-05 264 close(fd);
8c49b5d43d4c45 David Brazdil 2021-01-05 265 fatal_perror("Could not get status of ELF file");
8c49b5d43d4c45 David Brazdil 2021-01-05 266 }
8c49b5d43d4c45 David Brazdil 2021-01-05 267
8c49b5d43d4c45 David Brazdil 2021-01-05 268 /* mmap() the entire ELF file read-only at an arbitrary address. */
8c49b5d43d4c45 David Brazdil 2021-01-05 269 elf.begin = mmap(0, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
8c49b5d43d4c45 David Brazdil 2021-01-05 270 if (elf.begin == MAP_FAILED) {
8c49b5d43d4c45 David Brazdil 2021-01-05 271 close(fd);
8c49b5d43d4c45 David Brazdil 2021-01-05 272 fatal_perror("Could not mmap ELF file");
8c49b5d43d4c45 David Brazdil 2021-01-05 273 }
8c49b5d43d4c45 David Brazdil 2021-01-05 274
8c49b5d43d4c45 David Brazdil 2021-01-05 275 /* mmap() was successful, close the FD. */
8c49b5d43d4c45 David Brazdil 2021-01-05 276 close(fd);
8c49b5d43d4c45 David Brazdil 2021-01-05 277
8c49b5d43d4c45 David Brazdil 2021-01-05 278 /* Get pointer to the ELF header. */
83de54b4bb92bc Tianjia Zhang 2024-10-09 279 assert_ge(stat.st_size, (off_t)sizeof(*elf.ehdr), "%llu");
8c49b5d43d4c45 David Brazdil 2021-01-05 280 elf.ehdr = elf_ptr(Elf64_Ehdr, 0);
8c49b5d43d4c45 David Brazdil 2021-01-05 281
8c49b5d43d4c45 David Brazdil 2021-01-05 282 /* Check the ELF magic. */
8c49b5d43d4c45 David Brazdil 2021-01-05 283 assert_eq(elf.ehdr->e_ident[EI_MAG0], ELFMAG0, "0x%x");
8c49b5d43d4c45 David Brazdil 2021-01-05 284 assert_eq(elf.ehdr->e_ident[EI_MAG1], ELFMAG1, "0x%x");
8c49b5d43d4c45 David Brazdil 2021-01-05 285 assert_eq(elf.ehdr->e_ident[EI_MAG2], ELFMAG2, "0x%x");
8c49b5d43d4c45 David Brazdil 2021-01-05 286 assert_eq(elf.ehdr->e_ident[EI_MAG3], ELFMAG3, "0x%x");
8c49b5d43d4c45 David Brazdil 2021-01-05 287
8c49b5d43d4c45 David Brazdil 2021-01-05 288 /* Sanity check that this is an ELF64 relocatable object for AArch64. */
8c49b5d43d4c45 David Brazdil 2021-01-05 289 assert_eq(elf.ehdr->e_ident[EI_CLASS], ELFCLASS64, "%u");
bc93763f178fd0 Marc Zyngier 2021-01-30 290 assert_eq(elf.ehdr->e_ident[EI_DATA], ELFENDIAN, "%u");
bc93763f178fd0 Marc Zyngier 2021-01-30 291 assert_eq(elf16toh(elf.ehdr->e_type), ET_REL, "%u");
bc93763f178fd0 Marc Zyngier 2021-01-30 292 assert_eq(elf16toh(elf.ehdr->e_machine), EM_AARCH64, "%u");
8c49b5d43d4c45 David Brazdil 2021-01-05 293
8c49b5d43d4c45 David Brazdil 2021-01-05 294 /* Populate fields of the global struct. */
bc93763f178fd0 Marc Zyngier 2021-01-30 295 elf.sh_table = section_by_off(elf64toh(elf.ehdr->e_shoff));
bc93763f178fd0 Marc Zyngier 2021-01-30 296 elf.sh_string = section_begin(section_by_idx(elf16toh(elf.ehdr->e_shstrndx)));
8c49b5d43d4c45 David Brazdil 2021-01-05 297 }
8c49b5d43d4c45 David Brazdil 2021-01-05 298
8c49b5d43d4c45 David Brazdil 2021-01-05 299 /* Print the prologue of the output ASM file. */
8c49b5d43d4c45 David Brazdil 2021-01-05 300 static void emit_prologue(void)
8c49b5d43d4c45 David Brazdil 2021-01-05 301 {
8c49b5d43d4c45 David Brazdil 2021-01-05 302 printf(".data\n"
8c49b5d43d4c45 David Brazdil 2021-01-05 303 ".pushsection " HYP_RELOC_SECTION ", \"a\"\n");
8c49b5d43d4c45 David Brazdil 2021-01-05 304 }
8c49b5d43d4c45 David Brazdil 2021-01-05 305
8c49b5d43d4c45 David Brazdil 2021-01-05 306 /* Print ASM statements needed as a prologue to a processed hyp section. */
8c49b5d43d4c45 David Brazdil 2021-01-05 307 static void emit_section_prologue(const char *sh_orig_name)
8c49b5d43d4c45 David Brazdil 2021-01-05 308 {
8c49b5d43d4c45 David Brazdil 2021-01-05 309 /* Declare the hyp section symbol. */
8c49b5d43d4c45 David Brazdil 2021-01-05 310 printf(".global %s%s\n", HYP_SECTION_SYMBOL_PREFIX, sh_orig_name);
8c49b5d43d4c45 David Brazdil 2021-01-05 311 }
8c49b5d43d4c45 David Brazdil 2021-01-05 312
8c49b5d43d4c45 David Brazdil 2021-01-05 313 /*
8c49b5d43d4c45 David Brazdil 2021-01-05 314 * Print ASM statements to create a hyp relocation entry for a given
8c49b5d43d4c45 David Brazdil 2021-01-05 315 * R_AARCH64_ABS64 relocation.
8c49b5d43d4c45 David Brazdil 2021-01-05 316 *
8c49b5d43d4c45 David Brazdil 2021-01-05 317 * The linker of vmlinux will populate the position given by `rela` with
8c49b5d43d4c45 David Brazdil 2021-01-05 318 * an absolute 64-bit kernel VA. If the kernel is relocatable, it will
8c49b5d43d4c45 David Brazdil 2021-01-05 319 * also generate a dynamic relocation entry so that the kernel can shift
8c49b5d43d4c45 David Brazdil 2021-01-05 320 * the address at runtime for KASLR.
8c49b5d43d4c45 David Brazdil 2021-01-05 321 *
8c49b5d43d4c45 David Brazdil 2021-01-05 322 * Emit a 32-bit offset from the current address to the position given
8c49b5d43d4c45 David Brazdil 2021-01-05 323 * by `rela`. This way the kernel can iterate over all kernel VAs used
8c49b5d43d4c45 David Brazdil 2021-01-05 324 * by hyp at runtime and convert them to hyp VAs. However, that offset
8c49b5d43d4c45 David Brazdil 2021-01-05 325 * will not be known until linking of `vmlinux`, so emit a PREL32
8c49b5d43d4c45 David Brazdil 2021-01-05 326 * relocation referencing a symbol that the hyp linker script put at
8c49b5d43d4c45 David Brazdil 2021-01-05 327 * the beginning of the relocated section + the offset from `rela`.
8c49b5d43d4c45 David Brazdil 2021-01-05 328 */
8c49b5d43d4c45 David Brazdil 2021-01-05 329 static void emit_rela_abs64(Elf64_Rela *rela, const char *sh_orig_name)
8c49b5d43d4c45 David Brazdil 2021-01-05 330 {
8c49b5d43d4c45 David Brazdil 2021-01-05 331 /* Offset of this reloc from the beginning of HYP_RELOC_SECTION. */
8c49b5d43d4c45 David Brazdil 2021-01-05 332 static size_t reloc_offset;
8c49b5d43d4c45 David Brazdil 2021-01-05 333
8c49b5d43d4c45 David Brazdil 2021-01-05 334 /* Create storage for the 32-bit offset. */
8c49b5d43d4c45 David Brazdil 2021-01-05 335 printf(".word 0\n");
8c49b5d43d4c45 David Brazdil 2021-01-05 336
8c49b5d43d4c45 David Brazdil 2021-01-05 337 /*
8c49b5d43d4c45 David Brazdil 2021-01-05 338 * Create a PREL32 relocation which instructs the linker of `vmlinux`
8c49b5d43d4c45 David Brazdil 2021-01-05 339 * to insert offset to position <base> + <offset>, where <base> is
8c49b5d43d4c45 David Brazdil 2021-01-05 340 * a symbol at the beginning of the relocated section, and <offset>
8c49b5d43d4c45 David Brazdil 2021-01-05 341 * is `rela->r_offset`.
8c49b5d43d4c45 David Brazdil 2021-01-05 342 */
83de54b4bb92bc Tianjia Zhang 2024-10-09 @343 printf(".reloc %lu, R_AARCH64_PREL32, %s%s + 0x%llx\n",
8c49b5d43d4c45 David Brazdil 2021-01-05 344 reloc_offset, HYP_SECTION_SYMBOL_PREFIX, sh_orig_name,
bc93763f178fd0 Marc Zyngier 2021-01-30 345 elf64toh(rela->r_offset));
8c49b5d43d4c45 David Brazdil 2021-01-05 346
8c49b5d43d4c45 David Brazdil 2021-01-05 347 reloc_offset += 4;
8c49b5d43d4c45 David Brazdil 2021-01-05 348 }
8c49b5d43d4c45 David Brazdil 2021-01-05 349
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
More information about the linux-arm-kernel
mailing list