Skip to content

Commit 0c69913

Browse files
firscityfabiobaltieri
authored andcommitted
xen: dom0: update Xen public headers for running Zephyr as Dom0
Xen public headers are added to Zephyr kernel partially, so we need to update them for new features implementation. Further implementation of Xen domains configuration and memory management requires dedicated Xen public headers inside Zephyr kernel. It will be used for add Zephyr OS Xen Domain-0 funtionalities. Update existent and add new required public headers from Xen 4.17.0 release. Signed-off-by: Dmytro Firsov <[email protected]>
1 parent 5852dd2 commit 0c69913

File tree

4 files changed

+823
-3
lines changed

4 files changed

+823
-3
lines changed

include/zephyr/xen/public/arch-arm.h

Lines changed: 251 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,138 @@ typedef uint64_t xen_pfn_t;
205205
#define PRI_xen_pfn PRIx64
206206
#define PRIu_xen_pfn PRIu64
207207

208-
typedef uint64_t xen_ulong_t;
209-
#define PRI_xen_ulong PRIx64
210-
211208
/*
212209
* Maximum number of virtual CPUs in legacy multi-processor guests.
213210
* Only one. All other VCPUS must use VCPUOP_register_vcpu_info.
214211
*/
215212
#define XEN_LEGACY_MAX_VCPUS 1
216213

214+
typedef uint64_t xen_ulong_t;
215+
#define PRI_xen_ulong PRIx64
216+
217+
#ifdef CONFIG_XEN_DOM0
218+
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
219+
/* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */
220+
# define __DECL_REG(n64, n32) union { \
221+
uint64_t n64; \
222+
uint32_t n32; \
223+
}
224+
#else
225+
/* Non-gcc sources must always use the proper 64-bit name (e.g., x0). */
226+
#define __DECL_REG(n64, n32) uint64_t n64
227+
#endif
228+
229+
struct vcpu_guest_core_regs {
230+
/* Aarch64 Aarch32 */
231+
__DECL_REG(x0, r0_usr);
232+
__DECL_REG(x1, r1_usr);
233+
__DECL_REG(x2, r2_usr);
234+
__DECL_REG(x3, r3_usr);
235+
__DECL_REG(x4, r4_usr);
236+
__DECL_REG(x5, r5_usr);
237+
__DECL_REG(x6, r6_usr);
238+
__DECL_REG(x7, r7_usr);
239+
__DECL_REG(x8, r8_usr);
240+
__DECL_REG(x9, r9_usr);
241+
__DECL_REG(x10, r10_usr);
242+
__DECL_REG(x11, r11_usr);
243+
__DECL_REG(x12, r12_usr);
244+
245+
__DECL_REG(x13, sp_usr);
246+
__DECL_REG(x14, lr_usr);
247+
248+
__DECL_REG(x15, __unused_sp_hyp);
249+
250+
__DECL_REG(x16, lr_irq);
251+
__DECL_REG(x17, sp_irq);
252+
253+
__DECL_REG(x18, lr_svc);
254+
__DECL_REG(x19, sp_svc);
255+
256+
__DECL_REG(x20, lr_abt);
257+
__DECL_REG(x21, sp_abt);
258+
259+
__DECL_REG(x22, lr_und);
260+
__DECL_REG(x23, sp_und);
261+
262+
__DECL_REG(x24, r8_fiq);
263+
__DECL_REG(x25, r9_fiq);
264+
__DECL_REG(x26, r10_fiq);
265+
__DECL_REG(x27, r11_fiq);
266+
__DECL_REG(x28, r12_fiq);
267+
268+
__DECL_REG(x29, sp_fiq);
269+
__DECL_REG(x30, lr_fiq);
270+
271+
/* Return address and mode */
272+
__DECL_REG(pc64, pc32); /* ELR_EL2 */
273+
uint32_t cpsr; /* SPSR_EL2 */
274+
275+
union {
276+
uint32_t spsr_el1; /* AArch64 */
277+
uint32_t spsr_svc; /* AArch32 */
278+
};
279+
280+
/* AArch32 guests only */
281+
uint32_t spsr_fiq, spsr_irq, spsr_und, spsr_abt;
282+
283+
/* AArch64 guests only */
284+
uint64_t sp_el0;
285+
uint64_t sp_el1, elr_el1;
286+
};
287+
typedef struct vcpu_guest_core_regs vcpu_guest_core_regs_t;
288+
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_core_regs_t);
289+
290+
#undef __DECL_REG
291+
292+
struct vcpu_guest_context {
293+
#define _VGCF_online 0
294+
#define VGCF_online (1 << _VGCF_online)
295+
uint32_t flags; /* VGCF_* */
296+
297+
struct vcpu_guest_core_regs user_regs; /* Core CPU registers */
298+
299+
uint64_t sctlr;
300+
uint64_t ttbcr, ttbr0, ttbr1;
301+
};
302+
typedef struct vcpu_guest_context vcpu_guest_context_t;
303+
DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
304+
305+
/*
306+
* struct xen_arch_domainconfig's ABI is covered by
307+
* XEN_DOMCTL_INTERFACE_VERSION.
308+
*/
309+
#define XEN_DOMCTL_CONFIG_GIC_NATIVE 0
310+
#define XEN_DOMCTL_CONFIG_GIC_V2 1
311+
#define XEN_DOMCTL_CONFIG_GIC_V3 2
312+
313+
#define XEN_DOMCTL_CONFIG_TEE_NONE 0
314+
#define XEN_DOMCTL_CONFIG_TEE_OPTEE 1
315+
316+
struct xen_arch_domainconfig {
317+
/* IN/OUT */
318+
uint8_t gic_version;
319+
/* IN */
320+
uint16_t tee_type;
321+
/* IN */
322+
uint32_t nr_spis;
323+
/*
324+
* OUT
325+
* Based on the property clock-frequency in the DT timer node.
326+
* The property may be present when the bootloader/firmware doesn't
327+
* set correctly CNTFRQ which hold the timer frequency.
328+
*
329+
* As it's not possible to trap this register, we have to replicate
330+
* the value in the guest DT.
331+
*
332+
* = 0 => property not present
333+
* > 0 => Value of the property
334+
*
335+
*/
336+
uint32_t clock_frequency;
337+
};
338+
#endif /* CONFIG_XEN_DOM0 */
339+
217340
struct arch_vcpu_info {
218341
};
219342
typedef struct arch_vcpu_info arch_vcpu_info_t;
@@ -225,4 +348,129 @@ typedef uint64_t xen_callback_t;
225348

226349
#endif /* __ASSEMBLY__ */
227350

351+
#ifdef CONFIG_XEN_DOM0
352+
353+
/* PSR bits (CPSR, SPSR) */
354+
#define PSR_THUMB (1 << 5) /* Thumb Mode enable */
355+
#define PSR_FIQ_MASK (1 << 6) /* Fast Interrupt mask */
356+
#define PSR_IRQ_MASK (1 << 7) /* Interrupt mask */
357+
#define PSR_ABT_MASK (1 << 8) /* Asynchronous Abort mask */
358+
#define PSR_BIG_ENDIAN (1 << 9) /* arm32: Big Endian Mode */
359+
#define PSR_DBG_MASK (1 << 9) /* arm64: Debug Exception mask */
360+
#define PSR_IT_MASK (0x0600fc00) /* Thumb If-Then Mask */
361+
#define PSR_JAZELLE (1<<24) /* Jazelle Mode */
362+
363+
/* 32 bit modes */
364+
#define PSR_MODE_USR 0x10
365+
#define PSR_MODE_FIQ 0x11
366+
#define PSR_MODE_IRQ 0x12
367+
#define PSR_MODE_SVC 0x13
368+
#define PSR_MODE_MON 0x16
369+
#define PSR_MODE_ABT 0x17
370+
#define PSR_MODE_HYP 0x1a
371+
#define PSR_MODE_UND 0x1b
372+
#define PSR_MODE_SYS 0x1f
373+
374+
/* 64 bit modes */
375+
#define PSR_MODE_BIT 0x10 /* Set iff AArch32 */
376+
#define PSR_MODE_EL3h 0x0d
377+
#define PSR_MODE_EL3t 0x0c
378+
#define PSR_MODE_EL2h 0x09
379+
#define PSR_MODE_EL2t 0x08
380+
#define PSR_MODE_EL1h 0x05
381+
#define PSR_MODE_EL1t 0x04
382+
#define PSR_MODE_EL0t 0x00
383+
384+
#define PSR_GUEST32_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_SVC)
385+
#define PSR_GUEST64_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_EL1h)
386+
387+
#define SCTLR_GUEST_INIT xen_mk_ullong(0x00c50078)
388+
389+
/*
390+
* Virtual machine platform (memory layout, interrupts)
391+
*
392+
* These are defined for consistency between the tools and the
393+
* hypervisor. Guests must not rely on these hardcoded values but
394+
* should instead use the FDT.
395+
*/
396+
397+
/* Physical Address Space */
398+
399+
/*
400+
* vGIC mappings: Only one set of mapping is used by the guest.
401+
* Therefore they can overlap.
402+
*/
403+
404+
/* vGIC v2 mappings */
405+
#define GUEST_GICD_BASE xen_mk_ullong(0x03001000)
406+
#define GUEST_GICD_SIZE xen_mk_ullong(0x00001000)
407+
#define GUEST_GICC_BASE xen_mk_ullong(0x03002000)
408+
#define GUEST_GICC_SIZE xen_mk_ullong(0x00002000)
409+
410+
/* vGIC v3 mappings */
411+
#define GUEST_GICV3_GICD_BASE xen_mk_ullong(0x03001000)
412+
#define GUEST_GICV3_GICD_SIZE xen_mk_ullong(0x00010000)
413+
414+
#define GUEST_GICV3_RDIST_REGIONS 1
415+
416+
#define GUEST_GICV3_GICR0_BASE xen_mk_ullong(0x03020000) /* vCPU0..127 */
417+
#define GUEST_GICV3_GICR0_SIZE xen_mk_ullong(0x01000000)
418+
419+
/* ACPI tables physical address */
420+
#define GUEST_ACPI_BASE xen_mk_ullong(0x20000000)
421+
#define GUEST_ACPI_SIZE xen_mk_ullong(0x02000000)
422+
423+
/* PL011 mappings */
424+
#define GUEST_PL011_BASE xen_mk_ullong(0x22000000)
425+
#define GUEST_PL011_SIZE xen_mk_ullong(0x00001000)
426+
427+
/*
428+
* 16MB == 4096 pages reserved for guest to use as a region to map its
429+
* grant table in.
430+
*/
431+
#define GUEST_GNTTAB_BASE xen_mk_ullong(0x38000000)
432+
#define GUEST_GNTTAB_SIZE xen_mk_ullong(0x01000000)
433+
434+
#define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000)
435+
#define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000)
436+
437+
#define GUEST_RAM_BANKS 2
438+
439+
#define GUEST_RAM0_BASE xen_mk_ullong(0x40000000) /* 3GB of low RAM @ 1GB */
440+
#define GUEST_RAM0_SIZE xen_mk_ullong(0xc0000000)
441+
442+
#define GUEST_RAM1_BASE xen_mk_ullong(0x0200000000) /* 1016GB of RAM @ 8GB */
443+
#define GUEST_RAM1_SIZE xen_mk_ullong(0xfe00000000)
444+
445+
#define GUEST_RAM_BASE GUEST_RAM0_BASE /* Lowest RAM address */
446+
/* Largest amount of actual RAM, not including holes */
447+
#define GUEST_RAM_MAX (GUEST_RAM0_SIZE + GUEST_RAM1_SIZE)
448+
/* Suitable for e.g. const uint64_t ramfoo[] = GUEST_RAM_BANK_FOOS; */
449+
#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE }
450+
#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE }
451+
452+
/* Current supported guest VCPUs */
453+
#define GUEST_MAX_VCPUS 128
454+
455+
/* Interrupts */
456+
#define GUEST_TIMER_VIRT_PPI 27
457+
#define GUEST_TIMER_PHYS_S_PPI 29
458+
#define GUEST_TIMER_PHYS_NS_PPI 30
459+
#define GUEST_EVTCHN_PPI 31
460+
461+
#define GUEST_VPL011_SPI 32
462+
463+
/* PSCI functions */
464+
#define PSCI_cpu_suspend 0
465+
#define PSCI_cpu_off 1
466+
#define PSCI_cpu_on 2
467+
#define PSCI_migrate 3
468+
469+
#endif /* CONFIG_XEN_DOM0 */
470+
471+
#ifndef __ASSEMBLY__
472+
/* Stub definition of PMU structure */
473+
typedef struct xen_pmu_arch { uint8_t dummy; } xen_pmu_arch_t;
474+
#endif /* __ASSEMBLY__ */
475+
228476
#endif /* __XEN_PUBLIC_ARCH_ARM_H__ */

0 commit comments

Comments
 (0)