File: addrxlat.h

package info (click to toggle)
pykdumpfile 0.5.5.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 296 kB
  • sloc: python: 2,607; ansic: 447; makefile: 17
file content (381 lines) | stat: -rw-r--r-- 11,028 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
/* Copyright (C) 2022 Petr Tesarik <ptesarik@suse.com>

   This file is free software; you can redistribute it and/or modify
   it under the terms of either

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at
       your option) any later version

   or both in parallel, as here.

   pykdumpfile is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>.
*/

/* The rest of this file is adapted from the public header.
 * Matching libkdumpfile commit:
 * 82f1795d9589706b1b8df338eb4a7dbd8180daba
 */

#define ADDRXLAT_VER_MAJOR	...
#define ADDRXLAT_VER_MINOR	...
#define ADDRXLAT_VER_MICRO	...

#define ADDRXLAT_VERSION	...

typedef enum _addrxlat_status {
	ADDRXLAT_OK = 0,
	ADDRXLAT_ERR_NOTIMPL,
	ADDRXLAT_ERR_NOTPRESENT,
	ADDRXLAT_ERR_INVALID,
	ADDRXLAT_ERR_NOMEM,
	ADDRXLAT_ERR_NODATA,
	ADDRXLAT_ERR_NOMETH,

	ADDRXLAT_ERR_CUSTOM_BASE = -1
} addrxlat_status;

const char *addrxlat_strerror(addrxlat_status status);

typedef uint_fast64_t addrxlat_addr_t;
#define ADDRXLAT_ADDR_MAX	...

typedef int_fast64_t addrxlat_off_t;
typedef uint_fast64_t addrxlat_pte_t;

typedef enum _addrxlat_addrspace {
	ADDRXLAT_KPHYSADDR,
	ADDRXLAT_MACHPHYSADDR,
	ADDRXLAT_KVADDR,

	ADDRXLAT_NOADDR = -1,
} addrxlat_addrspace_t;

const char *addrxlat_addrspace_name(addrxlat_addrspace_t as);

typedef struct _addrxlat_fulladdr {
	addrxlat_addr_t addr;
	addrxlat_addrspace_t as;
} addrxlat_fulladdr_t;

typedef struct _addrxlat_ctx addrxlat_ctx_t;

addrxlat_ctx_t *addrxlat_ctx_new(void);
unsigned long addrxlat_ctx_incref(addrxlat_ctx_t *ctx);
unsigned long addrxlat_ctx_decref(addrxlat_ctx_t *ctx);

addrxlat_status addrxlat_ctx_err(
	addrxlat_ctx_t *ctx, addrxlat_status status,
	const char *msgfmt, ...);
void addrxlat_ctx_clear_err(addrxlat_ctx_t *ctx);
const char *addrxlat_ctx_get_err(const addrxlat_ctx_t *ctx);

typedef struct _addrxlat_cb addrxlat_cb_t;

typedef addrxlat_status addrxlat_cb_reg_value_fn(
	const addrxlat_cb_t *cb, const char *name, addrxlat_addr_t *val);
typedef addrxlat_status addrxlat_cb_sym_value_fn(
	const addrxlat_cb_t *cb, const char *name, addrxlat_addr_t *val);
typedef addrxlat_status addrxlat_cb_sym_sizeof_fn(
	const addrxlat_cb_t *cb, const char *name, addrxlat_addr_t *val);
typedef addrxlat_status addrxlat_cb_sym_offsetof_fn(
	const addrxlat_cb_t *cb, const char *obj, const char *elem,
	addrxlat_addr_t *val);
typedef addrxlat_status addrxlat_cb_num_value_fn(
	const addrxlat_cb_t *cb, const char *name, addrxlat_addr_t *val);

typedef enum _addrxlat_byte_order {
	ADDRXLAT_BIG_ENDIAN,
	ADDRXLAT_LITTLE_ENDIAN,

	ADDRXLAT_HOST_ENDIAN = -1
} addrxlat_byte_order_t;

typedef struct _addrxlat_buffer addrxlat_buffer_t;

typedef void addrxlat_put_page_fn(const addrxlat_buffer_t *buf);

struct _addrxlat_buffer {
	addrxlat_fulladdr_t addr;
	const void *ptr;
	size_t size;
	addrxlat_byte_order_t byte_order;
	addrxlat_put_page_fn *put_page;
	void *priv;
};

typedef addrxlat_status addrxlat_get_page_fn(
	const addrxlat_cb_t *cb, addrxlat_buffer_t *buf);

typedef unsigned long addrxlat_read_caps_fn(const addrxlat_cb_t *cb);

unsigned long ADDRXLAT_CAPS(unsigned val);

struct _addrxlat_cb {
	const addrxlat_cb_t *next;
	void *priv;
	addrxlat_get_page_fn *get_page;
	addrxlat_read_caps_fn *read_caps;
	addrxlat_cb_reg_value_fn *reg_value;
	addrxlat_cb_sym_value_fn *sym_value;
	addrxlat_cb_sym_sizeof_fn *sym_sizeof;
	addrxlat_cb_sym_offsetof_fn *sym_offsetof;
	addrxlat_cb_num_value_fn *num_value;
};

addrxlat_cb_t *addrxlat_ctx_add_cb(addrxlat_ctx_t *ctx);
void addrxlat_ctx_del_cb(addrxlat_ctx_t *ctx, addrxlat_cb_t *cb);
const addrxlat_cb_t *addrxlat_ctx_get_cb(const addrxlat_ctx_t *ctx);

typedef enum _addrxlat_kind {
	ADDRXLAT_NOMETH,
	ADDRXLAT_CUSTOM,
	ADDRXLAT_LINEAR,
	ADDRXLAT_PGT,
	ADDRXLAT_LOOKUP,
	ADDRXLAT_MEMARR,
} addrxlat_kind_t;

typedef struct _addrxlat_step addrxlat_step_t;

typedef addrxlat_status addrxlat_first_step_fn(
	addrxlat_step_t *step, addrxlat_addr_t addr);

typedef addrxlat_status addrxlat_next_step_fn(addrxlat_step_t *step);

typedef struct _addrxlat_param_custom {
	addrxlat_first_step_fn *first_step;
	addrxlat_next_step_fn *next_step;
	void *data;
} addrxlat_param_custom_t;

typedef struct _addrxlat_param_linear {
	addrxlat_off_t off;
} addrxlat_param_linear_t;

typedef enum _addrxlat_pte_format {
	ADDRXLAT_PTE_INVALID = -1,
	ADDRXLAT_PTE_NONE,
	ADDRXLAT_PTE_PFN32,
	ADDRXLAT_PTE_PFN64,
	ADDRXLAT_PTE_AARCH64,
	ADDRXLAT_PTE_IA32,
	ADDRXLAT_PTE_IA32_PAE,
	ADDRXLAT_PTE_X86_64,
	ADDRXLAT_PTE_S390X,
	ADDRXLAT_PTE_PPC64_LINUX_RPN30,
	ADDRXLAT_PTE_AARCH64_LPA,
	ADDRXLAT_PTE_AARCH64_LPA2,
	ADDRXLAT_PTE_ARM,
	ADDRXLAT_PTE_RISCV32,
	ADDRXLAT_PTE_RISCV64,
} addrxlat_pte_format_t;

const char *addrxlat_pte_format_name(addrxlat_pte_format_t fmt);
addrxlat_pte_format_t addrxlat_pte_format(const char *name);

int addrxlat_pteval_shift(addrxlat_pte_format_t fmt);

#define ADDRXLAT_FIELDS_MAX	8

typedef struct _addrxlat_paging_form {
	addrxlat_pte_format_t pte_format;
	unsigned short nfields;
	unsigned short fieldsz[ADDRXLAT_FIELDS_MAX];
} addrxlat_paging_form_t;

typedef struct _addrxlat_param_pgt {
	addrxlat_fulladdr_t root;
	addrxlat_pte_t pte_mask;
	addrxlat_paging_form_t pf;
} addrxlat_param_pgt_t;

typedef struct _addrxlat_lookup_elem {
	addrxlat_addr_t orig;
	addrxlat_addr_t dest;
} addrxlat_lookup_elem_t;

typedef struct _addrxlat_param_lookup {
	addrxlat_addr_t endoff;
	size_t nelem;
	addrxlat_lookup_elem_t *tbl;
} addrxlat_param_lookup_t;

typedef struct _addrxlat_param_memarr {
	addrxlat_fulladdr_t base;
	unsigned shift;
	unsigned elemsz;
	unsigned valsz;
} addrxlat_param_memarr_t;

typedef union _addrxlat_param {
	addrxlat_param_custom_t custom;
	addrxlat_param_linear_t linear;
	addrxlat_param_pgt_t pgt;
	addrxlat_param_lookup_t lookup;
	addrxlat_param_memarr_t memarr;
} addrxlat_param_t;

typedef struct _addrxlat_meth {
	addrxlat_kind_t kind;
	addrxlat_addrspace_t target_as;
	addrxlat_param_t param;
} addrxlat_meth_t;

typedef enum _addrxlat_sys_meth {
	ADDRXLAT_SYS_METH_NONE = -1,

	ADDRXLAT_SYS_METH_PGT,
	ADDRXLAT_SYS_METH_UPGT,
	ADDRXLAT_SYS_METH_DIRECT,
	ADDRXLAT_SYS_METH_KTEXT,
	ADDRXLAT_SYS_METH_VMEMMAP,
	ADDRXLAT_SYS_METH_RDIRECT,
	ADDRXLAT_SYS_METH_MACHPHYS_KPHYS,
	ADDRXLAT_SYS_METH_KPHYS_MACHPHYS,
	ADDRXLAT_SYS_METH_CUSTOM
} addrxlat_sys_meth_t;

#define ADDRXLAT_SYS_METH_CUSTOM_NUM	...
#define ADDRXLAT_SYS_METH_NUM		...

typedef struct _addrxlat_range {
	addrxlat_addr_t endoff;
	addrxlat_sys_meth_t meth;
} addrxlat_range_t;

typedef struct _addrxlat_map addrxlat_map_t;

addrxlat_map_t *addrxlat_map_new(void);
unsigned long addrxlat_map_incref(addrxlat_map_t *map);
unsigned long addrxlat_map_decref(addrxlat_map_t *map);
size_t addrxlat_map_len(const addrxlat_map_t *map);
const addrxlat_range_t *addrxlat_map_ranges(const addrxlat_map_t *map);
addrxlat_status addrxlat_map_set(
	addrxlat_map_t *map, addrxlat_addr_t addr,
	const addrxlat_range_t *range);
addrxlat_sys_meth_t addrxlat_map_search(
	const addrxlat_map_t *map, addrxlat_addr_t addr);
addrxlat_map_t *addrxlat_map_copy(const addrxlat_map_t *map);

typedef enum _addrxlat_optidx {
	ADDRXLAT_OPT_NULL,
	ADDRXLAT_OPT_arch,
	ADDRXLAT_OPT_os_type,
	ADDRXLAT_OPT_version_code,
	ADDRXLAT_OPT_phys_bits,
	ADDRXLAT_OPT_virt_bits,
	ADDRXLAT_OPT_page_shift,
	ADDRXLAT_OPT_phys_base,
	ADDRXLAT_OPT_rootpgt,
	ADDRXLAT_OPT_xen_p2m_mfn,
	ADDRXLAT_OPT_xen_xlat,
	ADDRXLAT_OPT_NUM
} addrxlat_optidx_t;

typedef union _addrxlat_optval {
	const char *str;
	unsigned long num;
	addrxlat_addr_t addr;
	addrxlat_fulladdr_t fulladdr;
} addrxlat_optval_t;

typedef struct _addrxlat_opt {
	addrxlat_optidx_t idx;
	addrxlat_optval_t val;
} addrxlat_opt_t;

void addrxlat_opt_arch(addrxlat_opt_t *opt, const char *val);
void addrxlat_opt_os_type(addrxlat_opt_t *opt, const char *val);
void addrxlat_opt_version_code(addrxlat_opt_t *opt, unsigned long val);
void addrxlat_opt_phys_bits(addrxlat_opt_t *opt, unsigned long val);
void addrxlat_opt_virt_bits(addrxlat_opt_t *opt, unsigned long val);
void addrxlat_opt_page_shift(addrxlat_opt_t *opt, unsigned long val);
void addrxlat_opt_phys_base(addrxlat_opt_t *opt, addrxlat_addr_t val);
void addrxlat_opt_rootpgt(addrxlat_opt_t *opt, const addrxlat_fulladdr_t *val);
void addrxlat_opt_xen_p2m_mfn(addrxlat_opt_t *opt, unsigned long val);
void addrxlat_opt_xen_xlat(addrxlat_opt_t *opt, unsigned long val);

unsigned long ADDRXLAT_VER_LINUX(unsigned a, unsigned b, unsigned c);
unsigned long ADDRXLAT_VER_XEN(unsigned major, unsigned minor);

typedef struct _addrxlat_sys addrxlat_sys_t;

addrxlat_sys_t *addrxlat_sys_new(void);
unsigned long addrxlat_sys_incref(addrxlat_sys_t *sys);
unsigned long addrxlat_sys_decref(addrxlat_sys_t *sys);
addrxlat_status addrxlat_sys_os_init(
	addrxlat_sys_t *sys, addrxlat_ctx_t *ctx,
	unsigned optc, const addrxlat_opt_t *opts);

typedef enum _addrxlat_sys_map {
	ADDRXLAT_SYS_MAP_HW,
	ADDRXLAT_SYS_MAP_KV_PHYS,
	ADDRXLAT_SYS_MAP_KPHYS_DIRECT,
	ADDRXLAT_SYS_MAP_MACHPHYS_KPHYS,
	ADDRXLAT_SYS_MAP_KPHYS_MACHPHYS,

	ADDRXLAT_SYS_MAP_NUM,
} addrxlat_sys_map_t;

void addrxlat_sys_set_map(
	addrxlat_sys_t *sys, addrxlat_sys_map_t idx,
	addrxlat_map_t *map);
addrxlat_map_t *addrxlat_sys_get_map(
	const addrxlat_sys_t *sys, addrxlat_sys_map_t idx);
void addrxlat_sys_set_meth(
	addrxlat_sys_t *sys, addrxlat_sys_meth_t idx,
	const addrxlat_meth_t *meth);
const addrxlat_meth_t *addrxlat_sys_get_meth(
	const addrxlat_sys_t *sys, addrxlat_sys_meth_t idx);

struct _addrxlat_step {
	addrxlat_ctx_t *ctx;
	addrxlat_sys_t *sys;
	const addrxlat_meth_t *meth;
	unsigned short remain;
	unsigned elemsz;
	addrxlat_fulladdr_t base;
	union {
		void *data;
		addrxlat_pte_t pte;
		const addrxlat_lookup_elem_t *elem;
		addrxlat_addr_t addr;
	} raw;
	addrxlat_addr_t idx[ADDRXLAT_FIELDS_MAX + 1];
};

addrxlat_status addrxlat_launch(addrxlat_step_t *step, addrxlat_addr_t addr);
addrxlat_status addrxlat_step(addrxlat_step_t *step);
addrxlat_status addrxlat_walk(addrxlat_step_t *step);

typedef addrxlat_status addrxlat_op_fn(void *data,
				       const addrxlat_fulladdr_t *addr);

typedef struct _addrxlat_op_ctl {
	addrxlat_ctx_t *ctx;
	addrxlat_sys_t *sys;
	addrxlat_op_fn *op;
	void *data;
	unsigned long caps;
} addrxlat_op_ctl_t;

addrxlat_status addrxlat_op(const addrxlat_op_ctl_t *ctl,
			    const addrxlat_fulladdr_t *addr);

addrxlat_status addrxlat_fulladdr_conv(
	addrxlat_fulladdr_t *faddr, addrxlat_addrspace_t as,
	addrxlat_ctx_t *ctx, addrxlat_sys_t *sys);