* [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code
@ 2016-05-03 11:48 Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
` (10 more replies)
0 siblings, 11 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Hi Andrew et al,
This is 5th attempt to make mainly x86 arch code consistent
with other architectures.
Changes since v4:
- single instead of multiple pages allocation bug fixed in x86 ioremap();
- style fixes squashed into code movements for lib/x86/asm/page.h and
lib/x86/asm/barrier.h;
- #ifndef __ASSEMBLY__ added to lib/x86/asm/page.h;
Changes since v3:
- x86 PAGE_* constants and PTE_* flags cleaned up;
- missing Reviewed-bys restored;
- missing headers to lib/x86/asm/page.h and lib/x86/asm/barriers.h added
(I did not remove already given Reviewed-bys from these);
Changes since v2:
- x86 ioremap() address arithmetics nonsense fixed;
- x86 virt_to_phys() and phys_to_virt() implementations left intact;
- separate overrides of virt_to_phys() and phys_to_virt() added;
- unsigned long size specifier removed from PAGE_SIZE constant;
Changes since v1:
- arm compilation error fixed;
- disabling memory re-ordering for generic memory barriers added;
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Alexander Gordeev (11):
Remove unused and unnecessary PHYS32 macro
Move phys_addr_t type definition to lib/libcflat.h
x86: Introduce lib/x86/asm/page.h
x86: Introduce lib/x86/asm/io.h
x86: Introduce lib/x86/asm/barrier.h
io: Separate overrides of virt_to_phys() and phys_to_virt()
io: Disallow memory re-ordering for generic memory barriers
x86: Cleanup PAGE_* constants
x86: Cleanup PTE_* flags
io: Make ioremap() prototype conform to Linux one
x86: io: Factor out ioremap()
arm/selftest.c | 1 -
lib/alloc.h | 5 -----
lib/arm/asm/page.h | 2 --
lib/asm-generic/io.h | 13 +++++++++----
lib/libcflat.h | 2 ++
lib/powerpc/asm/setup.h | 1 -
lib/ppc64/asm/io.h | 2 ++
lib/x86/asm/barrier.h | 13 +++++++++++++
lib/x86/{ => asm}/io.h | 18 +++++++++++++++--
lib/x86/asm/page.h | 44 +++++++++++++++++++++++++++++++++++++++++
lib/x86/asm/pci.h | 2 +-
lib/x86/io.c | 12 +++++++++++-
lib/x86/smp.h | 4 ----
lib/x86/vm.c | 21 ++------------------
lib/x86/vm.h | 25 ++----------------------
x86/access.c | 52 ++++++++++++++++++++-----------------------------
x86/eventinj.c | 7 +------
x86/hyperv.c | 1 +
x86/hyperv.h | 1 -
x86/hyperv_stimer.c | 2 +-
x86/hyperv_synic.c | 1 -
x86/init.c | 2 +-
x86/kvmclock.c | 1 +
x86/svm.c | 1 -
x86/vmexit.c | 11 ++---------
x86/vmx.c | 1 -
x86/vmx.h | 2 +-
x86/vmx_tests.c | 1 -
28 files changed, 131 insertions(+), 117 deletions(-)
create mode 100644 lib/x86/asm/barrier.h
rename lib/x86/{ => asm}/io.h (74%)
create mode 100644 lib/x86/asm/page.h
--
1.8.3.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 01/11] Remove unused and unnecessary PHYS32 macro
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 02/11] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
` (9 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Suggested-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/alloc.h | 4 ----
1 file changed, 4 deletions(-)
diff --git a/lib/alloc.h b/lib/alloc.h
index 7a73c18..0b4b4bd 100644
--- a/lib/alloc.h
+++ b/lib/alloc.h
@@ -58,11 +58,7 @@ static inline void *memalign(size_t alignment, size_t size)
return alloc_ops->memalign(alignment, size);
}
-#ifdef PHYS32
-typedef u32 phys_addr_t;
-#else
typedef u64 phys_addr_t;
-#endif
#define INVALID_PHYS_ADDR (~(phys_addr_t)0)
/*
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 02/11] Move phys_addr_t type definition to lib/libcflat.h
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 03/11] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
` (8 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
This change leads to removing '#include <alloc.h>'s from
several places that only included alloc.h to get the typedef.
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Suggested-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
arm/selftest.c | 1 -
lib/alloc.h | 1 -
lib/arm/asm/page.h | 2 --
lib/libcflat.h | 2 ++
lib/powerpc/asm/setup.h | 1 -
5 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/arm/selftest.c b/arm/selftest.c
index 75dc91f..a8ae191 100644
--- a/arm/selftest.c
+++ b/arm/selftest.c
@@ -7,7 +7,6 @@
*/
#include <libcflat.h>
#include <util.h>
-#include <alloc.h>
#include <devicetree.h>
#include <asm/setup.h>
#include <asm/ptrace.h>
diff --git a/lib/alloc.h b/lib/alloc.h
index 0b4b4bd..c12bd15 100644
--- a/lib/alloc.h
+++ b/lib/alloc.h
@@ -58,7 +58,6 @@ static inline void *memalign(size_t alignment, size_t size)
return alloc_ops->memalign(alignment, size);
}
-typedef u64 phys_addr_t;
#define INVALID_PHYS_ADDR (~(phys_addr_t)0)
/*
diff --git a/lib/arm/asm/page.h b/lib/arm/asm/page.h
index df76969..3802641 100644
--- a/lib/arm/asm/page.h
+++ b/lib/arm/asm/page.h
@@ -16,8 +16,6 @@
#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
-#include <alloc.h>
-
typedef u64 pteval_t;
typedef u64 pmdval_t;
typedef u64 pgdval_t;
diff --git a/lib/libcflat.h b/lib/libcflat.h
index b58a8a1..f2ec33f 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -60,6 +60,8 @@ typedef _Bool bool;
#define PRIx64 __PRI64_PREFIX "x"
#define PRIxPTR __PRIPTR_PREFIX "x"
+typedef u64 phys_addr_t;
+
extern void puts(const char *s);
extern void exit(int code);
extern void abort(void);
diff --git a/lib/powerpc/asm/setup.h b/lib/powerpc/asm/setup.h
index 29a6d7d..b1e1e5a 100644
--- a/lib/powerpc/asm/setup.h
+++ b/lib/powerpc/asm/setup.h
@@ -6,7 +6,6 @@
* This work is licensed under the terms of the GNU LGPL, version 2.
*/
#include <libcflat.h>
-#include <alloc.h> /* phys_addr_t */
#define NR_CPUS 8 /* arbitrarily set for now */
extern u32 cpus[NR_CPUS];
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 03/11] x86: Introduce lib/x86/asm/page.h
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 02/11] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 04/11] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
` (7 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Make x86 consistent with other architectures and put
memory page specific defines to lib/x86/asm/page.h
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/page.h | 33 +++++++++++++++++++++++++++++++++
lib/x86/vm.c | 17 -----------------
lib/x86/vm.h | 14 +-------------
3 files changed, 34 insertions(+), 30 deletions(-)
create mode 100644 lib/x86/asm/page.h
diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
new file mode 100644
index 0000000..d4580b4
--- /dev/null
+++ b/lib/x86/asm/page.h
@@ -0,0 +1,33 @@
+#ifndef _ASM_X86_PAGE_H_
+#define _ASM_X86_PAGE_H_
+/*
+ * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev <agordeev@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.
+ */
+
+
+#define PAGE_SIZE 4096ul
+#ifdef __x86_64__
+#define LARGE_PAGE_SIZE (512 * PAGE_SIZE)
+#else
+#define LARGE_PAGE_SIZE (1024 * PAGE_SIZE)
+#endif
+
+#define PTE_PRESENT (1ull << 0)
+#define PTE_WRITE (1ull << 1)
+#define PTE_USER (1ull << 2)
+#define PTE_PSE (1ull << 7)
+#define PTE_ADDR (0xffffffffff000ull)
+
+#ifdef __x86_64__
+#define PAGE_LEVEL 4
+#define PGDIR_WIDTH 9
+#define PGDIR_MASK 511
+#else
+#define PAGE_LEVEL 2
+#define PGDIR_WIDTH 10
+#define PGDIR_MASK 1023
+#endif
+
+#endif
diff --git a/lib/x86/vm.c b/lib/x86/vm.c
index 7ce7bbc..9c94ca5 100644
--- a/lib/x86/vm.c
+++ b/lib/x86/vm.c
@@ -2,13 +2,6 @@
#include "vm.h"
#include "libcflat.h"
-#define PAGE_SIZE 4096ul
-#ifdef __x86_64__
-#define LARGE_PAGE_SIZE (512 * PAGE_SIZE)
-#else
-#define LARGE_PAGE_SIZE (1024 * PAGE_SIZE)
-#endif
-
static void *free = 0;
static void *vfree_top = 0;
@@ -44,16 +37,6 @@ void free_page(void *page)
extern char edata;
static unsigned long end_of_memory;
-#ifdef __x86_64__
-#define PAGE_LEVEL 4
-#define PGDIR_WIDTH 9
-#define PGDIR_MASK 511
-#else
-#define PAGE_LEVEL 2
-#define PGDIR_WIDTH 10
-#define PGDIR_MASK 1023
-#endif
-
unsigned long *install_pte(unsigned long *cr3,
int pte_level,
void *virt,
diff --git a/lib/x86/vm.h b/lib/x86/vm.h
index 28794d7..72f84e6 100644
--- a/lib/x86/vm.h
+++ b/lib/x86/vm.h
@@ -2,19 +2,7 @@
#define VM_H
#include "processor.h"
-
-#define PAGE_SIZE 4096ul
-#ifdef __x86_64__
-#define LARGE_PAGE_SIZE (512 * PAGE_SIZE)
-#else
-#define LARGE_PAGE_SIZE (1024 * PAGE_SIZE)
-#endif
-
-#define PTE_PRESENT (1ull << 0)
-#define PTE_PSE (1ull << 7)
-#define PTE_WRITE (1ull << 1)
-#define PTE_USER (1ull << 2)
-#define PTE_ADDR (0xffffffffff000ull)
+#include "asm/page.h"
void setup_vm();
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 04/11] x86: Introduce lib/x86/asm/io.h
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (2 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 03/11] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 05/11] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
` (6 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Make x86 consistent with other architectures and put
IO specific defines to lib/x86/asm/io.h
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/{ => asm}/io.h | 14 ++++++++++++--
lib/x86/asm/pci.h | 2 +-
lib/x86/io.c | 2 +-
lib/x86/vm.h | 11 +----------
x86/eventinj.c | 7 +------
x86/hyperv.c | 1 +
x86/hyperv.h | 1 -
x86/hyperv_stimer.c | 1 -
x86/hyperv_synic.c | 1 -
x86/init.c | 2 +-
x86/svm.c | 1 -
x86/vmexit.c | 1 -
x86/vmx.c | 1 -
x86/vmx_tests.c | 1 -
14 files changed, 18 insertions(+), 28 deletions(-)
rename lib/x86/{ => asm}/io.h (79%)
diff --git a/lib/x86/io.h b/lib/x86/asm/io.h
similarity index 79%
rename from lib/x86/io.h
rename to lib/x86/asm/io.h
index bd6341c..c944df4 100644
--- a/lib/x86/io.h
+++ b/lib/x86/asm/io.h
@@ -1,5 +1,5 @@
-#ifndef IO_H
-#define IO_H
+#ifndef _ASM_X86_IO_H_
+#define _ASM_X86_IO_H_
static inline unsigned char inb(unsigned short port)
{
@@ -37,4 +37,14 @@ static inline void outl(unsigned int value, unsigned short port)
asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
}
+static inline unsigned long virt_to_phys(const void *virt)
+{
+ return (unsigned long)virt;
+}
+
+static inline void *phys_to_virt(unsigned long phys)
+{
+ return (void *)phys;
+}
+
#endif
diff --git a/lib/x86/asm/pci.h b/lib/x86/asm/pci.h
index 4ec20e1..cddde41 100644
--- a/lib/x86/asm/pci.h
+++ b/lib/x86/asm/pci.h
@@ -7,7 +7,7 @@
*/
#include "libcflat.h"
#include "pci.h"
-#include "x86/io.h"
+#include "x86/asm/io.h"
static inline uint32_t pci_config_read(pcidevaddr_t dev, uint8_t reg)
{
diff --git a/lib/x86/io.c b/lib/x86/io.c
index d3b971e..d396d42 100644
--- a/lib/x86/io.c
+++ b/lib/x86/io.c
@@ -1,6 +1,6 @@
#include "libcflat.h"
#include "smp.h"
-#include "io.h"
+#include "asm/io.h"
#ifndef USE_SERIAL
#define USE_SERIAL
#endif
diff --git a/lib/x86/vm.h b/lib/x86/vm.h
index 72f84e6..6a4384f 100644
--- a/lib/x86/vm.h
+++ b/lib/x86/vm.h
@@ -3,6 +3,7 @@
#include "processor.h"
#include "asm/page.h"
+#include "asm/io.h"
void setup_vm();
@@ -27,14 +28,4 @@ unsigned long *install_large_page(unsigned long *cr3,unsigned long phys,
void *virt);
unsigned long *install_page(unsigned long *cr3, unsigned long phys, void *virt);
-static inline unsigned long virt_to_phys(const void *virt)
-{
- return (unsigned long)virt;
-}
-
-static inline void *phys_to_virt(unsigned long phys)
-{
- return (void *)phys;
-}
-
#endif
diff --git a/x86/eventinj.c b/x86/eventinj.c
index 57c2a2d..84dfe71 100644
--- a/x86/eventinj.c
+++ b/x86/eventinj.c
@@ -16,11 +16,6 @@ static inline void io_delay(void)
{
}
-static inline void outl(int addr, int val)
-{
- asm volatile ("outl %1, %w0" : : "d" (addr), "a" (val));
-}
-
void apic_self_ipi(u8 v)
{
apic_icr_write(APIC_DEST_SELF | APIC_DEST_PHYSICAL | APIC_DM_FIXED |
@@ -32,7 +27,7 @@ void apic_self_nmi(void)
apic_icr_write(APIC_DEST_PHYSICAL | APIC_DM_NMI | APIC_INT_ASSERT, 0);
}
-#define flush_phys_addr(__s) outl(0xe4, __s)
+#define flush_phys_addr(__s) outl(__s, 0xe4)
#define flush_stack() do { \
int __l; \
flush_phys_addr(virt_to_phys(&__l)); \
diff --git a/x86/hyperv.c b/x86/hyperv.c
index 824773d..2511aa2 100644
--- a/x86/hyperv.c
+++ b/x86/hyperv.c
@@ -1,4 +1,5 @@
#include "hyperv.h"
+#include "asm/io.h"
static void synic_ctl(u8 ctl, u8 vcpu_id, u8 sint)
{
diff --git a/x86/hyperv.h b/x86/hyperv.h
index faf931b..434a933 100644
--- a/x86/hyperv.h
+++ b/x86/hyperv.h
@@ -3,7 +3,6 @@
#include "libcflat.h"
#include "processor.h"
-#include "io.h"
#define HYPERV_CPUID_FEATURES 0x40000003
diff --git a/x86/hyperv_stimer.c b/x86/hyperv_stimer.c
index bf2e429..9a971ef 100644
--- a/x86/hyperv_stimer.c
+++ b/x86/hyperv_stimer.c
@@ -5,7 +5,6 @@
#include "vm.h"
#include "apic.h"
#include "desc.h"
-#include "io.h"
#include "smp.h"
#include "atomic.h"
#include "hyperv.h"
diff --git a/x86/hyperv_synic.c b/x86/hyperv_synic.c
index 6e08894..4bd07c3 100644
--- a/x86/hyperv_synic.c
+++ b/x86/hyperv_synic.c
@@ -5,7 +5,6 @@
#include "vm.h"
#include "apic.h"
#include "desc.h"
-#include "io.h"
#include "smp.h"
#include "atomic.h"
#include "hyperv.h"
diff --git a/x86/init.c b/x86/init.c
index 344dc1c..f47d671 100644
--- a/x86/init.c
+++ b/x86/init.c
@@ -1,6 +1,6 @@
#include "libcflat.h"
#include "apic.h"
-#include "io.h"
+#include "asm/io.h"
#define KBD_CCMD_READ_OUTPORT 0xD0 /* read output port */
#define KBD_CCMD_WRITE_OUTPORT 0xD1 /* write output port */
diff --git a/x86/svm.c b/x86/svm.c
index 934b2ae..401ff6c 100644
--- a/x86/svm.c
+++ b/x86/svm.c
@@ -6,7 +6,6 @@
#include "vm.h"
#include "smp.h"
#include "types.h"
-#include "io.h"
/* for the nested page table*/
u64 *pml4e;
diff --git a/x86/vmexit.c b/x86/vmexit.c
index 9e04975..db7dbd8 100644
--- a/x86/vmexit.c
+++ b/x86/vmexit.c
@@ -6,7 +6,6 @@
#include "x86/vm.h"
#include "x86/desc.h"
#include "x86/acpi.h"
-#include "x86/io.h"
struct test {
void (*func)(void);
diff --git a/x86/vmx.c b/x86/vmx.c
index 6618008..411ed32 100644
--- a/x86/vmx.c
+++ b/x86/vmx.c
@@ -35,7 +35,6 @@
#include "vmx.h"
#include "msr.h"
#include "smp.h"
-#include "io.h"
u64 *vmxon_region;
struct vmcs *vmcs_root;
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index 71c571c..e83c8a2 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -7,7 +7,6 @@
#include "msr.h"
#include "processor.h"
#include "vm.h"
-#include "io.h"
#include "fwcfg.h"
#include "isr.h"
#include "apic.h"
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 05/11] x86: Introduce lib/x86/asm/barrier.h
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (3 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 04/11] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt() Alexander Gordeev
` (5 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Make x86 consistent with other architectures and put
memory barrier defines to lib/x86/asm/barrier.h
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/barrier.h | 13 +++++++++++++
lib/x86/smp.h | 4 ----
x86/hyperv_stimer.c | 1 +
x86/kvmclock.c | 1 +
4 files changed, 15 insertions(+), 4 deletions(-)
create mode 100644 lib/x86/asm/barrier.h
diff --git a/lib/x86/asm/barrier.h b/lib/x86/asm/barrier.h
new file mode 100644
index 0000000..d602a2c
--- /dev/null
+++ b/lib/x86/asm/barrier.h
@@ -0,0 +1,13 @@
+#ifndef _ASM_X86_BARRIER_H_
+#define _ASM_X86_BARRIER_H_
+/*
+ * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev <agordeev@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.
+ */
+
+#define mb() asm volatile("mfence":::"memory")
+#define rmb() asm volatile("lfence":::"memory")
+#define wmb() asm volatile("sfence":::"memory")
+
+#endif
diff --git a/lib/x86/smp.h b/lib/x86/smp.h
index 566018f..afabac8 100644
--- a/lib/x86/smp.h
+++ b/lib/x86/smp.h
@@ -2,10 +2,6 @@
#define __SMP_H
#include <asm/spinlock.h>
-#define mb() asm volatile("mfence":::"memory")
-#define rmb() asm volatile("lfence":::"memory")
-#define wmb() asm volatile("sfence" ::: "memory")
-
void smp_init(void);
int cpu_count(void);
diff --git a/x86/hyperv_stimer.c b/x86/hyperv_stimer.c
index 9a971ef..6382938 100644
--- a/x86/hyperv_stimer.c
+++ b/x86/hyperv_stimer.c
@@ -8,6 +8,7 @@
#include "smp.h"
#include "atomic.h"
#include "hyperv.h"
+#include "asm/barrier.h"
#define MAX_CPUS 4
diff --git a/x86/kvmclock.c b/x86/kvmclock.c
index 327e60d..208d43c 100644
--- a/x86/kvmclock.c
+++ b/x86/kvmclock.c
@@ -3,6 +3,7 @@
#include "atomic.h"
#include "processor.h"
#include "kvmclock.h"
+#include "asm/barrier.h"
#define unlikely(x) __builtin_expect(!!(x), 0)
#define likely(x) __builtin_expect(!!(x), 1)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt()
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (4 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 05/11] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 07/11] io: Disallow memory re-ordering for generic memory barriers Alexander Gordeev
` (4 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Generic implementations of virt_to_phys() and phys_to_virt()
are currently covered by a single "virt_to_phys" macro.
Introduce additional macro "phys_to_virt" to allow separate
overrides.
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/asm-generic/io.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
index 931415a..3585ac0 100644
--- a/lib/asm-generic/io.h
+++ b/lib/asm-generic/io.h
@@ -165,7 +165,9 @@ static inline unsigned long virt_to_phys(volatile void *address)
{
return __pa((unsigned long)address);
}
+#endif
+#ifndef phys_to_virt
static inline void *phys_to_virt(unsigned long address)
{
return __va(address);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 07/11] io: Disallow memory re-ordering for generic memory barriers
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (5 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt() Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
` (3 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Suggested-by: Thomas Huth <thuth@redhat.com>
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/asm-generic/io.h | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
index 3585ac0..1834720 100644
--- a/lib/asm-generic/io.h
+++ b/lib/asm-generic/io.h
@@ -127,11 +127,14 @@ static inline u64 __bswap64(u64 x)
({ u64 __r = !__cpu_is_be() ? __bswap64(x) : ((u64)x); __r; })
#define cpu_to_be64 be64_to_cpu
+#ifndef mb
+#define mb() asm volatile("":::"memory")
+#endif
#ifndef rmb
-#define rmb() do { } while (0)
+#define rmb() asm volatile("":::"memory")
#endif
#ifndef wmb
-#define wmb() do { } while (0)
+#define wmb() asm volatile("":::"memory")
#endif
#define readb(addr) \
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 08/11] x86: Cleanup PAGE_* constants
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (6 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 07/11] io: Disallow memory re-ordering for generic memory barriers Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 12:23 ` Andrew Jones
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 09/11] x86: Cleanup PTE_* flags Alexander Gordeev
` (2 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/page.h | 10 +++++++++-
x86/access.c | 4 +---
x86/vmx.h | 2 +-
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
index d4580b4..916462d 100644
--- a/lib/x86/asm/page.h
+++ b/lib/x86/asm/page.h
@@ -7,7 +7,14 @@
*/
-#define PAGE_SIZE 4096ul
+#include <linux/const.h>
+
+#define PAGE_SHIFT 12
+#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
+#define PAGE_MASK (~(PAGE_SIZE-1))
+
+#ifndef __ASSEMBLY__
+
#ifdef __x86_64__
#define LARGE_PAGE_SIZE (512 * PAGE_SIZE)
#else
@@ -30,4 +37,5 @@
#define PGDIR_MASK 1023
#endif
+#endif /* !__ASSEMBLY__ */
#endif
diff --git a/x86/access.c b/x86/access.c
index 4acaee5..aaf805d 100644
--- a/x86/access.c
+++ b/x86/access.c
@@ -2,6 +2,7 @@
#include "libcflat.h"
#include "desc.h"
#include "processor.h"
+#include "asm/page.h"
#define smp_id() 0
@@ -15,9 +16,6 @@ static int cpuid_7_ebx;
static int cpuid_7_ecx;
static int invalid_mask;
-#define PAGE_SIZE ((pt_element_t)4096)
-#define PAGE_MASK (~(PAGE_SIZE-1))
-
#define PT_BASE_ADDR_MASK ((pt_element_t)((((pt_element_t)1 << 40) - 1) & PAGE_MASK))
#define PT_PSE_BASE_ADDR_MASK (PT_BASE_ADDR_MASK & ~(1ull << 21))
diff --git a/x86/vmx.h b/x86/vmx.h
index d6bc217..27f3451 100644
--- a/x86/vmx.h
+++ b/x86/vmx.h
@@ -4,6 +4,7 @@
#include "libcflat.h"
#include "processor.h"
#include "bitops.h"
+#include "asm/page.h"
struct vmcs {
u32 revision_id; /* vmcs revision identifier */
@@ -476,7 +477,6 @@ enum Ctrl1 {
#define EPT_PGDIR_ENTRIES (1 << EPT_PGDIR_WIDTH)
#define EPT_LEVEL_SHIFT(level) (((level)-1) * EPT_PGDIR_WIDTH + 12)
#define EPT_ADDR_MASK GENMASK_ULL(51, 12)
-#define PAGE_MASK (~(PAGE_SIZE-1))
#define PAGE_MASK_2M (~(PAGE_SIZE_2M-1))
#define EPT_VLT_RD 1
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 09/11] x86: Cleanup PTE_* flags
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (7 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 12:46 ` Andrew Jones
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 10/11] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap() Alexander Gordeev
10 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/page.h | 3 +++
lib/x86/vm.c | 4 ++--
x86/access.c | 48 ++++++++++++++++++++----------------------------
3 files changed, 25 insertions(+), 30 deletions(-)
diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
index 916462d..ac2a9c3 100644
--- a/lib/x86/asm/page.h
+++ b/lib/x86/asm/page.h
@@ -24,7 +24,10 @@
#define PTE_PRESENT (1ull << 0)
#define PTE_WRITE (1ull << 1)
#define PTE_USER (1ull << 2)
+#define PTE_ACCESSED (1ull << 5)
+#define PTE_DIRTY (1ull << 6)
#define PTE_PSE (1ull << 7)
+#define PTE_NX (1ull << 63)
#define PTE_ADDR (0xffffffffff000ull)
#ifdef __x86_64__
diff --git a/lib/x86/vm.c b/lib/x86/vm.c
index 9c94ca5..2018a83 100644
--- a/lib/x86/vm.c
+++ b/lib/x86/vm.c
@@ -58,7 +58,7 @@ unsigned long *install_pte(unsigned long *cr3,
memset(new_pt, 0, PAGE_SIZE);
pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE | PTE_USER;
}
- pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
+ pt = phys_to_virt(pt[offset] & PTE_ADDR);
}
offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
pt[offset] = pte;
@@ -78,7 +78,7 @@ unsigned long *get_pte(unsigned long *cr3, void *virt)
return NULL;
if (level == 2 && (pte & PTE_PSE))
return &pt[offset];
- pt = phys_to_virt(pte & 0xffffffffff000ull);
+ pt = phys_to_virt(pte & PTE_ADDR);
}
offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
return &pt[offset];
diff --git a/x86/access.c b/x86/access.c
index aaf805d..b6127aa 100644
--- a/x86/access.c
+++ b/x86/access.c
@@ -19,14 +19,6 @@ static int invalid_mask;
#define PT_BASE_ADDR_MASK ((pt_element_t)((((pt_element_t)1 << 40) - 1) & PAGE_MASK))
#define PT_PSE_BASE_ADDR_MASK (PT_BASE_ADDR_MASK & ~(1ull << 21))
-#define PT_PRESENT_MASK ((pt_element_t)1 << 0)
-#define PT_WRITABLE_MASK ((pt_element_t)1 << 1)
-#define PT_USER_MASK ((pt_element_t)1 << 2)
-#define PT_ACCESSED_MASK ((pt_element_t)1 << 5)
-#define PT_DIRTY_MASK ((pt_element_t)1 << 6)
-#define PT_PSE_MASK ((pt_element_t)1 << 7)
-#define PT_NX_MASK ((pt_element_t)1 << 63)
-
#define CR0_WP_MASK (1UL << 16)
#define CR4_SMEP_MASK (1UL << 20)
@@ -210,10 +202,10 @@ void set_cr4_smep(int smep)
return;
if (smep)
- ptl2[2] &= ~PT_USER_MASK;
+ ptl2[2] &= ~PTE_USER;
write_cr4(cr4);
if (!smep)
- ptl2[2] |= PT_USER_MASK;
+ ptl2[2] |= PTE_USER;
}
void set_cr4_pke(int pke)
@@ -362,9 +354,9 @@ pt_element_t ac_test_permissions(ac_test_t *at, unsigned flags, bool writable,
}
if (!at->expected_fault) {
- expected |= PT_ACCESSED_MASK;
+ expected |= PTE_ACCESSED;
if (F(AC_ACCESS_WRITE))
- expected |= PT_DIRTY_MASK;
+ expected |= PTE_DIRTY;
}
return expected;
@@ -385,7 +377,7 @@ void ac_emulate_access(ac_test_t *at, unsigned flags)
at->expected_error |= PFERR_FETCH_MASK;
if (!F(AC_PDE_ACCESSED))
- at->ignore_pde = PT_ACCESSED_MASK;
+ at->ignore_pde = PTE_ACCESSED;
pde_valid = F(AC_PDE_PRESENT)
&& !F(AC_PDE_BIT51) && !F(AC_PDE_BIT13)
@@ -411,7 +403,7 @@ void ac_emulate_access(ac_test_t *at, unsigned flags)
goto no_pte;
}
- at->expected_pde |= PT_ACCESSED_MASK;
+ at->expected_pde |= PTE_ACCESSED;
pte_valid = F(AC_PTE_PRESENT)
&& !F(AC_PTE_BIT51)
@@ -483,7 +475,7 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
case 4:
case 3:
pte = pd_page ? pd_page : ac_test_alloc_pt(pool);
- pte |= PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK;
+ pte |= PTE_PRESENT | PTE_WRITE | PTE_USER;
break;
case 2:
if (!F(AC_PDE_PSE)) {
@@ -493,22 +485,22 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
pte |= 2ull << 59;
} else {
pte = at->phys & PT_PSE_BASE_ADDR_MASK;
- pte |= PT_PSE_MASK;
+ pte |= PTE_PSE;
if (F(AC_PKU_PKEY))
pte |= 1ull << 59;
}
if (F(AC_PDE_PRESENT))
- pte |= PT_PRESENT_MASK;
+ pte |= PTE_PRESENT;
if (F(AC_PDE_WRITABLE))
- pte |= PT_WRITABLE_MASK;
+ pte |= PTE_WRITE;
if (F(AC_PDE_USER))
- pte |= PT_USER_MASK;
+ pte |= PTE_USER;
if (F(AC_PDE_ACCESSED))
- pte |= PT_ACCESSED_MASK;
+ pte |= PTE_ACCESSED;
if (F(AC_PDE_DIRTY))
- pte |= PT_DIRTY_MASK;
+ pte |= PTE_DIRTY;
if (F(AC_PDE_NX))
- pte |= PT_NX_MASK;
+ pte |= PTE_NX;
if (F(AC_PDE_BIT51))
pte |= 1ull << 51;
if (F(AC_PDE_BIT13))
@@ -520,17 +512,17 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
if (F(AC_PKU_PKEY))
pte |= 1ull << 59;
if (F(AC_PTE_PRESENT))
- pte |= PT_PRESENT_MASK;
+ pte |= PTE_PRESENT;
if (F(AC_PTE_WRITABLE))
- pte |= PT_WRITABLE_MASK;
+ pte |= PTE_WRITE;
if (F(AC_PTE_USER))
- pte |= PT_USER_MASK;
+ pte |= PTE_USER;
if (F(AC_PTE_ACCESSED))
- pte |= PT_ACCESSED_MASK;
+ pte |= PTE_ACCESSED;
if (F(AC_PTE_DIRTY))
- pte |= PT_DIRTY_MASK;
+ pte |= PTE_DIRTY;
if (F(AC_PTE_NX))
- pte |= PT_NX_MASK;
+ pte |= PTE_NX;
if (F(AC_PTE_BIT51))
pte |= 1ull << 51;
at->ptep = &vroot[index];
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 10/11] io: Make ioremap() prototype conform to Linux one
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (8 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 09/11] x86: Cleanup PTE_* flags Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap() Alexander Gordeev
10 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
This update also adds missing __iomem specificator which
has been used by existing IO accessors.
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/asm-generic/io.h | 4 ++--
lib/ppc64/asm/io.h | 2 ++
lib/x86/asm/io.h | 2 ++
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
index 1834720..41756db 100644
--- a/lib/asm-generic/io.h
+++ b/lib/asm-generic/io.h
@@ -156,10 +156,10 @@ static inline u64 __bswap64(u64 x)
({ wmb(); __raw_writeq(cpu_to_le64(b), addr); })
#ifndef ioremap
-static inline void *ioremap(u64 phys_addr, size_t size __unused)
+static inline void __iomem *ioremap(phys_addr_t phys_addr, size_t size __unused)
{
assert(sizeof(long) == 8 || !(phys_addr >> 32));
- return (void *)(unsigned long)phys_addr;
+ return (void __iomem *)(unsigned long)phys_addr;
}
#endif
diff --git a/lib/ppc64/asm/io.h b/lib/ppc64/asm/io.h
index 4f2c31b..2b4dd2b 100644
--- a/lib/ppc64/asm/io.h
+++ b/lib/ppc64/asm/io.h
@@ -9,5 +9,7 @@
#error Undefined byte order
#endif
+#define __iomem
+
#include <asm-generic/io.h>
#endif
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index c944df4..83387b5 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -1,6 +1,8 @@
#ifndef _ASM_X86_IO_H_
#define _ASM_X86_IO_H_
+#define __iomem
+
static inline unsigned char inb(unsigned short port)
{
unsigned char value;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap()
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
` (9 preceding siblings ...)
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 10/11] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
@ 2016-05-03 11:48 ` Alexander Gordeev
2016-05-03 12:55 ` Andrew Jones
10 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 11:48 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/io.h | 2 ++
lib/x86/io.c | 10 ++++++++++
x86/vmexit.c | 10 ++--------
3 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index 83387b5..2436822 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -49,4 +49,6 @@ static inline void *phys_to_virt(unsigned long phys)
return (void *)phys;
}
+void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
+
#endif
diff --git a/lib/x86/io.c b/lib/x86/io.c
index d396d42..f106842 100644
--- a/lib/x86/io.c
+++ b/lib/x86/io.c
@@ -1,6 +1,8 @@
#include "libcflat.h"
+#include "vm.h"
#include "smp.h"
#include "asm/io.h"
+#include "asm/page.h"
#ifndef USE_SERIAL
#define USE_SERIAL
#endif
@@ -81,3 +83,11 @@ void exit(int code)
asm volatile("out %0, %1" : : "a"(code), "d"((short)0xf4));
#endif
}
+
+void __iomem *ioremap(phys_addr_t phys_addr, size_t size)
+{
+ phys_addr_t base = phys_addr & PAGE_MASK;
+ phys_addr_t offset = phys_addr - base;
+
+ return vmap(phys_addr, size) + offset;
+}
diff --git a/x86/vmexit.c b/x86/vmexit.c
index db7dbd8..c2e1e49 100644
--- a/x86/vmexit.c
+++ b/x86/vmexit.c
@@ -371,8 +371,7 @@ int main(int ac, char **av)
{
struct fadt_descriptor_rev1 *fadt;
int i;
- unsigned long membar = 0, base, offset;
- void *m;
+ unsigned long membar = 0;
pcidevaddr_t pcidev;
smp_init();
@@ -394,12 +393,7 @@ int main(int ac, char **av)
}
if (pci_bar_is_memory(pcidev, i)) {
membar = pci_bar_addr(pcidev, i);
- base = membar & ~4095;
- offset = membar - base;
- m = alloc_vpages(1);
-
- install_page((void *)read_cr3(), base, m);
- pci_test.memaddr = m + offset;
+ pci_test.memaddr = ioremap(membar, PAGE_SIZE);
} else {
pci_test.iobar = pci_bar_addr(pcidev, i);
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v5 08/11] x86: Cleanup PAGE_* constants
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
@ 2016-05-03 12:23 ` Andrew Jones
0 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-05-03 12:23 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Tue, May 03, 2016 at 01:48:08PM +0200, Alexander Gordeev wrote:
> Cc: Andrew Jones <drjones@redhat.com>
> Cc: Thomas Huth <thuth@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> ---
> lib/x86/asm/page.h | 10 +++++++++-
> x86/access.c | 4 +---
> x86/vmx.h | 2 +-
> 3 files changed, 11 insertions(+), 5 deletions(-)
Reviewed-by: Andrew Jones <drjones@redhat.com>
>
> diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
> index d4580b4..916462d 100644
> --- a/lib/x86/asm/page.h
> +++ b/lib/x86/asm/page.h
> @@ -7,7 +7,14 @@
> */
>
>
> -#define PAGE_SIZE 4096ul
> +#include <linux/const.h>
> +
> +#define PAGE_SHIFT 12
> +#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
> +#define PAGE_MASK (~(PAGE_SIZE-1))
> +
> +#ifndef __ASSEMBLY__
> +
> #ifdef __x86_64__
> #define LARGE_PAGE_SIZE (512 * PAGE_SIZE)
> #else
> @@ -30,4 +37,5 @@
> #define PGDIR_MASK 1023
> #endif
>
> +#endif /* !__ASSEMBLY__ */
> #endif
> diff --git a/x86/access.c b/x86/access.c
> index 4acaee5..aaf805d 100644
> --- a/x86/access.c
> +++ b/x86/access.c
> @@ -2,6 +2,7 @@
> #include "libcflat.h"
> #include "desc.h"
> #include "processor.h"
> +#include "asm/page.h"
>
> #define smp_id() 0
>
> @@ -15,9 +16,6 @@ static int cpuid_7_ebx;
> static int cpuid_7_ecx;
> static int invalid_mask;
>
> -#define PAGE_SIZE ((pt_element_t)4096)
> -#define PAGE_MASK (~(PAGE_SIZE-1))
> -
> #define PT_BASE_ADDR_MASK ((pt_element_t)((((pt_element_t)1 << 40) - 1) & PAGE_MASK))
> #define PT_PSE_BASE_ADDR_MASK (PT_BASE_ADDR_MASK & ~(1ull << 21))
>
> diff --git a/x86/vmx.h b/x86/vmx.h
> index d6bc217..27f3451 100644
> --- a/x86/vmx.h
> +++ b/x86/vmx.h
> @@ -4,6 +4,7 @@
> #include "libcflat.h"
> #include "processor.h"
> #include "bitops.h"
> +#include "asm/page.h"
>
> struct vmcs {
> u32 revision_id; /* vmcs revision identifier */
> @@ -476,7 +477,6 @@ enum Ctrl1 {
> #define EPT_PGDIR_ENTRIES (1 << EPT_PGDIR_WIDTH)
> #define EPT_LEVEL_SHIFT(level) (((level)-1) * EPT_PGDIR_WIDTH + 12)
> #define EPT_ADDR_MASK GENMASK_ULL(51, 12)
> -#define PAGE_MASK (~(PAGE_SIZE-1))
> #define PAGE_MASK_2M (~(PAGE_SIZE_2M-1))
>
> #define EPT_VLT_RD 1
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v5 09/11] x86: Cleanup PTE_* flags
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 09/11] x86: Cleanup PTE_* flags Alexander Gordeev
@ 2016-05-03 12:46 ` Andrew Jones
0 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-05-03 12:46 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Tue, May 03, 2016 at 01:48:09PM +0200, Alexander Gordeev wrote:
> Cc: Andrew Jones <drjones@redhat.com>
> Cc: Thomas Huth <thuth@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> ---
> lib/x86/asm/page.h | 3 +++
> lib/x86/vm.c | 4 ++--
> x86/access.c | 48 ++++++++++++++++++++----------------------------
> 3 files changed, 25 insertions(+), 30 deletions(-)
>
> diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
> index 916462d..ac2a9c3 100644
> --- a/lib/x86/asm/page.h
> +++ b/lib/x86/asm/page.h
> @@ -24,7 +24,10 @@
> #define PTE_PRESENT (1ull << 0)
> #define PTE_WRITE (1ull << 1)
> #define PTE_USER (1ull << 2)
> +#define PTE_ACCESSED (1ull << 5)
> +#define PTE_DIRTY (1ull << 6)
> #define PTE_PSE (1ull << 7)
> +#define PTE_NX (1ull << 63)
> #define PTE_ADDR (0xffffffffff000ull)
>
> #ifdef __x86_64__
> diff --git a/lib/x86/vm.c b/lib/x86/vm.c
> index 9c94ca5..2018a83 100644
> --- a/lib/x86/vm.c
> +++ b/lib/x86/vm.c
> @@ -58,7 +58,7 @@ unsigned long *install_pte(unsigned long *cr3,
> memset(new_pt, 0, PAGE_SIZE);
> pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE | PTE_USER;
> }
> - pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
> + pt = phys_to_virt(pt[offset] & PTE_ADDR);
> }
> offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
> pt[offset] = pte;
> @@ -78,7 +78,7 @@ unsigned long *get_pte(unsigned long *cr3, void *virt)
> return NULL;
> if (level == 2 && (pte & PTE_PSE))
> return &pt[offset];
> - pt = phys_to_virt(pte & 0xffffffffff000ull);
> + pt = phys_to_virt(pte & PTE_ADDR);
> }
> offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
> return &pt[offset];
> diff --git a/x86/access.c b/x86/access.c
> index aaf805d..b6127aa 100644
> --- a/x86/access.c
> +++ b/x86/access.c
> @@ -19,14 +19,6 @@ static int invalid_mask;
> #define PT_BASE_ADDR_MASK ((pt_element_t)((((pt_element_t)1 << 40) - 1) & PAGE_MASK))
> #define PT_PSE_BASE_ADDR_MASK (PT_BASE_ADDR_MASK & ~(1ull << 21))
>
> -#define PT_PRESENT_MASK ((pt_element_t)1 << 0)
> -#define PT_WRITABLE_MASK ((pt_element_t)1 << 1)
> -#define PT_USER_MASK ((pt_element_t)1 << 2)
> -#define PT_ACCESSED_MASK ((pt_element_t)1 << 5)
> -#define PT_DIRTY_MASK ((pt_element_t)1 << 6)
> -#define PT_PSE_MASK ((pt_element_t)1 << 7)
> -#define PT_NX_MASK ((pt_element_t)1 << 63)
I think I was to hasty with my r-b last round. I just checked and these
are the names we should keep, as they're consistent with the kernel,
see arch/x86/kvm/mmu.h
> -
> #define CR0_WP_MASK (1UL << 16)
> #define CR4_SMEP_MASK (1UL << 20)
>
> @@ -210,10 +202,10 @@ void set_cr4_smep(int smep)
> return;
>
> if (smep)
> - ptl2[2] &= ~PT_USER_MASK;
> + ptl2[2] &= ~PTE_USER;
> write_cr4(cr4);
> if (!smep)
> - ptl2[2] |= PT_USER_MASK;
> + ptl2[2] |= PTE_USER;
> }
>
> void set_cr4_pke(int pke)
> @@ -362,9 +354,9 @@ pt_element_t ac_test_permissions(ac_test_t *at, unsigned flags, bool writable,
> }
>
> if (!at->expected_fault) {
> - expected |= PT_ACCESSED_MASK;
> + expected |= PTE_ACCESSED;
> if (F(AC_ACCESS_WRITE))
> - expected |= PT_DIRTY_MASK;
> + expected |= PTE_DIRTY;
> }
>
> return expected;
> @@ -385,7 +377,7 @@ void ac_emulate_access(ac_test_t *at, unsigned flags)
> at->expected_error |= PFERR_FETCH_MASK;
>
> if (!F(AC_PDE_ACCESSED))
> - at->ignore_pde = PT_ACCESSED_MASK;
> + at->ignore_pde = PTE_ACCESSED;
>
> pde_valid = F(AC_PDE_PRESENT)
> && !F(AC_PDE_BIT51) && !F(AC_PDE_BIT13)
> @@ -411,7 +403,7 @@ void ac_emulate_access(ac_test_t *at, unsigned flags)
> goto no_pte;
> }
>
> - at->expected_pde |= PT_ACCESSED_MASK;
> + at->expected_pde |= PTE_ACCESSED;
>
> pte_valid = F(AC_PTE_PRESENT)
> && !F(AC_PTE_BIT51)
> @@ -483,7 +475,7 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
> case 4:
> case 3:
> pte = pd_page ? pd_page : ac_test_alloc_pt(pool);
> - pte |= PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK;
> + pte |= PTE_PRESENT | PTE_WRITE | PTE_USER;
> break;
> case 2:
> if (!F(AC_PDE_PSE)) {
> @@ -493,22 +485,22 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
> pte |= 2ull << 59;
> } else {
> pte = at->phys & PT_PSE_BASE_ADDR_MASK;
> - pte |= PT_PSE_MASK;
> + pte |= PTE_PSE;
> if (F(AC_PKU_PKEY))
> pte |= 1ull << 59;
> }
> if (F(AC_PDE_PRESENT))
> - pte |= PT_PRESENT_MASK;
> + pte |= PTE_PRESENT;
> if (F(AC_PDE_WRITABLE))
> - pte |= PT_WRITABLE_MASK;
> + pte |= PTE_WRITE;
> if (F(AC_PDE_USER))
> - pte |= PT_USER_MASK;
> + pte |= PTE_USER;
> if (F(AC_PDE_ACCESSED))
> - pte |= PT_ACCESSED_MASK;
> + pte |= PTE_ACCESSED;
> if (F(AC_PDE_DIRTY))
> - pte |= PT_DIRTY_MASK;
> + pte |= PTE_DIRTY;
> if (F(AC_PDE_NX))
> - pte |= PT_NX_MASK;
> + pte |= PTE_NX;
> if (F(AC_PDE_BIT51))
> pte |= 1ull << 51;
> if (F(AC_PDE_BIT13))
> @@ -520,17 +512,17 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
> if (F(AC_PKU_PKEY))
> pte |= 1ull << 59;
> if (F(AC_PTE_PRESENT))
> - pte |= PT_PRESENT_MASK;
> + pte |= PTE_PRESENT;
> if (F(AC_PTE_WRITABLE))
> - pte |= PT_WRITABLE_MASK;
> + pte |= PTE_WRITE;
> if (F(AC_PTE_USER))
> - pte |= PT_USER_MASK;
> + pte |= PTE_USER;
> if (F(AC_PTE_ACCESSED))
> - pte |= PT_ACCESSED_MASK;
> + pte |= PTE_ACCESSED;
> if (F(AC_PTE_DIRTY))
> - pte |= PT_DIRTY_MASK;
> + pte |= PTE_DIRTY;
> if (F(AC_PTE_NX))
> - pte |= PT_NX_MASK;
> + pte |= PTE_NX;
> if (F(AC_PTE_BIT51))
> pte |= 1ull << 51;
> at->ptep = &vroot[index];
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap()
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap() Alexander Gordeev
@ 2016-05-03 12:55 ` Andrew Jones
2016-05-03 15:48 ` Alexander Gordeev
0 siblings, 1 reply; 17+ messages in thread
From: Andrew Jones @ 2016-05-03 12:55 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Tue, May 03, 2016 at 01:48:11PM +0200, Alexander Gordeev wrote:
> Cc: Andrew Jones <drjones@redhat.com>
> Cc: Thomas Huth <thuth@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> ---
> lib/x86/asm/io.h | 2 ++
> lib/x86/io.c | 10 ++++++++++
> x86/vmexit.c | 10 ++--------
> 3 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> index 83387b5..2436822 100644
> --- a/lib/x86/asm/io.h
> +++ b/lib/x86/asm/io.h
> @@ -49,4 +49,6 @@ static inline void *phys_to_virt(unsigned long phys)
> return (void *)phys;
> }
>
> +void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
> +
> #endif
> diff --git a/lib/x86/io.c b/lib/x86/io.c
> index d396d42..f106842 100644
> --- a/lib/x86/io.c
> +++ b/lib/x86/io.c
> @@ -1,6 +1,8 @@
> #include "libcflat.h"
> +#include "vm.h"
> #include "smp.h"
> #include "asm/io.h"
> +#include "asm/page.h"
> #ifndef USE_SERIAL
> #define USE_SERIAL
> #endif
> @@ -81,3 +83,11 @@ void exit(int code)
> asm volatile("out %0, %1" : : "a"(code), "d"((short)0xf4));
> #endif
> }
> +
> +void __iomem *ioremap(phys_addr_t phys_addr, size_t size)
> +{
> + phys_addr_t base = phys_addr & PAGE_MASK;
> + phys_addr_t offset = phys_addr - base;
> +
> + return vmap(phys_addr, size) + offset;
yeah, vmap is the way to go! Now, one missing thing, but it wasn't
in x86/vmexit's implementation either. The kernel sets the PTEs
for an ioremap with PCD, page cache disabled. I guess we can live
without that in kvm-unit-tests, but it would make sense that I/O
mappings would be uncached - and may help us find bugs when we
properly map that way. (Note, ARM gets away with just using
asm-generic's ioremap, because it uses an identity map for the page
tables and all I/O is in a single range which is mapped as uncached)
> +}
> diff --git a/x86/vmexit.c b/x86/vmexit.c
> index db7dbd8..c2e1e49 100644
> --- a/x86/vmexit.c
> +++ b/x86/vmexit.c
> @@ -371,8 +371,7 @@ int main(int ac, char **av)
> {
> struct fadt_descriptor_rev1 *fadt;
> int i;
> - unsigned long membar = 0, base, offset;
> - void *m;
> + unsigned long membar = 0;
> pcidevaddr_t pcidev;
>
> smp_init();
> @@ -394,12 +393,7 @@ int main(int ac, char **av)
> }
> if (pci_bar_is_memory(pcidev, i)) {
> membar = pci_bar_addr(pcidev, i);
> - base = membar & ~4095;
> - offset = membar - base;
> - m = alloc_vpages(1);
> -
> - install_page((void *)read_cr3(), base, m);
> - pci_test.memaddr = m + offset;
> + pci_test.memaddr = ioremap(membar, PAGE_SIZE);
> } else {
> pci_test.iobar = pci_bar_addr(pcidev, i);
> }
> --
> 1.8.3.1
>
Reviewed-by: Andrew Jones <drjones@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap()
2016-05-03 12:55 ` Andrew Jones
@ 2016-05-03 15:48 ` Alexander Gordeev
2016-05-03 15:54 ` Andrew Jones
0 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-03 15:48 UTC (permalink / raw)
To: Andrew Jones; +Cc: kvm, Thomas Huth, Radim Krčmář
On Tue, May 03, 2016 at 02:55:17PM +0200, Andrew Jones wrote:
> On Tue, May 03, 2016 at 01:48:11PM +0200, Alexander Gordeev wrote:
> > Cc: Andrew Jones <drjones@redhat.com>
> > Cc: Thomas Huth <thuth@redhat.com>
> > Cc: Radim Krčmář <rkrcmar@redhat.com>
> > Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> > ---
> > lib/x86/asm/io.h | 2 ++
> > lib/x86/io.c | 10 ++++++++++
> > x86/vmexit.c | 10 ++--------
> > 3 files changed, 14 insertions(+), 8 deletions(-)
> >
> > diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> > index 83387b5..2436822 100644
> > --- a/lib/x86/asm/io.h
> > +++ b/lib/x86/asm/io.h
> > @@ -49,4 +49,6 @@ static inline void *phys_to_virt(unsigned long phys)
> > return (void *)phys;
> > }
> >
> > +void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
> > +
> > #endif
> > diff --git a/lib/x86/io.c b/lib/x86/io.c
> > index d396d42..f106842 100644
> > --- a/lib/x86/io.c
> > +++ b/lib/x86/io.c
> > @@ -1,6 +1,8 @@
> > #include "libcflat.h"
> > +#include "vm.h"
> > #include "smp.h"
> > #include "asm/io.h"
> > +#include "asm/page.h"
> > #ifndef USE_SERIAL
> > #define USE_SERIAL
> > #endif
> > @@ -81,3 +83,11 @@ void exit(int code)
> > asm volatile("out %0, %1" : : "a"(code), "d"((short)0xf4));
> > #endif
> > }
> > +
> > +void __iomem *ioremap(phys_addr_t phys_addr, size_t size)
> > +{
> > + phys_addr_t base = phys_addr & PAGE_MASK;
> > + phys_addr_t offset = phys_addr - base;
> > +
> > + return vmap(phys_addr, size) + offset;
>
> yeah, vmap is the way to go! Now, one missing thing, but it wasn't
> in x86/vmexit's implementation either. The kernel sets the PTEs
> for an ioremap with PCD, page cache disabled. I guess we can live
> without that in kvm-unit-tests, but it would make sense that I/O
> mappings would be uncached - and may help us find bugs when we
> properly map that way. (Note, ARM gets away with just using
> asm-generic's ioremap, because it uses an identity map for the page
> tables and all I/O is in a single range which is mapped as uncached)
I would say, the above is better to put in the changelog for this patch,
huh?
> > +}
> > diff --git a/x86/vmexit.c b/x86/vmexit.c
> > index db7dbd8..c2e1e49 100644
> > --- a/x86/vmexit.c
> > +++ b/x86/vmexit.c
> > @@ -371,8 +371,7 @@ int main(int ac, char **av)
> > {
> > struct fadt_descriptor_rev1 *fadt;
> > int i;
> > - unsigned long membar = 0, base, offset;
> > - void *m;
> > + unsigned long membar = 0;
> > pcidevaddr_t pcidev;
> >
> > smp_init();
> > @@ -394,12 +393,7 @@ int main(int ac, char **av)
> > }
> > if (pci_bar_is_memory(pcidev, i)) {
> > membar = pci_bar_addr(pcidev, i);
> > - base = membar & ~4095;
> > - offset = membar - base;
> > - m = alloc_vpages(1);
> > -
> > - install_page((void *)read_cr3(), base, m);
> > - pci_test.memaddr = m + offset;
> > + pci_test.memaddr = ioremap(membar, PAGE_SIZE);
> > } else {
> > pci_test.iobar = pci_bar_addr(pcidev, i);
> > }
> > --
> > 1.8.3.1
> >
>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap()
2016-05-03 15:48 ` Alexander Gordeev
@ 2016-05-03 15:54 ` Andrew Jones
0 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-05-03 15:54 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Tue, May 03, 2016 at 05:48:47PM +0200, Alexander Gordeev wrote:
> On Tue, May 03, 2016 at 02:55:17PM +0200, Andrew Jones wrote:
> > On Tue, May 03, 2016 at 01:48:11PM +0200, Alexander Gordeev wrote:
> > > Cc: Andrew Jones <drjones@redhat.com>
> > > Cc: Thomas Huth <thuth@redhat.com>
> > > Cc: Radim Krčmář <rkrcmar@redhat.com>
> > > Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> > > ---
> > > lib/x86/asm/io.h | 2 ++
> > > lib/x86/io.c | 10 ++++++++++
> > > x86/vmexit.c | 10 ++--------
> > > 3 files changed, 14 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> > > index 83387b5..2436822 100644
> > > --- a/lib/x86/asm/io.h
> > > +++ b/lib/x86/asm/io.h
> > > @@ -49,4 +49,6 @@ static inline void *phys_to_virt(unsigned long phys)
> > > return (void *)phys;
> > > }
> > >
> > > +void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
> > > +
> > > #endif
> > > diff --git a/lib/x86/io.c b/lib/x86/io.c
> > > index d396d42..f106842 100644
> > > --- a/lib/x86/io.c
> > > +++ b/lib/x86/io.c
> > > @@ -1,6 +1,8 @@
> > > #include "libcflat.h"
> > > +#include "vm.h"
> > > #include "smp.h"
> > > #include "asm/io.h"
> > > +#include "asm/page.h"
> > > #ifndef USE_SERIAL
> > > #define USE_SERIAL
> > > #endif
> > > @@ -81,3 +83,11 @@ void exit(int code)
> > > asm volatile("out %0, %1" : : "a"(code), "d"((short)0xf4));
> > > #endif
> > > }
> > > +
> > > +void __iomem *ioremap(phys_addr_t phys_addr, size_t size)
> > > +{
> > > + phys_addr_t base = phys_addr & PAGE_MASK;
> > > + phys_addr_t offset = phys_addr - base;
> > > +
> > > + return vmap(phys_addr, size) + offset;
> >
> > yeah, vmap is the way to go! Now, one missing thing, but it wasn't
> > in x86/vmexit's implementation either. The kernel sets the PTEs
> > for an ioremap with PCD, page cache disabled. I guess we can live
> > without that in kvm-unit-tests, but it would make sense that I/O
> > mappings would be uncached - and may help us find bugs when we
> > properly map that way. (Note, ARM gets away with just using
> > asm-generic's ioremap, because it uses an identity map for the page
> > tables and all I/O is in a single range which is mapped as uncached)
>
> I would say, the above is better to put in the changelog for this patch,
> huh?
Sure, or a comment in the ioremap function.
thanks,
drew
>
> > > +}
> > > diff --git a/x86/vmexit.c b/x86/vmexit.c
> > > index db7dbd8..c2e1e49 100644
> > > --- a/x86/vmexit.c
> > > +++ b/x86/vmexit.c
> > > @@ -371,8 +371,7 @@ int main(int ac, char **av)
> > > {
> > > struct fadt_descriptor_rev1 *fadt;
> > > int i;
> > > - unsigned long membar = 0, base, offset;
> > > - void *m;
> > > + unsigned long membar = 0;
> > > pcidevaddr_t pcidev;
> > >
> > > smp_init();
> > > @@ -394,12 +393,7 @@ int main(int ac, char **av)
> > > }
> > > if (pci_bar_is_memory(pcidev, i)) {
> > > membar = pci_bar_addr(pcidev, i);
> > > - base = membar & ~4095;
> > > - offset = membar - base;
> > > - m = alloc_vpages(1);
> > > -
> > > - install_page((void *)read_cr3(), base, m);
> > > - pci_test.memaddr = m + offset;
> > > + pci_test.memaddr = ioremap(membar, PAGE_SIZE);
> > > } else {
> > > pci_test.iobar = pci_bar_addr(pcidev, i);
> > > }
> > > --
> > > 1.8.3.1
> > >
> >
> > Reviewed-by: Andrew Jones <drjones@redhat.com>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2016-05-03 15:54 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-03 11:48 [kvm-unit-tests PATCH v5 00/11] Cleanup low-level arch code Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 02/11] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 03/11] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 04/11] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 05/11] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt() Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 07/11] io: Disallow memory re-ordering for generic memory barriers Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
2016-05-03 12:23 ` Andrew Jones
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 09/11] x86: Cleanup PTE_* flags Alexander Gordeev
2016-05-03 12:46 ` Andrew Jones
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 10/11] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
2016-05-03 11:48 ` [kvm-unit-tests PATCH v5 11/11] x86: io: Factor out ioremap() Alexander Gordeev
2016-05-03 12:55 ` Andrew Jones
2016-05-03 15:48 ` Alexander Gordeev
2016-05-03 15:54 ` Andrew Jones
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.