[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XTF 3/4] arm: Add initial architecture code for arm64 and arm32



Add initial support to XTF for arm64/arm32 without
modifying existing XTF architecture.
Most of the files are just dummy files waiting to be properly
implemented step by step later on.

The purpose of this change is to add the initial code and minimal
set of files to support arm64 without modifying the existing
XTF design. This creates a base for further implementation.

Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
Based-on-the-work-from: Julien Grall <julien@xxxxxxx>
---
 arch/arm/arm32/head.S              |   0
 arch/arm/arm64/cache.S             |  23 +++++++
 arch/arm/arm64/head.S              |  90 ++++++++++++++++++++++++++
 arch/arm/decode.c                  |  25 ++++++++
 arch/arm/include/arch/arm32/regs.h |  73 +++++++++++++++++++++
 arch/arm/include/arch/arm64/regs.h | 100 +++++++++++++++++++++++++++++
 arch/arm/include/arch/asm_macros.h |  21 ++++++
 arch/arm/include/arch/barrier.h    |  41 ++++++++++++
 arch/arm/include/arch/bitops.h     |  45 +++++++++++++
 arch/arm/include/arch/config.h     |  37 +++++++++++
 arch/arm/include/arch/desc.h       |  16 +++++
 arch/arm/include/arch/div.h        |  35 ++++++++++
 arch/arm/include/arch/extable.h    |  19 ++++++
 arch/arm/include/arch/hypercall.h  |  39 +++++++++++
 arch/arm/include/arch/page.h       |  23 +++++++
 arch/arm/include/arch/regs.h       |  25 ++++++++
 arch/arm/include/arch/traps.h      |  22 +++++++
 arch/arm/include/arch/xtf.h        |  17 +++++
 arch/arm/link.lds.S                |  58 +++++++++++++++++
 arch/arm/setup.c                   |  28 ++++++++
 arch/arm/traps.c                   |  22 +++++++
 21 files changed, 759 insertions(+)
 create mode 100644 arch/arm/arm32/head.S
 create mode 100644 arch/arm/arm64/cache.S
 create mode 100644 arch/arm/arm64/head.S
 create mode 100644 arch/arm/decode.c
 create mode 100644 arch/arm/include/arch/arm32/regs.h
 create mode 100644 arch/arm/include/arch/arm64/regs.h
 create mode 100644 arch/arm/include/arch/asm_macros.h
 create mode 100644 arch/arm/include/arch/barrier.h
 create mode 100644 arch/arm/include/arch/bitops.h
 create mode 100644 arch/arm/include/arch/config.h
 create mode 100644 arch/arm/include/arch/desc.h
 create mode 100644 arch/arm/include/arch/div.h
 create mode 100644 arch/arm/include/arch/extable.h
 create mode 100644 arch/arm/include/arch/hypercall.h
 create mode 100644 arch/arm/include/arch/page.h
 create mode 100644 arch/arm/include/arch/regs.h
 create mode 100644 arch/arm/include/arch/traps.h
 create mode 100644 arch/arm/include/arch/xtf.h
 create mode 100644 arch/arm/link.lds.S
 create mode 100644 arch/arm/setup.c
 create mode 100644 arch/arm/traps.c

diff --git a/arch/arm/arm32/head.S b/arch/arm/arm32/head.S
new file mode 100644
index 0000000..e69de29
diff --git a/arch/arm/arm64/cache.S b/arch/arm/arm64/cache.S
new file mode 100644
index 0000000..31b70ae
--- /dev/null
+++ b/arch/arm/arm64/cache.S
@@ -0,0 +1,23 @@
+#include <xtf/asm_macros.h>
+
+/*
+ * flush_dcache_range(start, end)
+ * - start   - start address of a region
+ * - end     - end address of a region
+ */
+ENTRY(flush_dcache_range)
+    /* Get the minimum D-cache line size */
+    mrs    x3, ctr_el0
+    ubfm   x3, x3, #16, #19
+    mov    x2, #4
+    lsl    x2, x2, x3
+    sub    x3, x2, #1
+    bic    x0, x0, x3
+    /* Clean and invalidate D-cache line */
+1:  dc     civac, x0
+    add    x0, x0, x2
+    cmp    x0, x1
+    b.lo   1b
+    dsb    sy
+    ret
+ENDFUNC(flush_dcache_range)
diff --git a/arch/arm/arm64/head.S b/arch/arm/arm64/head.S
new file mode 100644
index 0000000..bce0968
--- /dev/null
+++ b/arch/arm/arm64/head.S
@@ -0,0 +1,90 @@
+#include <arch/page.h>
+#include <xtf/asm_macros.h>
+#include <xen/xen.h>
+
+/* 1 if BE, 0 if LE */
+#define HEAD_FLAG_ENDIANNESS  0
+#define HEAD_FLAG_PAGE_SIZE   ((PAGE_SHIFT - 10) / 2)
+#define HEAD_FLAG_PHYS_BASE   1
+#define HEAD_FLAGS            ((HEAD_FLAG_ENDIANNESS << 0) | \
+                              (HEAD_FLAG_PAGE_SIZE << 1) |   \
+                              (HEAD_FLAG_PHYS_BASE << 3))
+
+/*
+ * Print a string on the debug console
+ *
+ * Clobbers: x0, x1, x2, x16
+ *
+ * /!\ When MMU is off, this can only be used with embed string in the
+ * kernel.
+ */
+#define PRINT(s)                                    \
+    adr     x2, 97f;                                \
+    adr     x1, 98f;                                \
+    sub     x1, x1, x2;                             \
+    mov     x0, #CONSOLEIO_write;                   \
+    mov     x16, #__HYPERVISOR_console_io;          \
+    hvc     #XEN_HYPERCALL_TAG;                     \
+    b       99f;                                    \
+97: .asciz  s;                                      \
+98:;                                                \
+    .align  2;                                      \
+99:
+
+.section ".bss.page_aligned"
+.p2align PAGE_SHIFT
+
+.text
+    b       _start                  /* branch to kernel start, magic */
+    .long   0                       /* Executable code */
+    .quad   0x0                     /* Image load offset from start of RAM */
+    .quad   _end - _start           /* Effective Image size */
+    .quad   HEAD_FLAGS              /* Informative flags, little-endian */
+    .quad   0                       /* reserved */
+    .quad   0                       /* reserved */
+    .quad   0                       /* reserved */
+    .byte   0x41                    /* Magic number, "ARM\x64" */
+    .byte   0x52
+    .byte   0x4d
+    .byte   0x64
+    .long   0                       /* reserved */
+
+
+/* Load a physical address of \sym to \xb */
+.macro load_paddr xb, sym
+    ldr \xb, =\sym
+    add \xb, \xb, x21
+.endm
+
+/*
+ * Common register usage for assembly boot code
+ *
+ * x20 - DTB physical address (boot CPU only)
+ * x21 - Offset between PA and VA ( PA - VA)
+ * x30 - lr
+ */
+ENTRY(_start)
+    /* Save DTB pointer */
+    mov     x20, x0
+
+    /* Calculate where we are */
+    ldr     x22, =_start        /* x22 := vaddr(_start) */
+    adr     x21, _start         /* x21 := paddr(_start) */
+    sub     x21, x21, x22       /* x21 := phys-offset */
+
+    PRINT("- XTF booting -\n")
+
+    PRINT("- Zero BSS -\n")
+
+    load_paddr  x0, __start_bss
+    load_paddr  x1, __end_bss
+
+    bl      flush_dcache_range
+1:  str     xzr, [x0], #8
+    cmp     x0, x1
+    b.lo    1b
+    bl      flush_dcache_range
+
+    /* Start an infinite loop */
+    PRINT("- Infinite loop -\n")
+1:  b   1b
diff --git a/arch/arm/decode.c b/arch/arm/decode.c
new file mode 100644
index 0000000..97aa576
--- /dev/null
+++ b/arch/arm/decode.c
@@ -0,0 +1,25 @@
+/**
+ * @file arch/arm/decode.c
+ *
+ * Helper routines for decoding arm architectural state.
+ */
+#include <xtf/lib.h>
+#include <xtf/libc.h>
+
+bool arch_fmt_pointer(
+    char **str_ptr, char *end, const char **fmt_ptr, const void *arg,
+    int width, int precision, unsigned int flags)
+{
+    UNIMPLEMENTED();
+    return false;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/arm32/regs.h 
b/arch/arm/include/arch/arm32/regs.h
new file mode 100644
index 0000000..fe137c4
--- /dev/null
+++ b/arch/arm/include/arch/arm32/regs.h
@@ -0,0 +1,73 @@
+/**
+ * @file arch/arm/include/arch/arm32/regs.h
+ *
+ * arm32 CPU user registers.
+ */
+#ifndef XTF_ARM32_REGS_H
+#define XTF_ARM32_REGS_H
+
+#include <xtf/types.h>
+
+/* On stack VCPU state */
+struct cpu_regs
+{
+    uint32_t r0;
+    uint32_t r1;
+    uint32_t r2;
+    uint32_t r3;
+    uint32_t r4;
+    uint32_t r5;
+    uint32_t r6;
+    uint32_t r7;
+    uint32_t r8;
+    uint32_t r9;
+    uint32_t r10;
+    union {
+        uint32_t r11;
+        uint32_t fp;
+    };
+    uint32_t r12;
+
+    uint32_t sp; /* r13 - SP: Valid for Hyp. frames only, o/w banked (see 
below) */
+
+    /* r14 - LR: is the same physical register as LR_usr */
+    union {
+        uint32_t lr; /* r14 - LR: Valid for Hyp. Same physical register as 
lr_usr. */
+
+        uint32_t lr_usr;
+    };
+
+    union {  /* Return IP, pc32 is used to allow code to be common with 64-bit 
*/
+        uint32_t pc, pc32;
+    };
+    uint32_t cpsr; /* Return mode */
+    uint32_t hsr;  /* Exception Syndrome */
+
+    /* Outer guest frame only from here on... */
+
+    uint32_t sp_usr; /* LR_usr is the same register as LR, see above */
+
+    uint32_t sp_irq, lr_irq;
+    uint32_t sp_svc, lr_svc;
+    uint32_t sp_abt, lr_abt;
+    uint32_t sp_und, lr_und;
+
+    uint32_t r8_fiq, r9_fiq, r10_fiq, r11_fiq, r12_fiq;
+    uint32_t sp_fiq, lr_fiq;
+
+    uint32_t spsr_svc, spsr_abt, spsr_und, spsr_irq, spsr_fiq;
+
+    uint32_t pad1; /* Doubleword-align the user half of the frame */
+};
+
+#endif /* XTF_ARM32_REGS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/arm64/regs.h 
b/arch/arm/include/arch/arm64/regs.h
new file mode 100644
index 0000000..8e18ae0
--- /dev/null
+++ b/arch/arm/include/arch/arm64/regs.h
@@ -0,0 +1,100 @@
+/**
+ * @file arch/arm/include/arch/arm64/regs.h
+ *
+ * arm64 CPU user registers.
+ */
+#ifndef XTF_ARM64_REGS_H
+#define XTF_ARM64_REGS_H
+
+#include <xtf/types.h>
+
+/* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */
+#define __DECL_REG(n64, n32) union {            \
+    uint64_t n64;                               \
+    uint32_t n32;                               \
+}
+
+/* On stack VCPU state */
+struct cpu_regs
+{
+    /*
+     * The mapping AArch64 <-> AArch32 is based on D1.20.1 in ARM DDI
+     * 0487A.d.
+     *
+     *         AArch64       AArch32
+     */
+    __DECL_REG(x0,           r0/*_usr*/);
+    __DECL_REG(x1,           r1/*_usr*/);
+    __DECL_REG(x2,           r2/*_usr*/);
+    __DECL_REG(x3,           r3/*_usr*/);
+    __DECL_REG(x4,           r4/*_usr*/);
+    __DECL_REG(x5,           r5/*_usr*/);
+    __DECL_REG(x6,           r6/*_usr*/);
+    __DECL_REG(x7,           r7/*_usr*/);
+    __DECL_REG(x8,           r8/*_usr*/);
+    __DECL_REG(x9,           r9/*_usr*/);
+    __DECL_REG(x10,          r10/*_usr*/);
+    __DECL_REG(x11 ,         r11/*_usr*/);
+    __DECL_REG(x12,          r12/*_usr*/);
+
+    __DECL_REG(x13,          /* r13_usr */ sp_usr);
+    __DECL_REG(x14,          /* r14_usr */ lr_usr);
+
+    __DECL_REG(x15,          /* r13_hyp */ __unused_sp_hyp);
+
+    __DECL_REG(x16,          /* r14_irq */ lr_irq);
+    __DECL_REG(x17,          /* r13_irq */ sp_irq);
+
+    __DECL_REG(x18,          /* r14_svc */ lr_svc);
+    __DECL_REG(x19,          /* r13_svc */ sp_svc);
+
+    __DECL_REG(x20,          /* r14_abt */ lr_abt);
+    __DECL_REG(x21,          /* r13_abt */ sp_abt);
+
+    __DECL_REG(x22,          /* r14_und */ lr_und);
+    __DECL_REG(x23,          /* r13_und */ sp_und);
+
+    __DECL_REG(x24,          r8_fiq);
+    __DECL_REG(x25,          r9_fiq);
+    __DECL_REG(x26,          r10_fiq);
+    __DECL_REG(x27,          r11_fiq);
+    __DECL_REG(x28,          r12_fiq);
+    __DECL_REG(/* x29 */ fp, /* r13_fiq */ sp_fiq);
+
+    __DECL_REG(/* x30 */ lr, /* r14_fiq */ lr_fiq);
+
+    uint64_t sp; /* Valid for hypervisor frames */
+
+    /* Return address and mode */
+    __DECL_REG(pc,           pc32);             /* ELR_EL2 */
+    uint32_t cpsr;                              /* SPSR_EL2 */
+    uint32_t hsr;                               /* ESR_EL2 */
+
+    /* Outer guest frame only from here on... */
+
+    union {
+        uint32_t spsr_el1;       /* AArch64 */
+        uint32_t spsr_svc;       /* AArch32 */
+    };
+
+    uint32_t pad1; /* Doubleword-align the user half of the frame */
+
+    /* AArch32 guests only */
+    uint32_t spsr_fiq, spsr_irq, spsr_und, spsr_abt;
+
+    /* AArch64 guests only */
+    uint64_t sp_el0;
+    uint64_t sp_el1, elr_el1;
+};
+
+#endif /* XTF_ARM64_REGS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/asm_macros.h 
b/arch/arm/include/arch/asm_macros.h
new file mode 100644
index 0000000..39e1d16
--- /dev/null
+++ b/arch/arm/include/arch/asm_macros.h
@@ -0,0 +1,21 @@
+/**
+ * @file arch/arm/include/arch/asm_macros.h
+ *
+ * Macros for use in arm assembly files.
+ */
+#ifndef XTF_ARM_ASM_MACROS_H
+#define XTF_ARM_ASM_MACROS_H
+
+#define ALIGN .align 2
+
+#endif /* XTF_ARM_ASM_MACROS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/barrier.h b/arch/arm/include/arch/barrier.h
new file mode 100644
index 0000000..b84c922
--- /dev/null
+++ b/arch/arm/include/arch/barrier.h
@@ -0,0 +1,41 @@
+/**
+ * @file arch/arm/include/arch/barrier.h
+ *
+ * arm memory barriers.
+ */
+#ifndef XTF_ARM_BARRIER_H
+#define XTF_ARM_BARRIER_H
+
+#include <xtf/compiler.h>
+
+#define isb()           __asm__ __volatile__ ("isb" : : : "memory")
+#define dsb(scope)      __asm__ __volatile__ ("dsb " #scope : : : "memory")
+#define dmb(scope)      __asm__ __volatile__ ("dmb " #scope : : : "memory")
+
+#define mb()            dsb(sy)
+#ifdef CONFIG_ARM_64
+#define rmb()           dsb(ld)
+#else
+#define rmb()           dsb(sy)
+#endif
+#define wmb()           dsb(st)
+
+#define smp_mb()        dmb(ish)
+#ifdef CONFIG_ARM_64
+#define smp_rmb()       dmb(ishld)
+#else
+#define smp_rmb()       dmb(ish)
+#endif
+#define smp_wmb()       dmb(ishst)
+
+#endif /* XTF_ARM_BARRIER_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/bitops.h b/arch/arm/include/arch/bitops.h
new file mode 100644
index 0000000..524b9f7
--- /dev/null
+++ b/arch/arm/include/arch/bitops.h
@@ -0,0 +1,45 @@
+/**
+ * @file arch/arm/include/arch/bitops.h
+ *
+ * Low level bit operations.
+ */
+#ifndef XTF_ARM_BITOPS_H
+#define XTF_ARM_BITOPS_H
+
+#include <xtf/lib.h>
+
+static inline bool test_bit(unsigned int bit, const void *addr)
+{
+    UNIMPLEMENTED();
+    return false;
+}
+
+static inline bool test_and_set_bit(unsigned int bit, volatile void *addr)
+{
+    UNIMPLEMENTED();
+    return false;
+}
+
+static inline bool test_and_change_bit(unsigned int bit, volatile void *addr)
+{
+    UNIMPLEMENTED();
+    return false;
+}
+
+static inline bool test_and_clear_bit(unsigned int bit, volatile void *addr)
+{
+    UNIMPLEMENTED();
+    return false;
+}
+
+#endif /* XTF_ARM_BITOPS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/config.h b/arch/arm/include/arch/config.h
new file mode 100644
index 0000000..2ccc71e
--- /dev/null
+++ b/arch/arm/include/arch/config.h
@@ -0,0 +1,37 @@
+/**
+ * @file arch/arm/include/arch/config.h
+ *
+ * A Linux-style configuration list.
+ */
+#ifndef XTF_ARM_CONFIG_H
+#define XTF_ARM_CONFIG_H
+
+#define XTF_VIRT_START 0x40000000
+
+#if defined(CONFIG_ENV_arm64)
+#define CONFIG_ARM              1
+#define CONFIG_ARM_64           1
+#define CONFIG_64BIT            1
+#define ENVIRONMENT_DESCRIPTION "ARM64"
+#undef CONFIG_ENV_arm64
+#elif defined(CONFIG_ENV_arm32)
+#define CONFIG_ARM              1
+#define CONFIG_ARM_32           1
+#define CONFIG_32BIT            1
+#define ENVIRONMENT_DESCRIPTION "ARM32"
+#undef CONFIG_ENV_arm32
+#else
+#error "Bad environment"
+#endif
+
+#endif /* XTF_ARM_CONFIG_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/desc.h b/arch/arm/include/arch/desc.h
new file mode 100644
index 0000000..f4ea8b3
--- /dev/null
+++ b/arch/arm/include/arch/desc.h
@@ -0,0 +1,16 @@
+/**
+ * @file arch/arm/include/arch/desc.h
+ */
+#ifndef XTF_ARM_DESC_H
+#define XTF_ARM_DESC_H
+
+#endif /* XTF_ARM_DESC_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/div.h b/arch/arm/include/arch/div.h
new file mode 100644
index 0000000..3038430
--- /dev/null
+++ b/arch/arm/include/arch/div.h
@@ -0,0 +1,35 @@
+/**
+ * @file arch/arm/include/arch/div.h
+ */
+#ifndef XTF_ARM_DIV_H
+#define XTF_ARM_DIV_H
+
+#include <xtf/lib.h>
+
+/*
+ * Divide a 64bit number by 32bit divisor without software support.
+ *
+ * The dividend is modified in place, and the modulus is returned.
+ */
+static inline uint32_t divmod64(uint64_t *dividend, uint32_t divisor)
+{
+#if defined(CONFIG_ARM_64)
+    uint32_t remainder = *dividend % divisor;
+    *dividend = *dividend / divisor;
+    return remainder;
+#else
+    UNIMPLEMENTED();
+#endif
+}
+
+#endif /* XTF_ARM_DIV_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/extable.h b/arch/arm/include/arch/extable.h
new file mode 100644
index 0000000..9560b96
--- /dev/null
+++ b/arch/arm/include/arch/extable.h
@@ -0,0 +1,19 @@
+/**
+ * @file arch/arm/include/arch/extable.h
+ *
+ * Common arm exception table helper functions.
+ */
+#ifndef XTF_ARM64_EXTABLE_H
+#define XTF_ARM64_EXTABLE_H
+
+#endif /* XTF_ARM_EXTABLE_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/hypercall.h 
b/arch/arm/include/arch/hypercall.h
new file mode 100644
index 0000000..660b2d6
--- /dev/null
+++ b/arch/arm/include/arch/hypercall.h
@@ -0,0 +1,39 @@
+/**
+ * @file arch/arm/include/arch/hypercall.h
+ *
+ * Hypercall primitives for arm.
+ */
+#ifndef XTF_ARM_HYPERCALL_H
+#define XTF_ARM_HYPERCALL_H
+
+#include <xtf/lib.h>
+
+#define _hypercall_1(type, hcall, a1)           \
+    ({                                          \
+        UNIMPLEMENTED();                        \
+        (type)0;                                \
+    })
+
+#define _hypercall_2(type, hcall, a1, a2)       \
+    ({                                          \
+        UNIMPLEMENTED();                        \
+        (type)0;                                \
+    })
+
+#define _hypercall_3(type, hcall, a1, a2, a3)   \
+    ({                                          \
+        UNIMPLEMENTED();                        \
+        (type)0;                                \
+    })
+
+#endif /* XTF_ARM_HYPERCALL_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/page.h b/arch/arm/include/arch/page.h
new file mode 100644
index 0000000..508b3ef
--- /dev/null
+++ b/arch/arm/include/arch/page.h
@@ -0,0 +1,23 @@
+/**
+ * @file arch/arm/include/arch/page.h
+ */
+#ifndef XTF_ARM_PAGE_H
+#define XTF_ARM_PAGE_H
+
+#include <xtf/numbers.h>
+
+#define PAGE_SHIFT      12
+#define PAGE_SIZE       (_AC(1, L) << PAGE_SHIFT)
+#define PAGE_MASK       (~(PAGE_SIZE - 1))
+
+#endif /* XTF_ARM_PAGE_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/regs.h b/arch/arm/include/arch/regs.h
new file mode 100644
index 0000000..704e8e6
--- /dev/null
+++ b/arch/arm/include/arch/regs.h
@@ -0,0 +1,25 @@
+/**
+ * @file arch/arm/include/arch/regs.h
+ *
+ * arm CPU user registers.
+ */
+#ifndef XTF_ARM_REGS_H
+#define XTF_ARM_REGS_H
+
+#if defined(CONFIG_ARM_64)
+#include <arch/arm64/regs.h>
+#else
+#include <arch/arm32/regs.h>
+#endif
+
+#endif /* XTF_ARM_REGS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/traps.h b/arch/arm/include/arch/traps.h
new file mode 100644
index 0000000..8c42064
--- /dev/null
+++ b/arch/arm/include/arch/traps.h
@@ -0,0 +1,22 @@
+/**
+ * @file arch/arm/include/arch/traps.h
+ */
+#ifndef XTF_ARM_TRAPS_H
+#define XTF_ARM_TRAPS_H
+
+#include <xtf/compiler.h>
+#include <xen/xen.h>
+
+void __noreturn arch_crash_hard(void);
+
+#endif /* XTF_ARM_TRAPS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/include/arch/xtf.h b/arch/arm/include/arch/xtf.h
new file mode 100644
index 0000000..7b25617
--- /dev/null
+++ b/arch/arm/include/arch/xtf.h
@@ -0,0 +1,17 @@
+/**
+ * @file arch/arm/include/arch/xtf.h
+ */
+#ifndef XTF_ARM_XTF_H
+#define XTF_ARM_XTF_H
+
+#endif /* XTF_ARM_XTF_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/link.lds.S b/arch/arm/link.lds.S
new file mode 100644
index 0000000..3160cf1
--- /dev/null
+++ b/arch/arm/link.lds.S
@@ -0,0 +1,58 @@
+#include <arch/page.h>
+
+#if defined(__arm__)
+OUTPUT_ARCH(arm)
+OUTPUT_FORMAT("elf32-littlearm")
+#elif defined(__aarch64__)
+OUTPUT_ARCH(aarch64)
+OUTPUT_FORMAT("elf64-littleaarch64")
+#endif
+
+ENTRY(_start)
+
+SECTIONS
+{
+    . = XTF_VIRT_START;
+    _text = .;
+
+    .text : {
+        *(.text)
+    }
+
+    . = ALIGN(PAGE_SIZE);
+
+    .data : {
+        *(.data)
+
+    . = ALIGN(PAGE_SIZE);
+        *(.data.page_aligned)
+    }
+
+    . = ALIGN(PAGE_SIZE);
+
+    .rodata : {
+        *(.rodata)
+        *(.rodata.*)
+    }
+
+    . = ALIGN(PAGE_SIZE);
+
+    .bss : {
+        __start_bss = .;
+        *(.bss)
+
+    . = ALIGN(PAGE_SIZE);
+        *(.bss.page_aligned)
+
+        __end_bss = .;
+    }
+
+    _end = .;
+
+    /*
+     * It is possible for a GNU linker to add a .note.gnu.build-id section
+     * before .text which causes zimage header to be shifted resulting in
+     * a bad magic. Discard this section to prevent errors.
+     */
+    /DISCARD/ : { *(.note.gnu.build-id) }
+}
diff --git a/arch/arm/setup.c b/arch/arm/setup.c
new file mode 100644
index 0000000..bc5669d
--- /dev/null
+++ b/arch/arm/setup.c
@@ -0,0 +1,28 @@
+/**
+ * @file arch/arm/setup.c
+ *
+ * Early bringup code for arm.
+ */
+#include <xtf/lib.h>
+
+const char environment_description[] = ENVIRONMENT_DESCRIPTION;
+
+void arch_setup(void)
+{
+    UNIMPLEMENTED();
+}
+
+void test_setup(void)
+{
+    UNIMPLEMENTED();
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/arch/arm/traps.c b/arch/arm/traps.c
new file mode 100644
index 0000000..f4ad807
--- /dev/null
+++ b/arch/arm/traps.c
@@ -0,0 +1,22 @@
+/**
+ * @file arch/arm/traps.c
+ *
+ * arm trap handlers.
+ */
+#include <xtf/traps.h>
+#include <xtf/lib.h>
+
+void __noreturn arch_crash_hard(void)
+{
+    UNIMPLEMENTED();
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
-- 
2.29.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.