From 5e9031eca8e66577e7460657d367a589063da331 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sat, 29 Aug 2020 09:17:18 +0000 Subject: Mark certain sections with debug information as "allocated" such that they get picked up by ddb. This makes the "pp" and "show struct" commands that depends on CTF work. ok gkoehler@ --- sys/arch/powerpc64/dev/kexec.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'sys/arch') diff --git a/sys/arch/powerpc64/dev/kexec.c b/sys/arch/powerpc64/dev/kexec.c index a9a568aa201..00b0cd38317 100644 --- a/sys/arch/powerpc64/dev/kexec.c +++ b/sys/arch/powerpc64/dev/kexec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kexec.c,v 1.3 2020/07/18 20:02:34 kettenis Exp $ */ +/* $OpenBSD: kexec.c,v 1.4 2020/08/29 09:17:17 kettenis Exp $ */ /* * Copyright (c) 2019-2020 Visa Hankala @@ -89,7 +89,7 @@ kexec_kexec(struct kexec_args *kargs, struct proc *p) }; Elf_Ehdr eh; Elf_Phdr *ph = NULL; - Elf_Shdr *sh = NULL; + Elf_Shdr *sh = NULL, *shp; vaddr_t start = VM_MAX_ADDRESS; vaddr_t end = 0; paddr_t start_pa, initrd_pa; @@ -97,6 +97,7 @@ kexec_kexec(struct kexec_args *kargs, struct proc *p) caddr_t addr = NULL; caddr_t symaddr = NULL; size_t phsize, shsize, size, symsize; + char *shstr; void *node; int error, random, i; @@ -189,6 +190,17 @@ kexec_kexec(struct kexec_args *kargs, struct proc *p) if (error != 0) goto fail; + shp = (Elf64_Shdr *)(symaddr + eh.e_shoff); + shstr = symaddr + shp[eh.e_shstrndx].sh_offset; + for (i = 0; i < eh.e_shnum; i++) { + if (shp[i].sh_type == SHT_SYMTAB || + shp[i].sh_type == SHT_STRTAB || + strcmp(shstr + shp[i].sh_name, ".debug_line") == 0 || + strcmp(shstr + shp[i].sh_name, ELF_CTF) == 0) + if (shp[i].sh_offset + shp[i].sh_size <= symsize) + shp[i].sh_flags |= SHF_ALLOC; + } + pmap_extract(pmap_kernel(), (vaddr_t)symaddr, &initrd_pa); node = fdt_find_node("/chosen"); -- cgit v1.2.3