* [PATCH 1/9] Remove unused and unnecessary PHYS32 macro
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 13:54 ` Andrew Jones
2016-04-20 13:18 ` [PATCH 2/9] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
` (8 subsequent siblings)
9 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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>
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
* Re: [PATCH 1/9] Remove unused and unnecessary PHYS32 macro
2016-04-20 13:18 ` [PATCH 1/9] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
@ 2016-04-20 13:54 ` Andrew Jones
0 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-04-20 13:54 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 03:18:47PM +0200, Alexander Gordeev wrote:
> 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>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Reviewed-by: Andrew Jones <drjones@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
>
> --
> 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
* [PATCH 2/9] Move phys_addr_t type definition to lib/libcflat.h
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
2016-04-20 13:18 ` [PATCH 1/9] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 14:02 ` Andrew Jones
2016-04-20 13:18 ` [PATCH 3/9] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
` (7 subsequent siblings)
9 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
arm/selftest.c | 1 -
lib/alloc.h | 3 ---
lib/arm/asm/page.h | 2 --
lib/arm/asm/setup.h | 1 -
lib/arm/setup.c | 1 -
lib/libcflat.h | 3 +++
lib/powerpc/asm/setup.h | 1 -
7 files changed, 3 insertions(+), 9 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..81f5369 100644
--- a/lib/alloc.h
+++ b/lib/alloc.h
@@ -58,9 +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)
-
/*
* phys_alloc is a very simple allocator which allows physical memory
* to be partitioned into regions until all memory is allocated.
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/arm/asm/setup.h b/lib/arm/asm/setup.h
index cb8fdbd..a502a04 100644
--- a/lib/arm/asm/setup.h
+++ b/lib/arm/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 */
#include <asm/page.h>
#include <asm/pgtable-hwdef.h>
diff --git a/lib/arm/setup.c b/lib/arm/setup.c
index 8c6172f..1cba23a 100644
--- a/lib/arm/setup.c
+++ b/lib/arm/setup.c
@@ -13,7 +13,6 @@
#include <libcflat.h>
#include <libfdt/libfdt.h>
#include <devicetree.h>
-#include <alloc.h>
#include <asm/thread_info.h>
#include <asm/setup.h>
#include <asm/page.h>
diff --git a/lib/libcflat.h b/lib/libcflat.h
index b58a8a1..6aef14f 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -60,6 +60,9 @@ typedef _Bool bool;
#define PRIx64 __PRI64_PREFIX "x"
#define PRIxPTR __PRIPTR_PREFIX "x"
+typedef u64 phys_addr_t;
+#define INVALID_PHYS_ADDR (~(phys_addr_t)0)
+
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
* Re: [PATCH 2/9] Move phys_addr_t type definition to lib/libcflat.h
2016-04-20 13:18 ` [PATCH 2/9] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
@ 2016-04-20 14:02 ` Andrew Jones
0 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-04-20 14:02 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 03:18:48PM +0200, Alexander Gordeev wrote:
> 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>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> ---
> arm/selftest.c | 1 -
> lib/alloc.h | 3 ---
> lib/arm/asm/page.h | 2 --
> lib/arm/asm/setup.h | 1 -
> lib/arm/setup.c | 1 -
> lib/libcflat.h | 3 +++
> lib/powerpc/asm/setup.h | 1 -
> 7 files changed, 3 insertions(+), 9 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..81f5369 100644
> --- a/lib/alloc.h
> +++ b/lib/alloc.h
> @@ -58,9 +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)
Moving the typedef is fine, but INVALID_PHYS_ADDR is an arbitrary
address chosen by the phys-mem-alloc subsystem. In practice it's
probably invalid for everything else too, but it should probably
stay in alloc.h. I realize the naming isn't great, as it doesn't
convey the connection to alloc, but I'm not sure we want to rename
it now.
> -
> /*
> * phys_alloc is a very simple allocator which allows physical memory
> * to be partitioned into regions until all memory is allocated.
> 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/arm/asm/setup.h b/lib/arm/asm/setup.h
> index cb8fdbd..a502a04 100644
> --- a/lib/arm/asm/setup.h
> +++ b/lib/arm/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 */
> #include <asm/page.h>
> #include <asm/pgtable-hwdef.h>
>
> diff --git a/lib/arm/setup.c b/lib/arm/setup.c
> index 8c6172f..1cba23a 100644
> --- a/lib/arm/setup.c
> +++ b/lib/arm/setup.c
> @@ -13,7 +13,6 @@
> #include <libcflat.h>
> #include <libfdt/libfdt.h>
> #include <devicetree.h>
> -#include <alloc.h>
> #include <asm/thread_info.h>
> #include <asm/setup.h>
> #include <asm/page.h>
> diff --git a/lib/libcflat.h b/lib/libcflat.h
> index b58a8a1..6aef14f 100644
> --- a/lib/libcflat.h
> +++ b/lib/libcflat.h
> @@ -60,6 +60,9 @@ typedef _Bool bool;
> #define PRIx64 __PRI64_PREFIX "x"
> #define PRIxPTR __PRIPTR_PREFIX "x"
>
> +typedef u64 phys_addr_t;
> +#define INVALID_PHYS_ADDR (~(phys_addr_t)0)
> +
> 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
>
Thanks,
drew
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 3/9] x86: Introduce lib/x86/asm/page.h
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
2016-04-20 13:18 ` [PATCH 1/9] Remove unused and unnecessary PHYS32 macro Alexander Gordeev
2016-04-20 13:18 ` [PATCH 2/9] Move phys_addr_t type definition to lib/libcflat.h Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 13:18 ` [PATCH 4/9] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
` (6 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/page.h | 27 +++++++++++++++++++++++++++
lib/x86/vm.c | 17 -----------------
lib/x86/vm.h | 14 +-------------
3 files changed, 28 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..edfe325
--- /dev/null
+++ b/lib/x86/asm/page.h
@@ -0,0 +1,27 @@
+#ifndef _ASM_X86_PAGE_H_
+#define _ASM_X86_PAGE_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)
+
+#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
* [PATCH 4/9] x86: Introduce lib/x86/asm/io.h
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (2 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 3/9] x86: Introduce lib/x86/asm/page.h Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 13:18 ` [PATCH 5/9] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
` (5 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/io.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/x86/asm/pci.h | 2 +-
lib/x86/io.c | 2 +-
lib/x86/io.h | 40 ----------------------------------------
lib/x86/vm.h | 12 +-----------
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 -
15 files changed, 58 insertions(+), 67 deletions(-)
create mode 100644 lib/x86/asm/io.h
delete mode 100644 lib/x86/io.h
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
new file mode 100644
index 0000000..68b10e5
--- /dev/null
+++ b/lib/x86/asm/io.h
@@ -0,0 +1,52 @@
+#ifndef _ASM_X86_IO_H_
+#define _ASM_X86_IO_H_
+
+#include "asm/page.h"
+
+static inline unsigned char inb(unsigned short port)
+{
+ unsigned char value;
+ asm volatile("inb %w1, %0" : "=a" (value) : "Nd" (port));
+ return value;
+}
+
+static inline unsigned short inw(unsigned short port)
+{
+ unsigned short value;
+ asm volatile("inw %w1, %0" : "=a" (value) : "Nd" (port));
+ return value;
+}
+
+static inline unsigned int inl(unsigned short port)
+{
+ unsigned int value;
+ asm volatile("inl %w1, %0" : "=a" (value) : "Nd" (port));
+ return value;
+}
+
+static inline void outb(unsigned char value, unsigned short port)
+{
+ asm volatile("outb %b0, %w1" : : "a"(value), "Nd"(port));
+}
+
+static inline void outw(unsigned short value, unsigned short port)
+{
+ asm volatile("outw %w0, %w1" : : "a"(value), "Nd"(port));
+}
+
+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/io.h b/lib/x86/io.h
deleted file mode 100644
index bd6341c..0000000
--- a/lib/x86/io.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef IO_H
-#define IO_H
-
-static inline unsigned char inb(unsigned short port)
-{
- unsigned char value;
- asm volatile("inb %w1, %0" : "=a" (value) : "Nd" (port));
- return value;
-}
-
-static inline unsigned short inw(unsigned short port)
-{
- unsigned short value;
- asm volatile("inw %w1, %0" : "=a" (value) : "Nd" (port));
- return value;
-}
-
-static inline unsigned int inl(unsigned short port)
-{
- unsigned int value;
- asm volatile("inl %w1, %0" : "=a" (value) : "Nd" (port));
- return value;
-}
-
-static inline void outb(unsigned char value, unsigned short port)
-{
- asm volatile("outb %b0, %w1" : : "a"(value), "Nd"(port));
-}
-
-static inline void outw(unsigned short value, unsigned short port)
-{
- asm volatile("outw %w0, %w1" : : "a"(value), "Nd"(port));
-}
-
-static inline void outl(unsigned int value, unsigned short port)
-{
- asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
-}
-
-#endif
diff --git a/lib/x86/vm.h b/lib/x86/vm.h
index 72f84e6..21ed2b6 100644
--- a/lib/x86/vm.h
+++ b/lib/x86/vm.h
@@ -2,7 +2,7 @@
#define VM_H
#include "processor.h"
-#include "asm/page.h"
+#include "asm/io.h"
void setup_vm();
@@ -27,14 +27,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
* [PATCH 5/9] x86: Introduce lib/x86/asm/barrier.h
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (3 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 4/9] x86: Introduce lib/x86/asm/io.h Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 13:18 ` [PATCH 6/9] x86: Optimize virt_to_phys() and phys_to_virt() Alexander Gordeev
` (4 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/barrier.h | 8 ++++++++
lib/x86/asm/io.h | 1 +
lib/x86/smp.h | 4 ----
x86/kvmclock.c | 1 +
4 files changed, 10 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..0ca1c56
--- /dev/null
+++ b/lib/x86/asm/barrier.h
@@ -0,0 +1,8 @@
+#ifndef _ASM_X86_BARRIER_H_
+#define _ASM_X86_BARRIER_H_
+
+#define mb() asm volatile("mfence":::"memory")
+#define rmb() asm volatile("lfence":::"memory")
+#define wmb() asm volatile("sfence" ::: "memory")
+
+#endif
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index 68b10e5..5b901a3 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -2,6 +2,7 @@
#define _ASM_X86_IO_H_
#include "asm/page.h"
+#include "asm/barrier.h"
static inline unsigned char inb(unsigned short port)
{
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/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
* [PATCH 6/9] x86: Optimize virt_to_phys() and phys_to_virt()
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (4 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 5/9] x86: Introduce lib/x86/asm/barrier.h Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 13:18 ` [PATCH 7/9] io: Introduce generic IO accessors Alexander Gordeev
` (3 subsequent siblings)
9 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Make use of generic implementations and remove x86
specific virt_to_phys() and phys_to_virt() functions.
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/asm-generic/io.h | 2 ++
lib/x86/asm/io.h | 10 +---------
lib/x86/asm/page.h | 3 +++
3 files changed, 6 insertions(+), 9 deletions(-)
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);
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index 5b901a3..74451d5 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -40,14 +40,6 @@ 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;
-}
+#include <asm-generic/io.h>
#endif
diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h
index edfe325..a9280ed 100644
--- a/lib/x86/asm/page.h
+++ b/lib/x86/asm/page.h
@@ -24,4 +24,7 @@
#define PGDIR_MASK 1023
#endif
+#define __va(x) ((void *)((unsigned long) (x)))
+#define __pa(x) ((unsigned long) (x))
+
#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 7/9] io: Introduce generic IO accessors
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (5 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 6/9] x86: Optimize virt_to_phys() and phys_to_virt() Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 14:09 ` Andrew Jones
2016-04-20 13:18 ` [PATCH 8/9] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
` (2 subsequent siblings)
9 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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/asm-generic/io.h | 42 ++++++++++++++++++++++++++++++++++++++++++
lib/x86/asm/io.h | 30 ++++++++++++++++++------------
2 files changed, 60 insertions(+), 12 deletions(-)
diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
index 3585ac0..5c29ece 100644
--- a/lib/asm-generic/io.h
+++ b/lib/asm-generic/io.h
@@ -152,6 +152,48 @@ static inline u64 __bswap64(u64 x)
#define writeq(b, addr) \
({ wmb(); __raw_writeq(cpu_to_le64(b), addr); })
+#ifndef inb
+static inline uint8_t inb(unsigned long port)
+{
+ return readb((const volatile void __iomem *)port);
+}
+#endif
+
+#ifndef inw
+static inline uint16_t inw(unsigned long port)
+{
+ return readw((const volatile void __iomem *)port);
+}
+#endif
+
+#ifndef inl
+static inline uint32_t inl(unsigned long port)
+{
+ return readl((const volatile void __iomem *)port);
+}
+#endif
+
+#ifndef outb
+static inline void outb(uint8_t value, unsigned long port)
+{
+ writeb(value, (volatile void __iomem *)port);
+}
+#endif
+
+#ifndef outw
+static inline void outw(uint16_t value, unsigned long port)
+{
+ writew(value, (volatile void __iomem *)port);
+}
+#endif
+
+#ifndef outl
+static inline void outl(uint32_t value, unsigned long port)
+{
+ writel(value, (volatile void __iomem *)port);
+}
+#endif
+
#ifndef ioremap
static inline void *ioremap(u64 phys_addr, size_t size __unused)
{
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index 74451d5..03f41af 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -4,40 +4,46 @@
#include "asm/page.h"
#include "asm/barrier.h"
-static inline unsigned char inb(unsigned short port)
+#define inb inb
+static inline uint8_t inb(unsigned long port)
{
unsigned char value;
- asm volatile("inb %w1, %0" : "=a" (value) : "Nd" (port));
+ asm volatile("inb %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
return value;
}
-static inline unsigned short inw(unsigned short port)
+#define inw inw
+static inline uint16_t inw(unsigned long port)
{
unsigned short value;
- asm volatile("inw %w1, %0" : "=a" (value) : "Nd" (port));
+ asm volatile("inw %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
return value;
}
-static inline unsigned int inl(unsigned short port)
+#define inl inl
+static inline uint32_t inl(unsigned long port)
{
unsigned int value;
- asm volatile("inl %w1, %0" : "=a" (value) : "Nd" (port));
+ asm volatile("inl %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
return value;
}
-static inline void outb(unsigned char value, unsigned short port)
+#define outb outb
+static inline void outb(uint8_t value, unsigned long port)
{
- asm volatile("outb %b0, %w1" : : "a"(value), "Nd"(port));
+ asm volatile("outb %b0, %w1" : : "a"(value), "Nd"((unsigned short)port));
}
-static inline void outw(unsigned short value, unsigned short port)
+#define outw outw
+static inline void outw(uint16_t value, unsigned long port)
{
- asm volatile("outw %w0, %w1" : : "a"(value), "Nd"(port));
+ asm volatile("outw %w0, %w1" : : "a"(value), "Nd"((unsigned short)port));
}
-static inline void outl(unsigned int value, unsigned short port)
+#define outl outl
+static inline void outl(uint32_t value, unsigned long port)
{
- asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
+ asm volatile("outl %0, %w1" : : "a"(value), "Nd"((unsigned short)port));
}
#include <asm-generic/io.h>
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 7/9] io: Introduce generic IO accessors
2016-04-20 13:18 ` [PATCH 7/9] io: Introduce generic IO accessors Alexander Gordeev
@ 2016-04-20 14:09 ` Andrew Jones
2016-04-21 6:37 ` Alexander Gordeev
0 siblings, 1 reply; 17+ messages in thread
From: Andrew Jones @ 2016-04-20 14:09 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 03:18:53PM +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/asm-generic/io.h | 42 ++++++++++++++++++++++++++++++++++++++++++
> lib/x86/asm/io.h | 30 ++++++++++++++++++------------
> 2 files changed, 60 insertions(+), 12 deletions(-)
>
> diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
> index 3585ac0..5c29ece 100644
> --- a/lib/asm-generic/io.h
> +++ b/lib/asm-generic/io.h
> @@ -152,6 +152,48 @@ static inline u64 __bswap64(u64 x)
> #define writeq(b, addr) \
> ({ wmb(); __raw_writeq(cpu_to_le64(b), addr); })
>
> +#ifndef inb
> +static inline uint8_t inb(unsigned long port)
> +{
> + return readb((const volatile void __iomem *)port);
> +}
> +#endif
> +
> +#ifndef inw
> +static inline uint16_t inw(unsigned long port)
> +{
> + return readw((const volatile void __iomem *)port);
> +}
> +#endif
> +
> +#ifndef inl
> +static inline uint32_t inl(unsigned long port)
> +{
> + return readl((const volatile void __iomem *)port);
> +}
> +#endif
> +
> +#ifndef outb
> +static inline void outb(uint8_t value, unsigned long port)
> +{
> + writeb(value, (volatile void __iomem *)port);
> +}
> +#endif
> +
> +#ifndef outw
> +static inline void outw(uint16_t value, unsigned long port)
> +{
> + writew(value, (volatile void __iomem *)port);
> +}
> +#endif
> +
> +#ifndef outl
> +static inline void outl(uint32_t value, unsigned long port)
> +{
> + writel(value, (volatile void __iomem *)port);
> +}
> +#endif
> +
> #ifndef ioremap
> static inline void *ioremap(u64 phys_addr, size_t size __unused)
> {
> diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> index 74451d5..03f41af 100644
> --- a/lib/x86/asm/io.h
> +++ b/lib/x86/asm/io.h
> @@ -4,40 +4,46 @@
> #include "asm/page.h"
> #include "asm/barrier.h"
>
> -static inline unsigned char inb(unsigned short port)
> +#define inb inb
> +static inline uint8_t inb(unsigned long port)
> {
> unsigned char value;
> - asm volatile("inb %w1, %0" : "=a" (value) : "Nd" (port));
> + asm volatile("inb %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
> return value;
> }
>
> -static inline unsigned short inw(unsigned short port)
> +#define inw inw
> +static inline uint16_t inw(unsigned long port)
> {
> unsigned short value;
> - asm volatile("inw %w1, %0" : "=a" (value) : "Nd" (port));
> + asm volatile("inw %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
> return value;
> }
>
> -static inline unsigned int inl(unsigned short port)
> +#define inl inl
> +static inline uint32_t inl(unsigned long port)
> {
> unsigned int value;
> - asm volatile("inl %w1, %0" : "=a" (value) : "Nd" (port));
> + asm volatile("inl %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
> return value;
> }
>
> -static inline void outb(unsigned char value, unsigned short port)
> +#define outb outb
> +static inline void outb(uint8_t value, unsigned long port)
> {
> - asm volatile("outb %b0, %w1" : : "a"(value), "Nd"(port));
> + asm volatile("outb %b0, %w1" : : "a"(value), "Nd"((unsigned short)port));
> }
>
> -static inline void outw(unsigned short value, unsigned short port)
> +#define outw outw
> +static inline void outw(uint16_t value, unsigned long port)
> {
> - asm volatile("outw %w0, %w1" : : "a"(value), "Nd"(port));
> + asm volatile("outw %w0, %w1" : : "a"(value), "Nd"((unsigned short)port));
> }
>
> -static inline void outl(unsigned int value, unsigned short port)
> +#define outl outl
> +static inline void outl(uint32_t value, unsigned long port)
> {
> - asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
> + asm volatile("outl %0, %w1" : : "a"(value), "Nd"((unsigned short)port));
> }
>
> #include <asm-generic/io.h>
> --
> 1.8.3.1
>
I'm not sure we need this patch, and I know Radim didn't like it when
I've proposed it in the past :-)
drew
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 7/9] io: Introduce generic IO accessors
2016-04-20 14:09 ` Andrew Jones
@ 2016-04-21 6:37 ` Alexander Gordeev
0 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-21 6:37 UTC (permalink / raw)
To: Andrew Jones; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 04:09:05PM +0200, Andrew Jones wrote:
> On Wed, Apr 20, 2016 at 03:18:53PM +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/asm-generic/io.h | 42 ++++++++++++++++++++++++++++++++++++++++++
> > lib/x86/asm/io.h | 30 ++++++++++++++++++------------
> > 2 files changed, 60 insertions(+), 12 deletions(-)
> >
> > diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
> > index 3585ac0..5c29ece 100644
> > --- a/lib/asm-generic/io.h
> > +++ b/lib/asm-generic/io.h
> > @@ -152,6 +152,48 @@ static inline u64 __bswap64(u64 x)
> > #define writeq(b, addr) \
> > ({ wmb(); __raw_writeq(cpu_to_le64(b), addr); })
> >
> > +#ifndef inb
> > +static inline uint8_t inb(unsigned long port)
> > +{
> > + return readb((const volatile void __iomem *)port);
> > +}
> > +#endif
> > +
> > +#ifndef inw
> > +static inline uint16_t inw(unsigned long port)
> > +{
> > + return readw((const volatile void __iomem *)port);
> > +}
> > +#endif
> > +
> > +#ifndef inl
> > +static inline uint32_t inl(unsigned long port)
> > +{
> > + return readl((const volatile void __iomem *)port);
> > +}
> > +#endif
> > +
> > +#ifndef outb
> > +static inline void outb(uint8_t value, unsigned long port)
> > +{
> > + writeb(value, (volatile void __iomem *)port);
> > +}
> > +#endif
> > +
> > +#ifndef outw
> > +static inline void outw(uint16_t value, unsigned long port)
> > +{
> > + writew(value, (volatile void __iomem *)port);
> > +}
> > +#endif
> > +
> > +#ifndef outl
> > +static inline void outl(uint32_t value, unsigned long port)
> > +{
> > + writel(value, (volatile void __iomem *)port);
> > +}
> > +#endif
> > +
> > #ifndef ioremap
> > static inline void *ioremap(u64 phys_addr, size_t size __unused)
> > {
> > diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> > index 74451d5..03f41af 100644
> > --- a/lib/x86/asm/io.h
> > +++ b/lib/x86/asm/io.h
> > @@ -4,40 +4,46 @@
> > #include "asm/page.h"
> > #include "asm/barrier.h"
> >
> > -static inline unsigned char inb(unsigned short port)
> > +#define inb inb
> > +static inline uint8_t inb(unsigned long port)
> > {
> > unsigned char value;
> > - asm volatile("inb %w1, %0" : "=a" (value) : "Nd" (port));
> > + asm volatile("inb %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
> > return value;
> > }
> >
> > -static inline unsigned short inw(unsigned short port)
> > +#define inw inw
> > +static inline uint16_t inw(unsigned long port)
> > {
> > unsigned short value;
> > - asm volatile("inw %w1, %0" : "=a" (value) : "Nd" (port));
> > + asm volatile("inw %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
> > return value;
> > }
> >
> > -static inline unsigned int inl(unsigned short port)
> > +#define inl inl
> > +static inline uint32_t inl(unsigned long port)
> > {
> > unsigned int value;
> > - asm volatile("inl %w1, %0" : "=a" (value) : "Nd" (port));
> > + asm volatile("inl %w1, %0" : "=a" (value) : "Nd" ((unsigned short)port));
> > return value;
> > }
> >
> > -static inline void outb(unsigned char value, unsigned short port)
> > +#define outb outb
> > +static inline void outb(uint8_t value, unsigned long port)
> > {
> > - asm volatile("outb %b0, %w1" : : "a"(value), "Nd"(port));
> > + asm volatile("outb %b0, %w1" : : "a"(value), "Nd"((unsigned short)port));
> > }
> >
> > -static inline void outw(unsigned short value, unsigned short port)
> > +#define outw outw
> > +static inline void outw(uint16_t value, unsigned long port)
> > {
> > - asm volatile("outw %w0, %w1" : : "a"(value), "Nd"(port));
> > + asm volatile("outw %w0, %w1" : : "a"(value), "Nd"((unsigned short)port));
> > }
> >
> > -static inline void outl(unsigned int value, unsigned short port)
> > +#define outl outl
> > +static inline void outl(uint32_t value, unsigned long port)
> > {
> > - asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
> > + asm volatile("outl %0, %w1" : : "a"(value), "Nd"((unsigned short)port));
> > }
> >
> > #include <asm-generic/io.h>
> > --
> > 1.8.3.1
> >
>
> I'm not sure we need this patch, and I know Radim didn't like it when
> I've proposed it in the past :-)
It is not required for this series as there are no consumers, indeed.
But it will be needed for the PCI series anyway :)
> drew
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 8/9] io: Make ioremap() prototype conform to Linux one
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (6 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 7/9] io: Introduce generic IO accessors Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 14:10 ` Andrew Jones
2016-04-20 13:18 ` [PATCH 9/9] io/x86: Factor out ioremap() Alexander Gordeev
2016-04-20 14:13 ` [PATCH 0/9] x86: Cleanup low-level arch code Andrew Jones
9 siblings, 1 reply; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 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>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/asm-generic/io.h | 4 ++--
lib/x86/asm/io.h | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
index 5c29ece..1ac2b97 100644
--- a/lib/asm-generic/io.h
+++ b/lib/asm-generic/io.h
@@ -195,10 +195,10 @@ static inline void outl(uint32_t value, unsigned long port)
#endif
#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 *)phys_addr;
}
#endif
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index 03f41af..fe975ff 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -4,6 +4,8 @@
#include "asm/page.h"
#include "asm/barrier.h"
+#define __iomem
+
#define inb inb
static inline uint8_t inb(unsigned long port)
{
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 8/9] io: Make ioremap() prototype conform to Linux one
2016-04-20 13:18 ` [PATCH 8/9] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
@ 2016-04-20 14:10 ` Andrew Jones
2016-04-21 6:19 ` Alexander Gordeev
0 siblings, 1 reply; 17+ messages in thread
From: Andrew Jones @ 2016-04-20 14:10 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 03:18:54PM +0200, Alexander Gordeev wrote:
> 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>
> Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> ---
> lib/asm-generic/io.h | 4 ++--
> lib/x86/asm/io.h | 2 ++
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
> index 5c29ece..1ac2b97 100644
> --- a/lib/asm-generic/io.h
> +++ b/lib/asm-generic/io.h
> @@ -195,10 +195,10 @@ static inline void outl(uint32_t value, unsigned long port)
> #endif
>
> #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 *)phys_addr;
Now that you've removed the unsigned long cast, what happens on 32bit builds
here? Doesn't it fail to compile due to a bad cast?
> }
> #endif
>
> diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> index 03f41af..fe975ff 100644
> --- a/lib/x86/asm/io.h
> +++ b/lib/x86/asm/io.h
> @@ -4,6 +4,8 @@
> #include "asm/page.h"
> #include "asm/barrier.h"
>
> +#define __iomem
> +
> #define inb inb
> static inline uint8_t inb(unsigned long port)
> {
> --
> 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: [PATCH 8/9] io: Make ioremap() prototype conform to Linux one
2016-04-20 14:10 ` Andrew Jones
@ 2016-04-21 6:19 ` Alexander Gordeev
0 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-21 6:19 UTC (permalink / raw)
To: Andrew Jones; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 04:10:42PM +0200, Andrew Jones wrote:
> On Wed, Apr 20, 2016 at 03:18:54PM +0200, Alexander Gordeev wrote:
> > 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>
> > Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
> > ---
> > lib/asm-generic/io.h | 4 ++--
> > lib/x86/asm/io.h | 2 ++
> > 2 files changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/asm-generic/io.h b/lib/asm-generic/io.h
> > index 5c29ece..1ac2b97 100644
> > --- a/lib/asm-generic/io.h
> > +++ b/lib/asm-generic/io.h
> > @@ -195,10 +195,10 @@ static inline void outl(uint32_t value, unsigned long port)
> > #endif
> >
> > #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 *)phys_addr;
>
> Now that you've removed the unsigned long cast, what happens on 32bit builds
> here? Doesn't it fail to compile due to a bad cast?
Indeed, it does :/
> > }
> > #endif
> >
> > diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
> > index 03f41af..fe975ff 100644
> > --- a/lib/x86/asm/io.h
> > +++ b/lib/x86/asm/io.h
> > @@ -4,6 +4,8 @@
> > #include "asm/page.h"
> > #include "asm/barrier.h"
> >
> > +#define __iomem
> > +
> > #define inb inb
> > static inline uint8_t inb(unsigned long port)
> > {
> > --
> > 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
* [PATCH 9/9] io/x86: Factor out ioremap()
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (7 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 8/9] io: Make ioremap() prototype conform to Linux one Alexander Gordeev
@ 2016-04-20 13:18 ` Alexander Gordeev
2016-04-20 14:13 ` [PATCH 0/9] x86: Cleanup low-level arch code Andrew Jones
9 siblings, 0 replies; 17+ messages in thread
From: Alexander Gordeev @ 2016-04-20 13:18 UTC (permalink / raw)
To: kvm
Cc: Alexander Gordeev, Andrew Jones, Thomas Huth,
Radim Krčmář
Cc: Andrew Jones <drjones@redhat.com>
Cc: Thomas Huth <thuth@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
lib/x86/asm/io.h | 3 +++
lib/x86/io.c | 14 ++++++++++++++
x86/vmexit.c | 10 ++--------
3 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h
index fe975ff..5299711 100644
--- a/lib/x86/asm/io.h
+++ b/lib/x86/asm/io.h
@@ -48,6 +48,9 @@ static inline void outl(uint32_t value, unsigned long port)
asm volatile("outl %0, %w1" : : "a"(value), "Nd"((unsigned short)port));
}
+#define ioremap ioremap
+void __iomem *ioremap(phys_addr_t phys_addr, size_t size);
+
#include <asm-generic/io.h>
#endif
diff --git a/lib/x86/io.c b/lib/x86/io.c
index d396d42..a699509 100644
--- a/lib/x86/io.c
+++ b/lib/x86/io.c
@@ -1,4 +1,5 @@
#include "libcflat.h"
+#include "vm.h"
#include "smp.h"
#include "asm/io.h"
#ifndef USE_SERIAL
@@ -81,3 +82,16 @@ 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 = ALIGN(phys_addr, PAGE_SIZE);
+ phys_addr_t off = phys_addr - base;
+ ulong nr = ALIGN(off + size + (PAGE_SIZE - 1), PAGE_SIZE) / PAGE_SIZE;
+ void *page = alloc_vpages(nr);
+
+ install_page((void *)read_cr3(), base, page);
+
+ return page + off;
+}
+
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: [PATCH 0/9] x86: Cleanup low-level arch code
2016-04-20 13:18 [PATCH 0/9] x86: Cleanup low-level arch code Alexander Gordeev
` (8 preceding siblings ...)
2016-04-20 13:18 ` [PATCH 9/9] io/x86: Factor out ioremap() Alexander Gordeev
@ 2016-04-20 14:13 ` Andrew Jones
9 siblings, 0 replies; 17+ messages in thread
From: Andrew Jones @ 2016-04-20 14:13 UTC (permalink / raw)
To: Alexander Gordeev; +Cc: kvm, Thomas Huth, Radim Krčmář
On Wed, Apr 20, 2016 at 03:18:46PM +0200, Alexander Gordeev wrote:
> Hi all,
>
> This is an attempt to make mainly x86 IO code more consistent
> with other architectures. The series paves the way for the
> PCI update I sent earlier, but it also may be of interest
> by itself.
>
> Thanks!
>
> Cc: Andrew Jones <drjones@redhat.com>
> Cc: Thomas Huth <thuth@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
>
> Alexander Gordeev (9):
> 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
> x86: Optimize virt_to_phys() and phys_to_virt()
> io: Introduce generic IO accessors
> io: Make ioremap() prototype conform to Linux one
> io/x86: Factor out ioremap()
All the patches look pretty good to me (minus a few comments I had).
Let's see what x86 people say.
drew
>
> arm/selftest.c | 1 -
> lib/alloc.h | 7 -------
> lib/arm/asm/page.h | 2 --
> lib/arm/asm/setup.h | 1 -
> lib/arm/setup.c | 1 -
> lib/asm-generic/io.h | 48 ++++++++++++++++++++++++++++++++++++++++--
> lib/libcflat.h | 3 +++
> lib/powerpc/asm/setup.h | 1 -
> lib/x86/asm/barrier.h | 8 +++++++
> lib/x86/asm/io.h | 56 +++++++++++++++++++++++++++++++++++++++++++++++++
> lib/x86/asm/page.h | 30 ++++++++++++++++++++++++++
> lib/x86/asm/pci.h | 2 +-
> lib/x86/io.c | 16 +++++++++++++-
> lib/x86/io.h | 40 -----------------------------------
> lib/x86/smp.h | 4 ----
> lib/x86/vm.c | 17 ---------------
> lib/x86/vm.h | 24 +--------------------
> 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/kvmclock.c | 1 +
> x86/svm.c | 1 -
> x86/vmexit.c | 11 ++--------
> x86/vmx.c | 1 -
> x86/vmx_tests.c | 1 -
> 28 files changed, 166 insertions(+), 123 deletions(-)
> create mode 100644 lib/x86/asm/barrier.h
> create mode 100644 lib/x86/asm/io.h
> create mode 100644 lib/x86/asm/page.h
> delete mode 100644 lib/x86/io.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