All of lore.kernel.org
 help / color / mirror / Atom feed
* [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code
@ 2016-05-05 14:26 Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
                   ` (11 more replies)
  0 siblings, 12 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 UTC (permalink / raw)
  To: kvm
  Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
	Radim Krčmář

Andrew et al,

This is 7th attempt to make mainly x86 arch code consistent
with other architectures.

I withdrew your Reviewed-by from "x86: Cleanup PT_*_MASK flags"
patch 09/11 due to couple of more than just nits changes.

PCD-ed ioremap() could be a follow-up update on top of this series.

Changes since v6:
  - ioremap() PCD comment updated;
  - PT_PSE_MASK renamed to PT_PAGE_SIZE_MASK;
  - GENMASK_ULL used for PT_ADDR_MASK definition;
  - missed x86/taskswitch2.c update added;

Changes since v5:
  - ioremap() PCD comment added, the Reviewed-by preserved;
  - page table flag names changed from PTE_* to PT_*_MASK;

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 PT_*_MASK 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      | 45 +++++++++++++++++++++++++++++++++++++++++++++
 lib/x86/asm/pci.h       |  2 +-
 lib/x86/io.c            | 18 +++++++++++++++++-
 lib/x86/smp.h           |  4 ----
 lib/x86/vm.c            | 37 ++++++++++---------------------------
 lib/x86/vm.h            | 25 ++-----------------------
 x86/access.c            | 14 ++------------
 x86/asyncpf.c           |  2 +-
 x86/eventinj.c          | 17 ++++++-----------
 x86/hypercall.c         |  2 +-
 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/pku.c               |  2 +-
 x86/rmap_chain.c        |  2 +-
 x86/smap.c              |  6 +++---
 x86/svm.c               |  1 -
 x86/taskswitch2.c       |  2 +-
 x86/vmexit.c            | 11 ++---------
 x86/vmx.c               |  1 -
 x86/vmx.h               |  2 +-
 x86/vmx_tests.c         |  1 -
 34 files changed, 140 insertions(+), 119 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 v7 01/11] Remove unused and unnecessary PHYS32 macro
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 02/11] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 02/11] Move phys_addr_t type definition to lib/libcflat.h
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 03/11] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 03/11] x86: Introduce lib/x86/asm/page.h
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 02/11] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 04/11] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 04/11] x86: Introduce lib/x86/asm/io.h
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (2 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 03/11] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 05/11] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 05/11] x86: Introduce lib/x86/asm/barrier.h
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (3 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 04/11] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt() Alexander Gordeev
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt()
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (4 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 05/11] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 07/11] io: Disallow memory re-ordering for generic memory barriers Alexander Gordeev
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 07/11] io: Disallow memory re-ordering for generic memory barriers
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (5 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt() Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 08/11] x86: Cleanup PAGE_* constants
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (6 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 07/11] io: Disallow memory re-ordering for generic memory barriers Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 09/11] x86: Cleanup PT_*_MASK flags Alexander Gordeev
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 | 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 v7 09/11] x86: Cleanup PT_*_MASK flags
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (7 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-06  9:04   ` Andrew Jones
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 10/11] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 | 14 +++++++++-----
 lib/x86/vm.c       | 20 ++++++++++----------
 x86/access.c       | 10 +---------
 x86/asyncpf.c      |  2 +-
 x86/eventinj.c     | 10 +++++-----
 x86/hypercall.c    |  2 +-
 x86/pku.c          |  2 +-
 x86/rmap_chain.c   |  2 +-
 x86/smap.c         |  6 +++---
 x86/taskswitch2.c  |  2 +-
 10 files changed, 33 insertions(+), 37 deletions(-)

diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
index 916462d..0342c71 100644
--- a/lib/x86/asm/page.h
+++ b/lib/x86/asm/page.h
@@ -8,6 +8,7 @@
 
 
 #include <linux/const.h>
+#include <bitops.h>
 
 #define PAGE_SHIFT	12
 #define PAGE_SIZE	(_AC(1,UL) << PAGE_SHIFT)
@@ -21,11 +22,14 @@
 #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)
+#define PT_PRESENT_MASK		(1ull << 0)
+#define PT_WRITABLE_MASK	(1ull << 1)
+#define PT_USER_MASK		(1ull << 2)
+#define PT_ACCESSED_MASK	(1ull << 5)
+#define PT_DIRTY_MASK		(1ull << 6)
+#define PT_PAGE_SIZE_MASK	(1ull << 7)
+#define PT_NX_MASK		(1ull << 63)
+#define PT_ADDR_MASK		GENMASK_ULL(51, 12)
 
 #ifdef __x86_64__
 #define	PAGE_LEVEL	4
diff --git a/lib/x86/vm.c b/lib/x86/vm.c
index 9c94ca5..906fbf2 100644
--- a/lib/x86/vm.c
+++ b/lib/x86/vm.c
@@ -49,16 +49,16 @@ unsigned long *install_pte(unsigned long *cr3,
 
     for (level = PAGE_LEVEL; level > pte_level; --level) {
 	offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
-	if (!(pt[offset] & PTE_PRESENT)) {
+	if (!(pt[offset] & PT_PRESENT_MASK)) {
 	    unsigned long *new_pt = pt_page;
             if (!new_pt)
                 new_pt = alloc_page();
             else
                 pt_page = 0;
 	    memset(new_pt, 0, PAGE_SIZE);
-	    pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE | PTE_USER;
+	    pt[offset] = virt_to_phys(new_pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK;
 	}
-	pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
+	pt = phys_to_virt(pt[offset] & PT_ADDR_MASK);
     }
     offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
     pt[offset] = pte;
@@ -74,11 +74,11 @@ unsigned long *get_pte(unsigned long *cr3, void *virt)
     for (level = PAGE_LEVEL; level > 1; --level) {
 	offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
 	pte = pt[offset];
-	if (!(pte & PTE_PRESENT))
+	if (!(pte & PT_PRESENT_MASK))
 	    return NULL;
-	if (level == 2 && (pte & PTE_PSE))
+	if (level == 2 && (pte & PT_PAGE_SIZE_MASK))
 	    return &pt[offset];
-	pt = phys_to_virt(pte & 0xffffffffff000ull);
+	pt = phys_to_virt(pte & PT_ADDR_MASK);
     }
     offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
     return &pt[offset];
@@ -89,14 +89,14 @@ unsigned long *install_large_page(unsigned long *cr3,
 				  void *virt)
 {
     return install_pte(cr3, 2, virt,
-		       phys | PTE_PRESENT | PTE_WRITE | PTE_USER | PTE_PSE, 0);
+		       phys | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK | PT_PAGE_SIZE_MASK, 0);
 }
 
 unsigned long *install_page(unsigned long *cr3,
 			    unsigned long phys,
 			    void *virt)
 {
-    return install_pte(cr3, 1, virt, phys | PTE_PRESENT | PTE_WRITE | PTE_USER, 0);
+    return install_pte(cr3, 1, virt, phys | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK, 0);
 }
 
 
@@ -178,7 +178,7 @@ void *vmalloc(unsigned long size)
 
 uint64_t virt_to_phys_cr3(void *mem)
 {
-    return (*get_pte(phys_to_virt(read_cr3()), mem) & PTE_ADDR) + ((ulong)mem & (PAGE_SIZE - 1));
+    return (*get_pte(phys_to_virt(read_cr3()), mem) & PT_ADDR_MASK) + ((ulong)mem & (PAGE_SIZE - 1));
 }
 
 void vfree(void *mem)
@@ -186,7 +186,7 @@ void vfree(void *mem)
     unsigned long size = ((unsigned long *)mem)[-1];
 
     while (size) {
-	free_page(phys_to_virt(*get_pte(phys_to_virt(read_cr3()), mem) & PTE_ADDR));
+	free_page(phys_to_virt(*get_pte(phys_to_virt(read_cr3()), mem) & PT_ADDR_MASK));
 	mem += PAGE_SIZE;
 	size -= PAGE_SIZE;
     }
diff --git a/x86/access.c b/x86/access.c
index aaf805d..3c5b8b5 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)
 
@@ -493,7 +485,7 @@ 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 |= PT_PAGE_SIZE_MASK;
                 if (F(AC_PKU_PKEY))
                     pte |= 1ull << 59;
 	    }
diff --git a/x86/asyncpf.c b/x86/asyncpf.c
index 304d015..a6051ab 100644
--- a/x86/asyncpf.c
+++ b/x86/asyncpf.c
@@ -69,7 +69,7 @@ static void pf_isr(struct ex_regs *r)
 			report("Got present #PF token %x\n", true, read_cr2());
 			if ((uint32_t)read_cr2() == ~0)
 				break;
-			install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PTE_PRESENT | PTE_WRITE, 0);
+			install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 			write_cr3(read_cr3());
 			phys = 0;
 			break;
diff --git a/x86/eventinj.c b/x86/eventinj.c
index 84dfe71..9ee557b 100644
--- a/x86/eventinj.c
+++ b/x86/eventinj.c
@@ -52,7 +52,7 @@ void do_pf_tss(void)
 {
 	printf("PF running\n");
 	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
-		    stack_phys | PTE_PRESENT | PTE_WRITE, 0);
+		    stack_phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 	invlpg(stack_va);
 }
 
@@ -363,7 +363,7 @@ int main()
 	printf("Try to divide by 0\n");
 	/* install read only pte */
 	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
-		    stack_phys | PTE_PRESENT, 0);
+		    stack_phys | PT_PRESENT_MASK, 0);
 	invlpg(stack_va);
 	flush_phys_addr(stack_phys);
 	switch_stack(stack_va + 4095);
@@ -382,7 +382,7 @@ int main()
 	set_idt_sel(33, NP_SEL);
 	/* install read only pte */
 	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
-		    stack_phys | PTE_PRESENT, 0);
+		    stack_phys | PT_PRESENT_MASK, 0);
 	invlpg(stack_va);
 	flush_idt_page();
 	flush_phys_addr(stack_phys);
@@ -398,8 +398,8 @@ int main()
 	/* use shadowed stack during interrupt delivery */
 	for (i = 0; i < 4096/sizeof(ulong); i++) {
 		if (!cr3[i]) {
-			cr3[i] = virt_to_phys(pt) | PTE_PRESENT | PTE_WRITE;
-			pt[0] = virt_to_phys(pt) | PTE_PRESENT | PTE_WRITE;
+			cr3[i] = virt_to_phys(pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK;
+			pt[0] = virt_to_phys(pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK;
 #ifndef __x86_64__
 			((ulong*)(i<<22))[1] = 0;
 #else
diff --git a/x86/hypercall.c b/x86/hypercall.c
index 75179a1..9380f78 100644
--- a/x86/hypercall.c
+++ b/x86/hypercall.c
@@ -65,7 +65,7 @@ int main(int ac, char **av)
 	u8 *topmost = (void *) ((1ul << 47) - PAGE_SIZE);
 
 	install_pte(phys_to_virt(read_cr3()), 1, topmost,
-		    virt_to_phys(data1) | PTE_PRESENT | PTE_WRITE, 0);
+		    virt_to_phys(data1) | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 	memset(topmost, 0xcc, PAGE_SIZE);
 	topmost[4093] = 0x0f;
 	topmost[4094] = 0x01;
diff --git a/x86/pku.c b/x86/pku.c
index df51d1b..e742735 100644
--- a/x86/pku.c
+++ b/x86/pku.c
@@ -77,7 +77,7 @@ int main(int ac, char **av)
     wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_LMA);
 
     for (i = 0; i < USER_BASE; i += PAGE_SIZE) {
-        *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PTE_USER;
+        *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PT_USER_MASK;
         *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) |= ((unsigned long)pkey << PTE_PKEY_BIT);
         invlpg((void *)i);
     }
diff --git a/x86/rmap_chain.c b/x86/rmap_chain.c
index b356a37..7bf6275 100644
--- a/x86/rmap_chain.c
+++ b/x86/rmap_chain.c
@@ -36,7 +36,7 @@ int main (void)
 
     virt_addr += PAGE_SIZE;
     install_pte(phys_to_virt(read_cr3()), 1, virt_addr,
-                0 | PTE_PRESENT | PTE_WRITE, target_page);
+                0 | PT_PRESENT_MASK | PT_WRITABLE_MASK, target_page);
 
     *(unsigned long *)virt_addr = 0;
     printf("PASS\n");
diff --git a/x86/smap.c b/x86/smap.c
index 69e7186..ace9dc0 100644
--- a/x86/smap.c
+++ b/x86/smap.c
@@ -62,7 +62,7 @@ static void check_smap_nowp(void)
 {
 	test = 0x99;
 
-	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) &= ~PTE_WRITE;
+	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) &= ~PT_WRITABLE_MASK;
 
 	write_cr4(read_cr4() & ~X86_CR4_SMAP);
 	write_cr0(read_cr0() & ~X86_CR0_WP);
@@ -81,7 +81,7 @@ static void check_smap_nowp(void)
 	report("read from user page with SMAP=1, AC=0, WP=0, PTE.U=1 && PTE.W=0", pf_count == 1 && save == 0x99);
 
 	/* Undo changes */
-	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) |= PTE_WRITE;
+	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) |= PT_WRITABLE_MASK;
 
 	write_cr0(read_cr0() | X86_CR0_WP);
 	write_cr3(read_cr3());
@@ -102,7 +102,7 @@ int main(int ac, char **av)
 
 	// Map first 16MB as supervisor pages
 	for (i = 0; i < USER_BASE; i += PAGE_SIZE) {
-		*get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PTE_USER;
+		*get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PT_USER_MASK;
 		invlpg((void *)i);
 	}
 
diff --git a/x86/taskswitch2.c b/x86/taskswitch2.c
index d70b901..bb7345b 100644
--- a/x86/taskswitch2.c
+++ b/x86/taskswitch2.c
@@ -67,7 +67,7 @@ void do_pf_tss(ulong *error_code)
 	if (*error_code == 0x2) /* write access, not present */
 		test_count++;
 	install_pte(phys_to_virt(read_cr3()), 1, fault_addr,
-		    fault_phys | PTE_PRESENT | PTE_WRITE, 0);
+		    fault_phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 }
 
 extern void pf_tss(void);
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [kvm-unit-tests PATCH v7 10/11] io: Make ioremap() prototype conform to Linux one
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (8 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 09/11] x86: Cleanup PT_*_MASK flags Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 11/11] x86: io: Factor out ioremap() Alexander Gordeev
  2016-05-06  9:08 ` [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Andrew Jones
  11 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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 v7 11/11] x86: io: Factor out ioremap()
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (9 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 10/11] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
@ 2016-05-05 14:26 ` Alexander Gordeev
  2016-05-06  9:06   ` Andrew Jones
  2016-05-06  9:08 ` [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Andrew Jones
  11 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-05 14:26 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/io.h |  2 ++
 lib/x86/io.c     | 16 ++++++++++++++++
 x86/vmexit.c     | 10 ++--------
 3 files changed, 20 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..cc5ac58 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,17 @@ 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;
+
+	/*
+	 * The kernel sets PTEs for an ioremap() with page cache disabled,
+	 * but we do not do that right now. It would make sense that I/O
+	 * mappings would be uncached - and may help us find bugs when we
+	 * properly map that way.
+	 */
+	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 v7 09/11] x86: Cleanup PT_*_MASK flags
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 09/11] x86: Cleanup PT_*_MASK flags Alexander Gordeev
@ 2016-05-06  9:04   ` Andrew Jones
  2016-05-06 11:22     ` [kvm-unit-tests PATCH v8 " Alexander Gordeev
  0 siblings, 1 reply; 17+ messages in thread
From: Andrew Jones @ 2016-05-06  9:04 UTC (permalink / raw)
  To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář

On Thu, May 05, 2016 at 04:26:42PM +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 | 14 +++++++++-----
>  lib/x86/vm.c       | 20 ++++++++++----------
>  x86/access.c       | 10 +---------
>  x86/asyncpf.c      |  2 +-
>  x86/eventinj.c     | 10 +++++-----
>  x86/hypercall.c    |  2 +-
>  x86/pku.c          |  2 +-
>  x86/rmap_chain.c   |  2 +-
>  x86/smap.c         |  6 +++---
>  x86/taskswitch2.c  |  2 +-
>  10 files changed, 33 insertions(+), 37 deletions(-)
> 
> diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
> index 916462d..0342c71 100644
> --- a/lib/x86/asm/page.h
> +++ b/lib/x86/asm/page.h
> @@ -8,6 +8,7 @@
>  
>  
>  #include <linux/const.h>
> +#include <bitops.h>
>  
>  #define PAGE_SHIFT	12
>  #define PAGE_SIZE	(_AC(1,UL) << PAGE_SHIFT)
> @@ -21,11 +22,14 @@
>  #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)
> +#define PT_PRESENT_MASK		(1ull << 0)
> +#define PT_WRITABLE_MASK	(1ull << 1)
> +#define PT_USER_MASK		(1ull << 2)
> +#define PT_ACCESSED_MASK	(1ull << 5)
> +#define PT_DIRTY_MASK		(1ull << 6)
> +#define PT_PAGE_SIZE_MASK	(1ull << 7)
> +#define PT_NX_MASK		(1ull << 63)

This is PT64_NX_MASK in arch/x86/kvm/mmu.h (as I pointed out
before), but whatever.

Reviewed-by: Andrew Jones <drjones@redhat.com>

> +#define PT_ADDR_MASK		GENMASK_ULL(51, 12)
>  
>  #ifdef __x86_64__
>  #define	PAGE_LEVEL	4
> diff --git a/lib/x86/vm.c b/lib/x86/vm.c
> index 9c94ca5..906fbf2 100644
> --- a/lib/x86/vm.c
> +++ b/lib/x86/vm.c
> @@ -49,16 +49,16 @@ unsigned long *install_pte(unsigned long *cr3,
>  
>      for (level = PAGE_LEVEL; level > pte_level; --level) {
>  	offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
> -	if (!(pt[offset] & PTE_PRESENT)) {
> +	if (!(pt[offset] & PT_PRESENT_MASK)) {
>  	    unsigned long *new_pt = pt_page;
>              if (!new_pt)
>                  new_pt = alloc_page();
>              else
>                  pt_page = 0;
>  	    memset(new_pt, 0, PAGE_SIZE);
> -	    pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE | PTE_USER;
> +	    pt[offset] = virt_to_phys(new_pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK;
>  	}
> -	pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
> +	pt = phys_to_virt(pt[offset] & PT_ADDR_MASK);
>      }
>      offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
>      pt[offset] = pte;
> @@ -74,11 +74,11 @@ unsigned long *get_pte(unsigned long *cr3, void *virt)
>      for (level = PAGE_LEVEL; level > 1; --level) {
>  	offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
>  	pte = pt[offset];
> -	if (!(pte & PTE_PRESENT))
> +	if (!(pte & PT_PRESENT_MASK))
>  	    return NULL;
> -	if (level == 2 && (pte & PTE_PSE))
> +	if (level == 2 && (pte & PT_PAGE_SIZE_MASK))
>  	    return &pt[offset];
> -	pt = phys_to_virt(pte & 0xffffffffff000ull);
> +	pt = phys_to_virt(pte & PT_ADDR_MASK);
>      }
>      offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
>      return &pt[offset];
> @@ -89,14 +89,14 @@ unsigned long *install_large_page(unsigned long *cr3,
>  				  void *virt)
>  {
>      return install_pte(cr3, 2, virt,
> -		       phys | PTE_PRESENT | PTE_WRITE | PTE_USER | PTE_PSE, 0);
> +		       phys | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK | PT_PAGE_SIZE_MASK, 0);
>  }
>  
>  unsigned long *install_page(unsigned long *cr3,
>  			    unsigned long phys,
>  			    void *virt)
>  {
> -    return install_pte(cr3, 1, virt, phys | PTE_PRESENT | PTE_WRITE | PTE_USER, 0);
> +    return install_pte(cr3, 1, virt, phys | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK, 0);
>  }
>  
>  
> @@ -178,7 +178,7 @@ void *vmalloc(unsigned long size)
>  
>  uint64_t virt_to_phys_cr3(void *mem)
>  {
> -    return (*get_pte(phys_to_virt(read_cr3()), mem) & PTE_ADDR) + ((ulong)mem & (PAGE_SIZE - 1));
> +    return (*get_pte(phys_to_virt(read_cr3()), mem) & PT_ADDR_MASK) + ((ulong)mem & (PAGE_SIZE - 1));
>  }
>  
>  void vfree(void *mem)
> @@ -186,7 +186,7 @@ void vfree(void *mem)
>      unsigned long size = ((unsigned long *)mem)[-1];
>  
>      while (size) {
> -	free_page(phys_to_virt(*get_pte(phys_to_virt(read_cr3()), mem) & PTE_ADDR));
> +	free_page(phys_to_virt(*get_pte(phys_to_virt(read_cr3()), mem) & PT_ADDR_MASK));
>  	mem += PAGE_SIZE;
>  	size -= PAGE_SIZE;
>      }
> diff --git a/x86/access.c b/x86/access.c
> index aaf805d..3c5b8b5 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)
>  
> @@ -493,7 +485,7 @@ 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 |= PT_PAGE_SIZE_MASK;
>                  if (F(AC_PKU_PKEY))
>                      pte |= 1ull << 59;
>  	    }
> diff --git a/x86/asyncpf.c b/x86/asyncpf.c
> index 304d015..a6051ab 100644
> --- a/x86/asyncpf.c
> +++ b/x86/asyncpf.c
> @@ -69,7 +69,7 @@ static void pf_isr(struct ex_regs *r)
>  			report("Got present #PF token %x\n", true, read_cr2());
>  			if ((uint32_t)read_cr2() == ~0)
>  				break;
> -			install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PTE_PRESENT | PTE_WRITE, 0);
> +			install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
>  			write_cr3(read_cr3());
>  			phys = 0;
>  			break;
> diff --git a/x86/eventinj.c b/x86/eventinj.c
> index 84dfe71..9ee557b 100644
> --- a/x86/eventinj.c
> +++ b/x86/eventinj.c
> @@ -52,7 +52,7 @@ void do_pf_tss(void)
>  {
>  	printf("PF running\n");
>  	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
> -		    stack_phys | PTE_PRESENT | PTE_WRITE, 0);
> +		    stack_phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
>  	invlpg(stack_va);
>  }
>  
> @@ -363,7 +363,7 @@ int main()
>  	printf("Try to divide by 0\n");
>  	/* install read only pte */
>  	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
> -		    stack_phys | PTE_PRESENT, 0);
> +		    stack_phys | PT_PRESENT_MASK, 0);
>  	invlpg(stack_va);
>  	flush_phys_addr(stack_phys);
>  	switch_stack(stack_va + 4095);
> @@ -382,7 +382,7 @@ int main()
>  	set_idt_sel(33, NP_SEL);
>  	/* install read only pte */
>  	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
> -		    stack_phys | PTE_PRESENT, 0);
> +		    stack_phys | PT_PRESENT_MASK, 0);
>  	invlpg(stack_va);
>  	flush_idt_page();
>  	flush_phys_addr(stack_phys);
> @@ -398,8 +398,8 @@ int main()
>  	/* use shadowed stack during interrupt delivery */
>  	for (i = 0; i < 4096/sizeof(ulong); i++) {
>  		if (!cr3[i]) {
> -			cr3[i] = virt_to_phys(pt) | PTE_PRESENT | PTE_WRITE;
> -			pt[0] = virt_to_phys(pt) | PTE_PRESENT | PTE_WRITE;
> +			cr3[i] = virt_to_phys(pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK;
> +			pt[0] = virt_to_phys(pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK;
>  #ifndef __x86_64__
>  			((ulong*)(i<<22))[1] = 0;
>  #else
> diff --git a/x86/hypercall.c b/x86/hypercall.c
> index 75179a1..9380f78 100644
> --- a/x86/hypercall.c
> +++ b/x86/hypercall.c
> @@ -65,7 +65,7 @@ int main(int ac, char **av)
>  	u8 *topmost = (void *) ((1ul << 47) - PAGE_SIZE);
>  
>  	install_pte(phys_to_virt(read_cr3()), 1, topmost,
> -		    virt_to_phys(data1) | PTE_PRESENT | PTE_WRITE, 0);
> +		    virt_to_phys(data1) | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
>  	memset(topmost, 0xcc, PAGE_SIZE);
>  	topmost[4093] = 0x0f;
>  	topmost[4094] = 0x01;
> diff --git a/x86/pku.c b/x86/pku.c
> index df51d1b..e742735 100644
> --- a/x86/pku.c
> +++ b/x86/pku.c
> @@ -77,7 +77,7 @@ int main(int ac, char **av)
>      wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_LMA);
>  
>      for (i = 0; i < USER_BASE; i += PAGE_SIZE) {
> -        *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PTE_USER;
> +        *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PT_USER_MASK;
>          *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) |= ((unsigned long)pkey << PTE_PKEY_BIT);
>          invlpg((void *)i);
>      }
> diff --git a/x86/rmap_chain.c b/x86/rmap_chain.c
> index b356a37..7bf6275 100644
> --- a/x86/rmap_chain.c
> +++ b/x86/rmap_chain.c
> @@ -36,7 +36,7 @@ int main (void)
>  
>      virt_addr += PAGE_SIZE;
>      install_pte(phys_to_virt(read_cr3()), 1, virt_addr,
> -                0 | PTE_PRESENT | PTE_WRITE, target_page);
> +                0 | PT_PRESENT_MASK | PT_WRITABLE_MASK, target_page);
>  
>      *(unsigned long *)virt_addr = 0;
>      printf("PASS\n");
> diff --git a/x86/smap.c b/x86/smap.c
> index 69e7186..ace9dc0 100644
> --- a/x86/smap.c
> +++ b/x86/smap.c
> @@ -62,7 +62,7 @@ static void check_smap_nowp(void)
>  {
>  	test = 0x99;
>  
> -	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) &= ~PTE_WRITE;
> +	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) &= ~PT_WRITABLE_MASK;
>  
>  	write_cr4(read_cr4() & ~X86_CR4_SMAP);
>  	write_cr0(read_cr0() & ~X86_CR0_WP);
> @@ -81,7 +81,7 @@ static void check_smap_nowp(void)
>  	report("read from user page with SMAP=1, AC=0, WP=0, PTE.U=1 && PTE.W=0", pf_count == 1 && save == 0x99);
>  
>  	/* Undo changes */
> -	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) |= PTE_WRITE;
> +	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) |= PT_WRITABLE_MASK;
>  
>  	write_cr0(read_cr0() | X86_CR0_WP);
>  	write_cr3(read_cr3());
> @@ -102,7 +102,7 @@ int main(int ac, char **av)
>  
>  	// Map first 16MB as supervisor pages
>  	for (i = 0; i < USER_BASE; i += PAGE_SIZE) {
> -		*get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PTE_USER;
> +		*get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PT_USER_MASK;
>  		invlpg((void *)i);
>  	}
>  
> diff --git a/x86/taskswitch2.c b/x86/taskswitch2.c
> index d70b901..bb7345b 100644
> --- a/x86/taskswitch2.c
> +++ b/x86/taskswitch2.c
> @@ -67,7 +67,7 @@ void do_pf_tss(ulong *error_code)
>  	if (*error_code == 0x2) /* write access, not present */
>  		test_count++;
>  	install_pte(phys_to_virt(read_cr3()), 1, fault_addr,
> -		    fault_phys | PTE_PRESENT | PTE_WRITE, 0);
> +		    fault_phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
>  }
>  
>  extern void pf_tss(void);
> -- 
> 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 v7 11/11] x86: io: Factor out ioremap()
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 11/11] x86: io: Factor out ioremap() Alexander Gordeev
@ 2016-05-06  9:06   ` Andrew Jones
  0 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-05-06  9:06 UTC (permalink / raw)
  To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář

On Thu, May 05, 2016 at 04:26:44PM +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/io.h |  2 ++
>  lib/x86/io.c     | 16 ++++++++++++++++
>  x86/vmexit.c     | 10 ++--------
>  3 files changed, 20 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..cc5ac58 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,17 @@ 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;
> +
> +	/*
> +	 * The kernel sets PTEs for an ioremap() with page cache disabled,
> +	 * but we do not do that right now. It would make sense that I/O
> +	 * mappings would be uncached - and may help us find bugs when we
> +	 * properly map that way.
> +	 */

YAY!


> +	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
> 
> --
> 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 v7 00/11] Cleanup low-level arch code
  2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
                   ` (10 preceding siblings ...)
  2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 11/11] x86: io: Factor out ioremap() Alexander Gordeev
@ 2016-05-06  9:08 ` Andrew Jones
  2016-05-06 11:29   ` Alexander Gordeev
  11 siblings, 1 reply; 17+ messages in thread
From: Andrew Jones @ 2016-05-06  9:08 UTC (permalink / raw)
  To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář

On Thu, May 05, 2016 at 04:26:33PM +0200, Alexander Gordeev wrote:
> Andrew et al,
> 
> This is 7th attempt to make mainly x86 arch code consistent
> with other architectures.
> 
> I withdrew your Reviewed-by from "x86: Cleanup PT_*_MASK flags"
> patch 09/11 due to couple of more than just nits changes.
> 
> PCD-ed ioremap() could be a follow-up update on top of this series.
> 
> Changes since v6:
>   - ioremap() PCD comment updated;
>   - PT_PSE_MASK renamed to PT_PAGE_SIZE_MASK;
>   - GENMASK_ULL used for PT_ADDR_MASK definition;
>   - missed x86/taskswitch2.c update added;

I guess you found this by compiling 32bit x86. Good. Did you make
sure both 32 and 64 bit can compile with each patch applied one
at a time? If so, then (at least as far as I'm concerned) this
series looks good to go.

Radim, can you take a look and consider it for merge?

Thanks,
drew

> 
> Changes since v5:
>   - ioremap() PCD comment added, the Reviewed-by preserved;
>   - page table flag names changed from PTE_* to PT_*_MASK;
> 
> 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 PT_*_MASK 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      | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  lib/x86/asm/pci.h       |  2 +-
>  lib/x86/io.c            | 18 +++++++++++++++++-
>  lib/x86/smp.h           |  4 ----
>  lib/x86/vm.c            | 37 ++++++++++---------------------------
>  lib/x86/vm.h            | 25 ++-----------------------
>  x86/access.c            | 14 ++------------
>  x86/asyncpf.c           |  2 +-
>  x86/eventinj.c          | 17 ++++++-----------
>  x86/hypercall.c         |  2 +-
>  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/pku.c               |  2 +-
>  x86/rmap_chain.c        |  2 +-
>  x86/smap.c              |  6 +++---
>  x86/svm.c               |  1 -
>  x86/taskswitch2.c       |  2 +-
>  x86/vmexit.c            | 11 ++---------
>  x86/vmx.c               |  1 -
>  x86/vmx.h               |  2 +-
>  x86/vmx_tests.c         |  1 -
>  34 files changed, 140 insertions(+), 119 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
> 
> --
> 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

* [kvm-unit-tests PATCH v8 09/11] x86: Cleanup PT_*_MASK flags
  2016-05-06  9:04   ` Andrew Jones
@ 2016-05-06 11:22     ` Alexander Gordeev
  0 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-06 11:22 UTC (permalink / raw)
  To: Andrew Jones; +Cc: kvm, 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 | 14 +++++++++-----
 lib/x86/vm.c       | 20 ++++++++++----------
 x86/access.c       | 14 +++-----------
 x86/asyncpf.c      |  2 +-
 x86/eventinj.c     | 10 +++++-----
 x86/hypercall.c    |  2 +-
 x86/pku.c          |  2 +-
 x86/rmap_chain.c   |  2 +-
 x86/smap.c         |  6 +++---
 x86/taskswitch2.c  |  2 +-
 10 files changed, 35 insertions(+), 39 deletions(-)

diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
index 916462d..5044a49 100644
--- a/lib/x86/asm/page.h
+++ b/lib/x86/asm/page.h
@@ -8,6 +8,7 @@
 
 
 #include <linux/const.h>
+#include <bitops.h>
 
 #define PAGE_SHIFT	12
 #define PAGE_SIZE	(_AC(1,UL) << PAGE_SHIFT)
@@ -21,11 +22,14 @@
 #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)
+#define PT_PRESENT_MASK		(1ull << 0)
+#define PT_WRITABLE_MASK	(1ull << 1)
+#define PT_USER_MASK		(1ull << 2)
+#define PT_ACCESSED_MASK	(1ull << 5)
+#define PT_DIRTY_MASK		(1ull << 6)
+#define PT_PAGE_SIZE_MASK	(1ull << 7)
+#define PT64_NX_MASK		(1ull << 63)
+#define PT_ADDR_MASK		GENMASK_ULL(51, 12)
 
 #ifdef __x86_64__
 #define	PAGE_LEVEL	4
diff --git a/lib/x86/vm.c b/lib/x86/vm.c
index 9c94ca5..906fbf2 100644
--- a/lib/x86/vm.c
+++ b/lib/x86/vm.c
@@ -49,16 +49,16 @@ unsigned long *install_pte(unsigned long *cr3,
 
     for (level = PAGE_LEVEL; level > pte_level; --level) {
 	offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
-	if (!(pt[offset] & PTE_PRESENT)) {
+	if (!(pt[offset] & PT_PRESENT_MASK)) {
 	    unsigned long *new_pt = pt_page;
             if (!new_pt)
                 new_pt = alloc_page();
             else
                 pt_page = 0;
 	    memset(new_pt, 0, PAGE_SIZE);
-	    pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE | PTE_USER;
+	    pt[offset] = virt_to_phys(new_pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK;
 	}
-	pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
+	pt = phys_to_virt(pt[offset] & PT_ADDR_MASK);
     }
     offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
     pt[offset] = pte;
@@ -74,11 +74,11 @@ unsigned long *get_pte(unsigned long *cr3, void *virt)
     for (level = PAGE_LEVEL; level > 1; --level) {
 	offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
 	pte = pt[offset];
-	if (!(pte & PTE_PRESENT))
+	if (!(pte & PT_PRESENT_MASK))
 	    return NULL;
-	if (level == 2 && (pte & PTE_PSE))
+	if (level == 2 && (pte & PT_PAGE_SIZE_MASK))
 	    return &pt[offset];
-	pt = phys_to_virt(pte & 0xffffffffff000ull);
+	pt = phys_to_virt(pte & PT_ADDR_MASK);
     }
     offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
     return &pt[offset];
@@ -89,14 +89,14 @@ unsigned long *install_large_page(unsigned long *cr3,
 				  void *virt)
 {
     return install_pte(cr3, 2, virt,
-		       phys | PTE_PRESENT | PTE_WRITE | PTE_USER | PTE_PSE, 0);
+		       phys | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK | PT_PAGE_SIZE_MASK, 0);
 }
 
 unsigned long *install_page(unsigned long *cr3,
 			    unsigned long phys,
 			    void *virt)
 {
-    return install_pte(cr3, 1, virt, phys | PTE_PRESENT | PTE_WRITE | PTE_USER, 0);
+    return install_pte(cr3, 1, virt, phys | PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK, 0);
 }
 
 
@@ -178,7 +178,7 @@ void *vmalloc(unsigned long size)
 
 uint64_t virt_to_phys_cr3(void *mem)
 {
-    return (*get_pte(phys_to_virt(read_cr3()), mem) & PTE_ADDR) + ((ulong)mem & (PAGE_SIZE - 1));
+    return (*get_pte(phys_to_virt(read_cr3()), mem) & PT_ADDR_MASK) + ((ulong)mem & (PAGE_SIZE - 1));
 }
 
 void vfree(void *mem)
@@ -186,7 +186,7 @@ void vfree(void *mem)
     unsigned long size = ((unsigned long *)mem)[-1];
 
     while (size) {
-	free_page(phys_to_virt(*get_pte(phys_to_virt(read_cr3()), mem) & PTE_ADDR));
+	free_page(phys_to_virt(*get_pte(phys_to_virt(read_cr3()), mem) & PT_ADDR_MASK));
 	mem += PAGE_SIZE;
 	size -= PAGE_SIZE;
     }
diff --git a/x86/access.c b/x86/access.c
index aaf805d..0546dbb 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)
 
@@ -493,7 +485,7 @@ 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 |= PT_PAGE_SIZE_MASK;
                 if (F(AC_PKU_PKEY))
                     pte |= 1ull << 59;
 	    }
@@ -508,7 +500,7 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
 	    if (F(AC_PDE_DIRTY))
 		pte |= PT_DIRTY_MASK;
 	    if (F(AC_PDE_NX))
-		pte |= PT_NX_MASK;
+		pte |= PT64_NX_MASK;
 	    if (F(AC_PDE_BIT51))
 		pte |= 1ull << 51;
 	    if (F(AC_PDE_BIT13))
@@ -530,7 +522,7 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page,
 	    if (F(AC_PTE_DIRTY))
 		pte |= PT_DIRTY_MASK;
 	    if (F(AC_PTE_NX))
-		pte |= PT_NX_MASK;
+		pte |= PT64_NX_MASK;
 	    if (F(AC_PTE_BIT51))
 		pte |= 1ull << 51;
 	    at->ptep = &vroot[index];
diff --git a/x86/asyncpf.c b/x86/asyncpf.c
index 304d015..a6051ab 100644
--- a/x86/asyncpf.c
+++ b/x86/asyncpf.c
@@ -69,7 +69,7 @@ static void pf_isr(struct ex_regs *r)
 			report("Got present #PF token %x\n", true, read_cr2());
 			if ((uint32_t)read_cr2() == ~0)
 				break;
-			install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PTE_PRESENT | PTE_WRITE, 0);
+			install_pte(phys_to_virt(read_cr3()), 1, virt, phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 			write_cr3(read_cr3());
 			phys = 0;
 			break;
diff --git a/x86/eventinj.c b/x86/eventinj.c
index 84dfe71..9ee557b 100644
--- a/x86/eventinj.c
+++ b/x86/eventinj.c
@@ -52,7 +52,7 @@ void do_pf_tss(void)
 {
 	printf("PF running\n");
 	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
-		    stack_phys | PTE_PRESENT | PTE_WRITE, 0);
+		    stack_phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 	invlpg(stack_va);
 }
 
@@ -363,7 +363,7 @@ int main()
 	printf("Try to divide by 0\n");
 	/* install read only pte */
 	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
-		    stack_phys | PTE_PRESENT, 0);
+		    stack_phys | PT_PRESENT_MASK, 0);
 	invlpg(stack_va);
 	flush_phys_addr(stack_phys);
 	switch_stack(stack_va + 4095);
@@ -382,7 +382,7 @@ int main()
 	set_idt_sel(33, NP_SEL);
 	/* install read only pte */
 	install_pte(phys_to_virt(read_cr3()), 1, stack_va,
-		    stack_phys | PTE_PRESENT, 0);
+		    stack_phys | PT_PRESENT_MASK, 0);
 	invlpg(stack_va);
 	flush_idt_page();
 	flush_phys_addr(stack_phys);
@@ -398,8 +398,8 @@ int main()
 	/* use shadowed stack during interrupt delivery */
 	for (i = 0; i < 4096/sizeof(ulong); i++) {
 		if (!cr3[i]) {
-			cr3[i] = virt_to_phys(pt) | PTE_PRESENT | PTE_WRITE;
-			pt[0] = virt_to_phys(pt) | PTE_PRESENT | PTE_WRITE;
+			cr3[i] = virt_to_phys(pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK;
+			pt[0] = virt_to_phys(pt) | PT_PRESENT_MASK | PT_WRITABLE_MASK;
 #ifndef __x86_64__
 			((ulong*)(i<<22))[1] = 0;
 #else
diff --git a/x86/hypercall.c b/x86/hypercall.c
index 75179a1..9380f78 100644
--- a/x86/hypercall.c
+++ b/x86/hypercall.c
@@ -65,7 +65,7 @@ int main(int ac, char **av)
 	u8 *topmost = (void *) ((1ul << 47) - PAGE_SIZE);
 
 	install_pte(phys_to_virt(read_cr3()), 1, topmost,
-		    virt_to_phys(data1) | PTE_PRESENT | PTE_WRITE, 0);
+		    virt_to_phys(data1) | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 	memset(topmost, 0xcc, PAGE_SIZE);
 	topmost[4093] = 0x0f;
 	topmost[4094] = 0x01;
diff --git a/x86/pku.c b/x86/pku.c
index df51d1b..e742735 100644
--- a/x86/pku.c
+++ b/x86/pku.c
@@ -77,7 +77,7 @@ int main(int ac, char **av)
     wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_LMA);
 
     for (i = 0; i < USER_BASE; i += PAGE_SIZE) {
-        *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PTE_USER;
+        *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PT_USER_MASK;
         *get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) |= ((unsigned long)pkey << PTE_PKEY_BIT);
         invlpg((void *)i);
     }
diff --git a/x86/rmap_chain.c b/x86/rmap_chain.c
index b356a37..7bf6275 100644
--- a/x86/rmap_chain.c
+++ b/x86/rmap_chain.c
@@ -36,7 +36,7 @@ int main (void)
 
     virt_addr += PAGE_SIZE;
     install_pte(phys_to_virt(read_cr3()), 1, virt_addr,
-                0 | PTE_PRESENT | PTE_WRITE, target_page);
+                0 | PT_PRESENT_MASK | PT_WRITABLE_MASK, target_page);
 
     *(unsigned long *)virt_addr = 0;
     printf("PASS\n");
diff --git a/x86/smap.c b/x86/smap.c
index 69e7186..ace9dc0 100644
--- a/x86/smap.c
+++ b/x86/smap.c
@@ -62,7 +62,7 @@ static void check_smap_nowp(void)
 {
 	test = 0x99;
 
-	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) &= ~PTE_WRITE;
+	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) &= ~PT_WRITABLE_MASK;
 
 	write_cr4(read_cr4() & ~X86_CR4_SMAP);
 	write_cr0(read_cr0() & ~X86_CR0_WP);
@@ -81,7 +81,7 @@ static void check_smap_nowp(void)
 	report("read from user page with SMAP=1, AC=0, WP=0, PTE.U=1 && PTE.W=0", pf_count == 1 && save == 0x99);
 
 	/* Undo changes */
-	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) |= PTE_WRITE;
+	*get_pte(phys_to_virt(read_cr3()), USER_ADDR(test)) |= PT_WRITABLE_MASK;
 
 	write_cr0(read_cr0() | X86_CR0_WP);
 	write_cr3(read_cr3());
@@ -102,7 +102,7 @@ int main(int ac, char **av)
 
 	// Map first 16MB as supervisor pages
 	for (i = 0; i < USER_BASE; i += PAGE_SIZE) {
-		*get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PTE_USER;
+		*get_pte(phys_to_virt(read_cr3()), phys_to_virt(i)) &= ~PT_USER_MASK;
 		invlpg((void *)i);
 	}
 
diff --git a/x86/taskswitch2.c b/x86/taskswitch2.c
index d70b901..bb7345b 100644
--- a/x86/taskswitch2.c
+++ b/x86/taskswitch2.c
@@ -67,7 +67,7 @@ void do_pf_tss(ulong *error_code)
 	if (*error_code == 0x2) /* write access, not present */
 		test_count++;
 	install_pte(phys_to_virt(read_cr3()), 1, fault_addr,
-		    fault_phys | PTE_PRESENT | PTE_WRITE, 0);
+		    fault_phys | PT_PRESENT_MASK | PT_WRITABLE_MASK, 0);
 }
 
 extern void pf_tss(void);
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code
  2016-05-06  9:08 ` [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Andrew Jones
@ 2016-05-06 11:29   ` Alexander Gordeev
  0 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-05-06 11:29 UTC (permalink / raw)
  To: Andrew Jones; +Cc: kvm, Thomas Huth, Radim Krčmář

On Fri, May 06, 2016 at 11:08:14AM +0200, Andrew Jones wrote:
> > Changes since v6:
> >   - ioremap() PCD comment updated;
> >   - PT_PSE_MASK renamed to PT_PAGE_SIZE_MASK;
> >   - GENMASK_ULL used for PT_ADDR_MASK definition;
> >   - missed x86/taskswitch2.c update added;
> 
> I guess you found this by compiling 32bit x86. Good. Did you make
> sure both 32 and 64 bit can compile with each patch applied one
> at a time? If so, then (at least as far as I'm concerned) this
> series looks good to go.

Yes, I rechecked per-patch compiles.

> Radim, can you take a look and consider it for merge?

I also reposted v8 of 09/11 with PT64_NX_MASK instead of PT_NX_MASK.

> Thanks,
> drew

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2016-05-06 11:26 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-05 14:26 [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 01/11] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 02/11] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 03/11] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 04/11] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 05/11] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 06/11] io: Separate overrides of virt_to_phys() and phys_to_virt() Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 07/11] io: Disallow memory re-ordering for generic memory barriers Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 08/11] x86: Cleanup PAGE_* constants Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 09/11] x86: Cleanup PT_*_MASK flags Alexander Gordeev
2016-05-06  9:04   ` Andrew Jones
2016-05-06 11:22     ` [kvm-unit-tests PATCH v8 " Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 10/11] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
2016-05-05 14:26 ` [kvm-unit-tests PATCH v7 11/11] x86: io: Factor out ioremap() Alexander Gordeev
2016-05-06  9:06   ` Andrew Jones
2016-05-06  9:08 ` [kvm-unit-tests PATCH v7 00/11] Cleanup low-level arch code Andrew Jones
2016-05-06 11:29   ` Alexander Gordeev

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.