1/*
2 * Copyright (c) 2022 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29/* Common LC_NOTE defintions for core files. */
30#ifndef _CORE_NOTES_H_
31#define _CORE_NOTES_H_
32
33/*
34 * Format of the "main bin spec" LC_NOTE payload as expected by LLDB
35 */
36#define MAIN_BIN_SPEC_DATA_OWNER "main bin spec"
37
38typedef struct main_bin_spec_note {
39 uint32_t version; // currently 1
40 uint32_t type; // 0 == unspecified, 1 == kernel, 2 == user process, 3 == standalone (ie FW)
41 uint64_t address; // UINT64_MAX if address not specified
42 uuid_t uuid; // all zeros if uuid not specified
43 uint32_t log2_pagesize; // process page size in log base 2, e.g. 4k pages are 12. 0 for unspecified
44 uint32_t unused; // leave set to 0
45} __attribute__((packed)) main_bin_spec_note_t;
46
47#define MAIN_BIN_SPEC_VERSION 1
48#define MAIN_BIN_SPEC_TYPE_KERNEL 1
49#define MAIN_BIN_SPEC_TYPE_USER 2
50#define MAIN_BIN_SPEC_TYPE_STANDALONE 3
51
52
53/*
54 * Format of the "load binary" LC_NOTE payload as expected by LLDB
55 */
56#define LOAD_BINARY_SPEC_DATA_OWNER "load binary"
57
58#define LOAD_BINARY_NAME_BUF_SIZE 32
59typedef struct load_binary_spec_note {
60 uint32_t version; // currently 1
61 uuid_t uuid; // all zeroes if uuid not specified
62 uint64_t address; // virtual address where the macho is loaded, UINT64_MAX if unavail
63 uint64_t slide; // UINT64_MAX if slide not specified/unknown
64 // 0 if there is no slide (the binary loaded at
65 // the vmaddr in the file)
66 /*
67 * name_cstring must be a NUL terminated C string, or empty ('\0')
68 * if unavailable. NOTE: lldb's spec does not specify a length
69 * for the name, it just wants a NUL terminated string. But we
70 * specify a (maximum) length to avoid notes with dynamic length.
71 */
72 char name_cstring[LOAD_BINARY_NAME_BUF_SIZE];
73} __attribute__((packed)) load_binary_spec_note_t;
74
75#define LOAD_BINARY_SPEC_VERSION 1
76
77/*
78 * Format of the "addrable bits" LC_NOTE payload as expected by LLDB.
79 */
80#define ADDRABLE_BITS_DATA_OWNER "addrable bits"
81
82typedef struct addrable_bits_note {
83 uint32_t version; // CURRENTLY 3
84 uint32_t addressing_bits; // # of bits in use for addressing
85 uint64_t unused; // zeroed
86} __attribute__((packed)) addrable_bits_note_t;
87
88#define ADDRABLE_BITS_VER 3
89
90
91#define PANIC_CONTEXT_DATA_OWNER "panic context"
92
93typedef struct panic_context_note {
94 uuid_string_t kernel_uuid_string;
95} __attribute__((packed)) panic_context_note_t;
96
97#endif /* _CORE_NOTES_H_ */
98