summaryrefslogtreecommitdiffstats
path: root/sys/arm64/include
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm64/include')
-rw-r--r--sys/arm64/include/armreg.h6
-rw-r--r--sys/arm64/include/cpu.h4
-rw-r--r--sys/arm64/include/intr.h10
-rw-r--r--sys/arm64/include/machdep.h2
-rw-r--r--sys/arm64/include/pcb.h2
-rw-r--r--sys/arm64/include/pmap.h6
-rw-r--r--sys/arm64/include/pte.h19
-rw-r--r--sys/arm64/include/smp.h2
-rw-r--r--sys/arm64/include/vmparam.h2
9 files changed, 35 insertions, 18 deletions
diff --git a/sys/arm64/include/armreg.h b/sys/arm64/include/armreg.h
index 8b2bc92..40d07f0 100644
--- a/sys/arm64/include/armreg.h
+++ b/sys/arm64/include/armreg.h
@@ -66,6 +66,12 @@
#define CTR_ILINE_MASK (0xf << CTR_ILINE_SHIFT)
#define CTR_ILINE_SIZE(reg) (((reg) & CTR_ILINE_MASK) >> CTR_ILINE_SHIFT)
+/* DCZID_EL0 - Data Cache Zero ID register */
+#define DCZID_DZP (1 << 4) /* DC ZVA prohibited if non-0 */
+#define DCZID_BS_SHIFT 0
+#define DCZID_BS_MASK (0xf << DCZID_BS_SHIFT)
+#define DCZID_BS_SIZE(reg) (((reg) & DCZID_BS_MASK) >> DCZID_BS_SHIFT)
+
/* ESR_ELx */
#define ESR_ELx_ISS_MASK 0x00ffffff
#define ISS_INSN_FnV (0x01 << 10)
diff --git a/sys/arm64/include/cpu.h b/sys/arm64/include/cpu.h
index 8f14e82..520729c 100644
--- a/sys/arm64/include/cpu.h
+++ b/sys/arm64/include/cpu.h
@@ -1,6 +1,6 @@
/*-
* Copyright (c) 1990 The Regents of the University of California.
- * Copyright (c) 2014 The FreeBSD Foundation
+ * Copyright (c) 2014-2016 The FreeBSD Foundation
* All rights reserved.
*
* This code is derived from software contributed to Berkeley by
@@ -46,7 +46,7 @@
#include <machine/armreg.h>
#define TRAPF_PC(tfp) ((tfp)->tf_lr)
-#define TRAPF_USERMODE(tfp) (((tfp)->tf_elr & (1ul << 63)) == 0)
+#define TRAPF_USERMODE(tfp) (((tfp)->tf_spsr & PSR_M_MASK) == PSR_M_EL0t)
#define cpu_getstack(td) ((td)->td_frame->tf_sp)
#define cpu_setstack(td, sp) ((td)->td_frame->tf_sp = (sp))
diff --git a/sys/arm64/include/intr.h b/sys/arm64/include/intr.h
index 2d7da21..327b249 100644
--- a/sys/arm64/include/intr.h
+++ b/sys/arm64/include/intr.h
@@ -29,8 +29,10 @@
#ifndef _MACHINE_INTR_H_
#define _MACHINE_INTR_H_
-int arm_config_intr(u_int, enum intr_trigger, enum intr_polarity);
-void arm_cpu_intr(struct trapframe *);
+int intr_irq_config(u_int, enum intr_trigger, enum intr_polarity);
+void intr_irq_handler(struct trapframe *);
+int intr_irq_remove_handler(device_t, u_int, void *);
+
void arm_dispatch_intr(u_int, struct trapframe *);
int arm_enable_intr(void);
void arm_mask_irq(u_int);
@@ -44,12 +46,12 @@ int arm_map_msi(device_t, device_t, int, uint64_t *, uint32_t *);
int arm_map_msix(device_t, device_t, int, uint64_t *, uint32_t *);
int arm_setup_intr(const char *, driver_filter_t *, driver_intr_t,
void *, u_int, enum intr_type, void **);
-int arm_teardown_intr(void *);
void arm_unmask_irq(u_int);
#ifdef SMP
+int intr_irq_bind(u_int, int);
+
void arm_init_secondary(void);
-int arm_intr_bind(u_int, int);
void arm_setup_ipihandler(driver_filter_t *, u_int);
void arm_unmask_ipi(u_int);
#endif
diff --git a/sys/arm64/include/machdep.h b/sys/arm64/include/machdep.h
index 92c735b..0b1feae 100644
--- a/sys/arm64/include/machdep.h
+++ b/sys/arm64/include/machdep.h
@@ -34,11 +34,13 @@ struct arm64_bootparams {
vm_offset_t kern_l1pt; /* L1 page table for the kernel */
uint64_t kern_delta;
vm_offset_t kern_stack;
+ vm_offset_t kern_l0pt; /* L1 page table for the kernel */
};
extern vm_paddr_t physmap[];
extern u_int physmap_idx;
void initarm(struct arm64_bootparams *);
+extern void (*pagezero)(void *);
#endif /* _MACHINE_MACHDEP_H_ */
diff --git a/sys/arm64/include/pcb.h b/sys/arm64/include/pcb.h
index 55dd6e9..4426226 100644
--- a/sys/arm64/include/pcb.h
+++ b/sys/arm64/include/pcb.h
@@ -40,7 +40,7 @@ struct pcb {
/* These two need to be in order as we access them together */
uint64_t pcb_sp;
uint64_t pcb_tpidr_el0;
- vm_offset_t pcb_l1addr;
+ vm_offset_t pcb_l0addr;
/* Fault handler, the error value is passed in x0 */
vm_offset_t pcb_onfault;
diff --git a/sys/arm64/include/pmap.h b/sys/arm64/include/pmap.h
index 0faf2e8..578eb46 100644
--- a/sys/arm64/include/pmap.h
+++ b/sys/arm64/include/pmap.h
@@ -78,7 +78,7 @@ struct pv_addr {
struct pmap {
struct mtx pm_mtx;
struct pmap_statistics pm_stats; /* pmap statictics */
- pd_entry_t *pm_l1;
+ pd_entry_t *pm_l0;
TAILQ_HEAD(,pv_chunk) pm_pvchunk; /* list of mappings in pmap */
};
@@ -134,7 +134,7 @@ extern vm_offset_t virtual_end;
#define L1_MAPPABLE_P(va, pa, size) \
((((va) | (pa)) & L1_OFFSET) == 0 && (size) >= L1_SIZE)
-void pmap_bootstrap(vm_offset_t, vm_paddr_t, vm_size_t);
+void pmap_bootstrap(vm_offset_t, vm_offset_t, vm_paddr_t, vm_size_t);
void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
vm_paddr_t pmap_kextract(vm_offset_t va);
void pmap_kremove(vm_offset_t);
@@ -149,7 +149,7 @@ boolean_t pmap_map_io_transient(vm_page_t *, vm_offset_t *, int, boolean_t);
void pmap_unmap_io_transient(vm_page_t *, vm_offset_t *, int, boolean_t);
bool pmap_get_tables(pmap_t, vm_offset_t, pd_entry_t **, pd_entry_t **,
- pt_entry_t **);
+ pd_entry_t **, pt_entry_t **);
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
diff --git a/sys/arm64/include/pte.h b/sys/arm64/include/pte.h
index 645cf31..da70dc4 100644
--- a/sys/arm64/include/pte.h
+++ b/sys/arm64/include/pte.h
@@ -73,8 +73,10 @@ typedef uint64_t pt_entry_t; /* page table entry */
/* Level 0 table, 512GiB per entry */
#define L0_SHIFT 39
+#define L0_SIZE (1ul << L0_SHIFT)
+#define L0_OFFSET (L0_SIZE - 1ul)
#define L0_INVAL 0x0 /* An invalid address */
-#define L0_BLOCK 0x1 /* A block */
+ /* 0x1 Level 0 doesn't support block translation */
/* 0x2 also marks an invalid address */
#define L0_TABLE 0x3 /* A next-level table */
@@ -83,16 +85,16 @@ typedef uint64_t pt_entry_t; /* page table entry */
#define L1_SIZE (1 << L1_SHIFT)
#define L1_OFFSET (L1_SIZE - 1)
#define L1_INVAL L0_INVAL
-#define L1_BLOCK L0_BLOCK
+#define L1_BLOCK 0x1
#define L1_TABLE L0_TABLE
/* Level 2 table, 2MiB per entry */
#define L2_SHIFT 21
#define L2_SIZE (1 << L2_SHIFT)
#define L2_OFFSET (L2_SIZE - 1)
-#define L2_INVAL L0_INVAL
-#define L2_BLOCK L0_BLOCK
-#define L2_TABLE L0_TABLE
+#define L2_INVAL L1_INVAL
+#define L2_BLOCK L1_BLOCK
+#define L2_TABLE L1_TABLE
#define L2_BLOCK_MASK UINT64_C(0xffffffe00000)
@@ -106,7 +108,12 @@ typedef uint64_t pt_entry_t; /* page table entry */
/* 0x2 also marks an invalid address */
#define L3_PAGE 0x3
-#define Ln_ENTRIES (1 << 9)
+#define L0_ENTRIES_SHIFT 9
+#define L0_ENTRIES (1 << L0_ENTRIES_SHIFT)
+#define L0_ADDR_MASK (L0_ENTRIES - 1)
+
+#define Ln_ENTRIES_SHIFT 9
+#define Ln_ENTRIES (1 << Ln_ENTRIES_SHIFT)
#define Ln_ADDR_MASK (Ln_ENTRIES - 1)
#define Ln_TABLE_MASK ((1 << 12) - 1)
diff --git a/sys/arm64/include/smp.h b/sys/arm64/include/smp.h
index 0f56396..538981a 100644
--- a/sys/arm64/include/smp.h
+++ b/sys/arm64/include/smp.h
@@ -42,7 +42,7 @@ enum {
IPI_STOP,
IPI_STOP_HARD,
IPI_HARDCLOCK,
- COUNT_IPI,
+ INTR_IPI_COUNT,
};
void ipi_all_but_self(u_int ipi);
diff --git a/sys/arm64/include/vmparam.h b/sys/arm64/include/vmparam.h
index 2752ee1..cd9198e 100644
--- a/sys/arm64/include/vmparam.h
+++ b/sys/arm64/include/vmparam.h
@@ -188,7 +188,7 @@ extern vm_paddr_t dmap_phys_base;
})
#define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
-#define VM_MAX_USER_ADDRESS (0x0000008000000000UL)
+#define VM_MAX_USER_ADDRESS (0x0001000000000000UL)
#define VM_MINUSER_ADDRESS (VM_MIN_USER_ADDRESS)
#define VM_MAXUSER_ADDRESS (VM_MAX_USER_ADDRESS)
OpenPOWER on IntegriCloud