|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 57/57] xxxen/riscv: WIP ( need advise )
These changes are needed only to make GitLab CI happy is it doesn't
take into account tiny64_defconfig where unnecessary configs are disabled.
I tried different approaches to deal with it:
1. Override EXTRA_XEN_CONFIG and EXTRA_FIXED_RANDCONFIG in the following way:
EXTRA_XEN_CONFIG:
CONFIG_1=n
CONFIG_2=n
...
2. Override in arch-specific KConfig:
CONFIG_1:
default n
Each option doesn't work for me fully.
Could you please suggest other options or more correct way?
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
xen/arch/riscv/include/asm/asm_defns.h | 44 +++++++++++++++++
xen/arch/riscv/include/asm/grant_table.h | 57 ++++++++++++++++++++++
xen/arch/riscv/include/asm/guest_atomics.h | 16 +++++-
xen/arch/riscv/include/asm/livepatch.h | 0
xen/arch/riscv/include/asm/mm.h | 5 ++
xen/arch/riscv/include/asm/p2m.h | 24 +++++++++
xen/arch/riscv/include/asm/page.h | 16 ++++++
xen/arch/riscv/include/asm/perfc_defn.h | 0
xen/arch/riscv/mm.c | 33 +++++++++++++
9 files changed, 194 insertions(+), 1 deletion(-)
create mode 100644 xen/arch/riscv/include/asm/asm_defns.h
create mode 100644 xen/arch/riscv/include/asm/livepatch.h
create mode 100644 xen/arch/riscv/include/asm/perfc_defn.h
diff --git a/xen/arch/riscv/include/asm/asm_defns.h
b/xen/arch/riscv/include/asm/asm_defns.h
new file mode 100644
index 0000000000..dd0511a9c6
--- /dev/null
+++ b/xen/arch/riscv/include/asm/asm_defns.h
@@ -0,0 +1,44 @@
+#ifndef __ARM_ASM_DEFNS_H__
+#define __ARM_ASM_DEFNS_H__
+
+#ifndef COMPILE_OFFSETS
+/* NB. Auto-generated from arch/.../asm-offsets.c */
+#include <asm/asm-offsets.h>
+#endif
+#include <asm/processor.h>
+
+/* Macros for generic assembly code */
+#if defined(CONFIG_RISCV_32)
+# define __OP32
+# define ASM_REG(index) asm("r" # index)
+#elif defined(CONFIG_RISCV_64)
+# define __OP32 "w"
+/*
+ * Clang < 8.0 doesn't support register alllocation using the syntax rN.
+ * See https://reviews.llvm.org/rL328829.
+ */
+# define ASM_REG(index) asm("x" # index)
+#else
+# error "unknown ARM variant"
+#endif
+
+#define RODATA_STR(label, msg) \
+.pushsection .rodata.str, "aMS", %progbits, 1 ; \
+label: .asciz msg; \
+.popsection
+
+#define ASM_INT(label, val) \
+ .p2align 2; \
+label: .long (val); \
+ .size label, . - label; \
+ .type label, %object
+
+#endif /* __ARM_ASM_DEFNS_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/arch/riscv/include/asm/grant_table.h
b/xen/arch/riscv/include/asm/grant_table.h
index 600fb10669..8b7880d3ed 100644
--- a/xen/arch/riscv/include/asm/grant_table.h
+++ b/xen/arch/riscv/include/asm/grant_table.h
@@ -1,4 +1,61 @@
#ifndef __ASM_RISCV_GRANTTABLE_H__
#define __ASM_RISCV_GRANTTABLE_H__
+#define INITIAL_NR_GRANT_FRAMES 1U
+
+#define gnttab_shared_page(t, i) virt_to_page((t)->shared_raw[i])
+
+#define gnttab_status_page(t, i) virt_to_page((t)->status[i])
+
+#define gnttab_shared_gfn(d, t, i) \
+ page_get_xenheap_gfn(gnttab_shared_page(t, i))
+
+#define gnttab_status_gfn(d, t, i) \
+ page_get_xenheap_gfn(gnttab_status_page(t, i))
+
+#define gnttab_set_frame_gfn(gt, st, idx, gfn, mfn) \
+ (gfn_eq(gfn, INVALID_GFN) \
+ ? guest_physmap_remove_page((gt)->domain, \
+ gnttab_get_frame_gfn(gt, st, idx), \
+ mfn, 0) \
+ : 0)
+
+#define gnttab_get_frame_gfn(gt, st, idx) ({ \
+ (st) ? gnttab_status_gfn(NULL, gt, idx) \
+ : gnttab_shared_gfn(NULL, gt, idx); \
+})
+
+#define gnttab_need_iommu_mapping(d) \
+ (is_domain_direct_mapped(d) && is_iommu_enabled(d))
+
+static inline bool gnttab_release_host_mappings(const struct domain *d)
+{
+ BUG();
+}
+
+static inline void gnttab_mark_dirty(struct domain *d, mfn_t mfn)
+{
+#ifndef NDEBUG
+ printk_once(XENLOG_G_WARNING "gnttab_mark_dirty not implemented yet\n");
+#endif
+}
+
+static inline void gnttab_clear_flags(struct domain *d,
+ unsigned int mask, uint16_t *addr)
+{
+ BUG();
+}
+
+static inline bool gnttab_host_mapping_get_page_type(bool ro,
+ const struct domain *ld,
+ const struct domain *rd)
+{
+ return false;
+}
+
+int create_grant_host_mapping(uint64_t gpaddr, mfn_t frame,
+ unsigned int flags, unsigned int cache_flags);
+int replace_grant_host_mapping(uint64_t gpaddr, mfn_t frame,
+ uint64_t new_gpaddr, unsigned int flags);
+
#endif /* __ASM_RISCV_GRANTTABLE_H__ */
\ No newline at end of file
diff --git a/xen/arch/riscv/include/asm/guest_atomics.h
b/xen/arch/riscv/include/asm/guest_atomics.h
index 71b0b11a25..8c8fd647d6 100644
--- a/xen/arch/riscv/include/asm/guest_atomics.h
+++ b/xen/arch/riscv/include/asm/guest_atomics.h
@@ -35,9 +35,23 @@ guest_testop(test_and_change_bit)
#undef guest_testop
-
#define guest_test_bit(d, nr, p) ((void)(d), test_bit(nr, p))
+#define guest_cmpxchg(d, ptr, o, n) \
+ ((__typeof__(*(ptr)))__guest_cmpxchg(d, ptr, \
+ (unsigned long)(o),\
+ (unsigned long)(n),\
+ sizeof (*(ptr))))
+
+static always_inline unsigned long __guest_cmpxchg(struct domain *d,
+ volatile void *ptr,
+ unsigned long old,
+ unsigned long new,
+ unsigned int size)
+{
+ BUG();
+}
+
#endif /* __ASM_RISCV_GUEST_ATOMICS_H */
/*
* Local variables:
diff --git a/xen/arch/riscv/include/asm/livepatch.h
b/xen/arch/riscv/include/asm/livepatch.h
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/xen/arch/riscv/include/asm/mm.h b/xen/arch/riscv/include/asm/mm.h
index 1d464afec9..37916f9be7 100644
--- a/xen/arch/riscv/include/asm/mm.h
+++ b/xen/arch/riscv/include/asm/mm.h
@@ -276,4 +276,9 @@ void setup_initial_pagetables(void);
void enable_mmu(void);
void cont_after_mmu_is_enabled(void);
+static inline gfn_t page_get_xenheap_gfn(const struct page_info *p)
+{
+ BUG();
+}
+
#endif /* _ASM_RISCV_MM_H */
diff --git a/xen/arch/riscv/include/asm/p2m.h b/xen/arch/riscv/include/asm/p2m.h
index 993aec6d2c..8537ce12fd 100644
--- a/xen/arch/riscv/include/asm/p2m.h
+++ b/xen/arch/riscv/include/asm/p2m.h
@@ -29,6 +29,28 @@ typedef enum {
p2m_max_real_type, /* Types after this won't be store in the p2m */
} p2m_type_t;
+/* We use bitmaps and mask to handle groups of types */
+#define p2m_to_mask(_t) (1UL << (_t))
+
+/* RAM types, which map to real machine frames */
+#define P2M_RAM_TYPES (p2m_to_mask(p2m_ram_rw) | \
+ p2m_to_mask(p2m_ram_ro))
+
+/* Grant mapping types, which map to a real frame in another VM */
+#define P2M_GRANT_TYPES (p2m_to_mask(p2m_grant_map_rw) | \
+ p2m_to_mask(p2m_grant_map_ro))
+
+/* Foreign mappings types */
+#define P2M_FOREIGN_TYPES (p2m_to_mask(p2m_map_foreign_rw) | \
+ p2m_to_mask(p2m_map_foreign_ro))
+
+/* Useful predicates */
+#define p2m_is_ram(_t) (p2m_to_mask(_t) & P2M_RAM_TYPES)
+#define p2m_is_foreign(_t) (p2m_to_mask(_t) & P2M_FOREIGN_TYPES)
+#define p2m_is_any_ram(_t) (p2m_to_mask(_t) & \
+ (P2M_RAM_TYPES | P2M_GRANT_TYPES | \
+ P2M_FOREIGN_TYPES))
+
#include <xen/p2m-common.h>
static inline int get_page_and_type(struct page_info *page,
@@ -102,4 +124,6 @@ static inline void p2m_altp2m_check(struct vcpu *v,
uint16_t idx)
/* Not supported on RISCV. */
}
+bool is_iomem_page(mfn_t mfn);
+
#endif /* __ASM_RISCV_P2M_H__ */
\ No newline at end of file
diff --git a/xen/arch/riscv/include/asm/page.h
b/xen/arch/riscv/include/asm/page.h
index abbae75aaf..52eb517669 100644
--- a/xen/arch/riscv/include/asm/page.h
+++ b/xen/arch/riscv/include/asm/page.h
@@ -83,6 +83,22 @@ static inline void flush_page_to_ram(unsigned long mfn, bool
sync_icache)
BUG();
}
+static inline int clean_dcache_va_range(const void *p, unsigned long size)
+{
+ BUG();
+}
+
+static inline int invalidate_dcache_va_range(const void *p, unsigned long size)
+{
+ BUG();
+}
+
+static inline int clean_and_invalidate_dcache_va_range
+ (const void *p, unsigned long size)
+{
+ BUG();
+}
+
#endif /* __ASSEMBLY__ */
#endif /* _ASM_RISCV_PAGE_H */
diff --git a/xen/arch/riscv/include/asm/perfc_defn.h
b/xen/arch/riscv/include/asm/perfc_defn.h
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/xen/arch/riscv/mm.c b/xen/arch/riscv/mm.c
index 0f40641db7..696a1e8448 100644
--- a/xen/arch/riscv/mm.c
+++ b/xen/arch/riscv/mm.c
@@ -323,3 +323,36 @@ int map_pages_to_xen(unsigned long virt,
assert_failed(__func__);
return -1;
}
+
+bool is_iomem_page(mfn_t mfn)
+{
+ BUG();
+}
+
+int replace_grant_host_mapping(uint64_t gpaddr, mfn_t frame,
+ uint64_t new_gpaddr, unsigned int flags)
+{
+ BUG();
+}
+
+int create_grant_host_mapping(uint64_t gpaddr, mfn_t frame,
+ unsigned int flags, unsigned int cache_flags)
+{
+ BUG();
+}
+
+struct domain *page_get_owner_and_reference(struct page_info *page)
+{
+ BUG();
+}
+
+void share_xen_page_with_guest(struct page_info *page, struct domain *d,
+ enum XENSHARE_flags flags)
+{
+ BUG();
+}
+
+bool get_page(struct page_info *page, const struct domain *domain)
+{
+ BUG();
+}
\ No newline at end of file
--
2.41.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |