Skip to content

Commit 6503117

Browse files
committed
[llvm-readobj] Add support for reading OpenBSD ELF core notes.
Notes generated in OpenBSD core files provide additional information about the kernel state and CPU registers. These notes are described in core.5, which can be viewed here: https://man.openbsd.org/core.5 Differential Revision: https://reviews.llvm.org/D111966
1 parent fd41738 commit 6503117

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,6 +1602,16 @@ enum {
16021602
NT_FREEBSD_PROCSTAT_AUXV = 16,
16031603
};
16041604

1605+
// OpenBSD core note types.
1606+
enum {
1607+
NT_OPENBSD_PROCINFO = 10,
1608+
NT_OPENBSD_AUXV = 11,
1609+
NT_OPENBSD_REGS = 20,
1610+
NT_OPENBSD_FPREGS = 21,
1611+
NT_OPENBSD_XFPREGS = 22,
1612+
NT_OPENBSD_WCOOKIE = 23,
1613+
};
1614+
16051615
// AMDGPU-specific section indices.
16061616
enum {
16071617
SHN_AMDGPU_LDS = 0xff00, // Variable in LDS; symbol encoded like SHN_COMMON

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@ void ScalarEnumerationTraits<ELFYAML::ELF_NT>::enumeration(
155155
ECase(NT_FREEBSD_PROCSTAT_OSREL);
156156
ECase(NT_FREEBSD_PROCSTAT_PSSTRINGS);
157157
ECase(NT_FREEBSD_PROCSTAT_AUXV);
158+
// OpenBSD core note types.
159+
ECase(NT_OPENBSD_PROCINFO);
160+
ECase(NT_OPENBSD_AUXV);
161+
ECase(NT_OPENBSD_REGS);
162+
ECase(NT_OPENBSD_FPREGS);
163+
ECase(NT_OPENBSD_XFPREGS);
164+
ECase(NT_OPENBSD_WCOOKIE);
158165
// AMD specific notes. (Code Object V2)
159166
ECase(NT_AMD_HSA_CODE_OBJECT_VERSION);
160167
ECase(NT_AMD_HSA_HSAIL);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
## Test that note values are interpreted correctly for OpenBSD core files.
2+
# RUN: yaml2obj %s -o %t.o
3+
# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU --strict-whitespace
4+
# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM --strict-whitespace
5+
6+
--- !ELF
7+
FileHeader:
8+
Class: ELFCLASS64
9+
Data: ELFDATA2LSB
10+
Type: ET_CORE
11+
Sections:
12+
- Name: .note.foo
13+
Type: SHT_NOTE
14+
Notes:
15+
- Name: OpenBSD
16+
Type: NT_OPENBSD_PROCINFO
17+
- Name: OpenBSD
18+
Type: NT_OPENBSD_AUXV
19+
- Name: OpenBSD
20+
Type: NT_OPENBSD_WCOOKIE
21+
- Name: OpenBSD@31337
22+
Type: NT_OPENBSD_REGS
23+
- Name: OpenBSD@31337
24+
Type: NT_OPENBSD_FPREGS
25+
ProgramHeaders:
26+
- Type: PT_NOTE
27+
FirstSec: .note.foo
28+
LastSec: .note.foo
29+
30+
# GNU: Displaying notes found at file offset 0x00000078 with length 0x00000074:
31+
# GNU-NEXT: Owner Data size Description
32+
# GNU-NEXT: OpenBSD 0x00000000 NT_OPENBSD_PROCINFO (procinfo structure)
33+
# GNU-NEXT: OpenBSD 0x00000000 NT_OPENBSD_AUXV (ELF auxiliary vector data)
34+
# GNU-NEXT: OpenBSD 0x00000000 NT_OPENBSD_WCOOKIE (window cookie)
35+
# GNU-NEXT: OpenBSD@31337 0x00000000 NT_OPENBSD_REGS (regular registers)
36+
# GNU-NEXT: OpenBSD@31337 0x00000000 NT_OPENBSD_FPREGS (floating point registers)
37+
38+
# LLVM: Notes [
39+
# LLVM-NEXT: NoteSection {
40+
# LLVM-NEXT: Name: <?>
41+
# LLVM-NEXT: Offset: 0x78
42+
# LLVM-NEXT: Size: 0x74
43+
# LLVM-NEXT: Note {
44+
# LLVM-NEXT: Owner: OpenBSD
45+
# LLVM-NEXT: Data size: 0x0
46+
# LLVM-NEXT: Type: NT_OPENBSD_PROCINFO (procinfo structure)
47+
# LLVM-NEXT: }
48+
# LLVM-NEXT: Note {
49+
# LLVM-NEXT: Owner: OpenBSD
50+
# LLVM-NEXT: Data size: 0x0
51+
# LLVM-NEXT: Type: NT_OPENBSD_AUXV (ELF auxiliary vector data)
52+
# LLVM-NEXT: }
53+
# LLVM-NEXT: Note {
54+
# LLVM-NEXT: Owner: OpenBSD
55+
# LLVM-NEXT: Data size: 0x0
56+
# LLVM-NEXT: Type: NT_OPENBSD_WCOOKIE (window cookie)
57+
# LLVM-NEXT: }
58+
# LLVM-NEXT: Note {
59+
# LLVM-NEXT: Owner: OpenBSD@31337
60+
# LLVM-NEXT: Data size: 0x0
61+
# LLVM-NEXT: Type: NT_OPENBSD_REGS (regular registers)
62+
# LLVM-NEXT: }
63+
# LLVM-NEXT: Note {
64+
# LLVM-NEXT: Owner: OpenBSD@31337
65+
# LLVM-NEXT: Data size: 0x0
66+
# LLVM-NEXT: Type: NT_OPENBSD_FPREGS (floating point registers)
67+
# LLVM-NEXT: }
68+
# LLVM-NEXT: }
69+
# LLVM-NEXT: ]

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5331,6 +5331,14 @@ const NoteType FreeBSDNoteTypes[] = {
53315331
"NT_FREEBSD_FEATURE_CTL (FreeBSD feature control)"},
53325332
};
53335333

5334+
const NoteType OpenBSDCoreNoteTypes[] = {
5335+
{ELF::NT_OPENBSD_PROCINFO, "NT_OPENBSD_PROCINFO (procinfo structure)"},
5336+
{ELF::NT_OPENBSD_AUXV, "NT_OPENBSD_AUXV (ELF auxiliary vector data)"},
5337+
{ELF::NT_OPENBSD_REGS, "NT_OPENBSD_REGS (regular registers)"},
5338+
{ELF::NT_OPENBSD_FPREGS, "NT_OPENBSD_FPREGS (floating point registers)"},
5339+
{ELF::NT_OPENBSD_WCOOKIE, "NT_OPENBSD_WCOOKIE (window cookie)"},
5340+
};
5341+
53345342
const NoteType AMDNoteTypes[] = {
53355343
{ELF::NT_AMD_HSA_CODE_OBJECT_VERSION,
53365344
"NT_AMD_HSA_CODE_OBJECT_VERSION (AMD HSA Code Object Version)"},
@@ -5443,6 +5451,13 @@ StringRef getNoteTypeName(const typename ELFT::Note &Note, unsigned ELFType) {
54435451
return FindNote(FreeBSDNoteTypes);
54445452
}
54455453
}
5454+
if (Name.startswith("OpenBSD") && ELFType == ELF::ET_CORE) {
5455+
// OpenBSD also places the generic core notes in the OpenBSD namespace.
5456+
StringRef Result = FindNote(OpenBSDCoreNoteTypes);
5457+
if (!Result.empty())
5458+
return Result;
5459+
return FindNote(CoreNoteTypes);
5460+
}
54465461
if (Name == "AMD")
54475462
return FindNote(AMDNoteTypes);
54485463
if (Name == "AMDGPU")

0 commit comments

Comments
 (0)