* [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.