All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support
@ 2017-02-07  2:56 Sam Bobroff
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt() Sam Bobroff
                   ` (10 more replies)
  0 siblings, 11 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david


Because KVM will soon provide the necessary infrastructure for KVM guests to
run on POWER9 CPUs, we can now start exploiting this new functionality from
QEMU. See:
https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-January/153433.html

This work is not yet complete but it is functional and is presented for early
review. It overlaps in some places with current work supporting the same guests
under full emulation.

This set aims to support only the following scenarios:
* A POWER9 host running in radix mode, running a guest in radix mode.
* A POWER9 host running in hash mode, running a guest in hash mode.
* A POWER9 host running in hash mode, running a guest in legacy(+) mode.
(+) Where legacy means that the guest does not support ISA 3.00.

Hash or radix mode for the host is controlled via the "disable_radix" kernel
command line parameter: the host will use radix unless disable_radix is given.
For the guest it should be automatically selected to match the host.

Bad legacy guests: There are some recent kernels (e.g. 4.9) that will, when run
as a KVM guest and if the ibm,pa-features entry in the device tree has the
Radix MMU bit set, attempt to initialize the MMU as if they were a host (which
will cause them to crash). To avoid exposing this problem, the Radix MMU bit
is removed from ibm,pa-features when a legacy guest is detected.

Prerequsites:
* This set is based on current QEMU master, but relies on some work already posted here:
https://lists.gnu.org/archive/html/qemu-devel/2017-01/msg02527.html
Specifically patches 1..4 which set up the new CPU and MMU models.

Notes:
    * Migration/snapshots are not yet investigated.
    * If the host cannot support the guest (e.g. radix host and a legacy guest)
      then the guest will crash but QEMU should probably terminate with a
      descriptive message.


Sam Bobroff (9):
  spapr: fix off-by-one error in spapr_ovec_populate_dt()
  Update headers using update-linux-headers.sh
  spapr: Add ibm,processor-radix-AP-encodings to the device tree
  target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3
  spapr: Only setup HTP if necessary.
  spapr: Add h_register_process_table() hypercall
  spapr: Set ISA 3.00 radix and hash bits in OV5
  spapr: Advertise ISA 3.0 MMU features in pa_features
  spapr: Small cleanup of PPC MMU enums

 hw/ppc/spapr.c                                     | 152 +++++---
 hw/ppc/spapr_hcall.c                               |  52 ++-
 hw/ppc/spapr_ovec.c                                |   2 +-
 include/hw/ppc/spapr.h                             |   4 +-
 include/hw/ppc/spapr_ovec.h                        |   6 +
 include/standard-headers/linux/input-event-codes.h |   2 +-
 include/standard-headers/linux/pci_regs.h          |   8 +
 include/standard-headers/linux/virtio_ids.h        |   1 +
 linux-headers/asm-arm/kvm.h                        |   2 +
 linux-headers/asm-arm/unistd.h                     | 419 +--------------------
 linux-headers/asm-powerpc/kvm.h                    |  25 ++
 linux-headers/asm-powerpc/unistd.h                 |   1 +
 linux-headers/asm-x86/kvm_para.h                   |   4 +-
 linux-headers/linux/kvm.h                          |  11 +-
 linux-headers/linux/vfio.h                         |  10 +
 target/ppc/cpu-qom.h                               |  12 +-
 target/ppc/cpu.h                                   |   5 +
 target/ppc/kvm.c                                   |  66 +++-
 target/ppc/kvm_ppc.h                               |  13 +
 target/ppc/mmu-hash64.c                            |  10 +-
 target/ppc/mmu_helper.c                            |  67 ++--
 target/ppc/translate.c                             |  12 +-
 22 files changed, 346 insertions(+), 538 deletions(-)

-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt()
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-07 15:47   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
  2017-02-07 22:12   ` [Qemu-devel] " Michael Roth
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh Sam Bobroff
                   ` (9 subsequent siblings)
  10 siblings, 2 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

The last byte of the option vector was missing due to an off-by-one
error. Without this fix, client architecture support negotiation will
fail because the last byte of option vector 5, which contains the MMU
support, will be missed.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 hw/ppc/spapr_ovec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
index 4f4c090a29..18dbc4a9ac 100644
--- a/hw/ppc/spapr_ovec.c
+++ b/hw/ppc/spapr_ovec.c
@@ -251,7 +251,7 @@ int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
         }
     }
 
-    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len);
+    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len + 1);
 }
 
 void spapr_ovec_ruler(int width, sPAPROptionVector *ov)
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt() Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-07 12:59   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
  2017-02-09  1:55   ` [Qemu-devel] " David Gibson
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree Sam Bobroff
                   ` (8 subsequent siblings)
  10 siblings, 2 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

This provides some new definitions needed by ISA 3.00 guests.

It is a large change because this is the first import since
some kernel header files have become autogenerated.

Note: update-linux-headers.sh currently generates a change that
(incorrectly) removes virtio_mmio.h and the change has been manually
adjusted to prevent that.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 include/standard-headers/linux/input-event-codes.h |   2 +-
 include/standard-headers/linux/pci_regs.h          |   8 +
 include/standard-headers/linux/virtio_ids.h        |   1 +
 linux-headers/asm-arm/kvm.h                        |   2 +
 linux-headers/asm-arm/unistd.h                     | 419 +--------------------
 linux-headers/asm-powerpc/kvm.h                    |  25 ++
 linux-headers/asm-powerpc/unistd.h                 |   1 +
 linux-headers/asm-x86/kvm_para.h                   |   4 +-
 linux-headers/linux/kvm.h                          |  11 +-
 linux-headers/linux/vfio.h                         |  10 +
 10 files changed, 63 insertions(+), 420 deletions(-)

diff --git a/include/standard-headers/linux/input-event-codes.h b/include/standard-headers/linux/input-event-codes.h
index 5c10f7e25d..c8b3338375 100644
--- a/include/standard-headers/linux/input-event-codes.h
+++ b/include/standard-headers/linux/input-event-codes.h
@@ -640,7 +640,7 @@
  * Control a data application associated with the currently viewed channel,
  * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.)
  */
-#define KEY_DATA			0x275
+#define KEY_DATA			0x277
 
 #define BTN_TRIGGER_HAPPY		0x2c0
 #define BTN_TRIGGER_HAPPY1		0x2c0
diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
index e5a2e68b22..174d114708 100644
--- a/include/standard-headers/linux/pci_regs.h
+++ b/include/standard-headers/linux/pci_regs.h
@@ -23,6 +23,14 @@
 #define LINUX_PCI_REGS_H
 
 /*
+ * Conventional PCI and PCI-X Mode 1 devices have 256 bytes of
+ * configuration space.  PCI-X Mode 2 and PCIe devices have 4096 bytes of
+ * configuration space.
+ */
+#define PCI_CFG_SPACE_SIZE	256
+#define PCI_CFG_SPACE_EXP_SIZE	4096
+
+/*
  * Under PCI, each device has 256 bytes of configuration address space,
  * of which the first 64 bytes are standardized as follows:
  */
diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h
index fe74e422d4..6d5c3b2d4f 100644
--- a/include/standard-headers/linux/virtio_ids.h
+++ b/include/standard-headers/linux/virtio_ids.h
@@ -43,4 +43,5 @@
 #define VIRTIO_ID_INPUT        18 /* virtio input */
 #define VIRTIO_ID_VSOCK        19 /* virtio vsock transport */
 #define VIRTIO_ID_CRYPTO       20 /* virtio crypto */
+
 #endif /* _LINUX_VIRTIO_IDS_H */
diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h
index 2fb7859465..09a555cc83 100644
--- a/linux-headers/asm-arm/kvm.h
+++ b/linux-headers/asm-arm/kvm.h
@@ -87,9 +87,11 @@ struct kvm_regs {
 /* Supported VGICv3 address types  */
 #define KVM_VGIC_V3_ADDR_TYPE_DIST	2
 #define KVM_VGIC_V3_ADDR_TYPE_REDIST	3
+#define KVM_VGIC_ITS_ADDR_TYPE		4
 
 #define KVM_VGIC_V3_DIST_SIZE		SZ_64K
 #define KVM_VGIC_V3_REDIST_SIZE		(2 * SZ_64K)
+#define KVM_VGIC_V3_ITS_SIZE		(2 * SZ_64K)
 
 #define KVM_ARM_VCPU_POWER_OFF		0 /* CPU is started in OFF state */
 #define KVM_ARM_VCPU_PSCI_0_2		1 /* CPU uses PSCI v0.2 */
diff --git a/linux-headers/asm-arm/unistd.h b/linux-headers/asm-arm/unistd.h
index ceb5450c81..155571b874 100644
--- a/linux-headers/asm-arm/unistd.h
+++ b/linux-headers/asm-arm/unistd.h
@@ -17,409 +17,14 @@
 
 #if defined(__thumb__) || defined(__ARM_EABI__)
 #define __NR_SYSCALL_BASE	0
+#include <asm/unistd-eabi.h>
 #else
 #define __NR_SYSCALL_BASE	__NR_OABI_SYSCALL_BASE
+#include <asm/unistd-oabi.h>
 #endif
 
-/*
- * This file contains the system call numbers.
- */
-
-#define __NR_restart_syscall		(__NR_SYSCALL_BASE+  0)
-#define __NR_exit			(__NR_SYSCALL_BASE+  1)
-#define __NR_fork			(__NR_SYSCALL_BASE+  2)
-#define __NR_read			(__NR_SYSCALL_BASE+  3)
-#define __NR_write			(__NR_SYSCALL_BASE+  4)
-#define __NR_open			(__NR_SYSCALL_BASE+  5)
-#define __NR_close			(__NR_SYSCALL_BASE+  6)
-					/* 7 was sys_waitpid */
-#define __NR_creat			(__NR_SYSCALL_BASE+  8)
-#define __NR_link			(__NR_SYSCALL_BASE+  9)
-#define __NR_unlink			(__NR_SYSCALL_BASE+ 10)
-#define __NR_execve			(__NR_SYSCALL_BASE+ 11)
-#define __NR_chdir			(__NR_SYSCALL_BASE+ 12)
-#define __NR_time			(__NR_SYSCALL_BASE+ 13)
-#define __NR_mknod			(__NR_SYSCALL_BASE+ 14)
-#define __NR_chmod			(__NR_SYSCALL_BASE+ 15)
-#define __NR_lchown			(__NR_SYSCALL_BASE+ 16)
-					/* 17 was sys_break */
-					/* 18 was sys_stat */
-#define __NR_lseek			(__NR_SYSCALL_BASE+ 19)
-#define __NR_getpid			(__NR_SYSCALL_BASE+ 20)
-#define __NR_mount			(__NR_SYSCALL_BASE+ 21)
-#define __NR_umount			(__NR_SYSCALL_BASE+ 22)
-#define __NR_setuid			(__NR_SYSCALL_BASE+ 23)
-#define __NR_getuid			(__NR_SYSCALL_BASE+ 24)
-#define __NR_stime			(__NR_SYSCALL_BASE+ 25)
-#define __NR_ptrace			(__NR_SYSCALL_BASE+ 26)
-#define __NR_alarm			(__NR_SYSCALL_BASE+ 27)
-					/* 28 was sys_fstat */
-#define __NR_pause			(__NR_SYSCALL_BASE+ 29)
-#define __NR_utime			(__NR_SYSCALL_BASE+ 30)
-					/* 31 was sys_stty */
-					/* 32 was sys_gtty */
-#define __NR_access			(__NR_SYSCALL_BASE+ 33)
-#define __NR_nice			(__NR_SYSCALL_BASE+ 34)
-					/* 35 was sys_ftime */
-#define __NR_sync			(__NR_SYSCALL_BASE+ 36)
-#define __NR_kill			(__NR_SYSCALL_BASE+ 37)
-#define __NR_rename			(__NR_SYSCALL_BASE+ 38)
-#define __NR_mkdir			(__NR_SYSCALL_BASE+ 39)
-#define __NR_rmdir			(__NR_SYSCALL_BASE+ 40)
-#define __NR_dup			(__NR_SYSCALL_BASE+ 41)
-#define __NR_pipe			(__NR_SYSCALL_BASE+ 42)
-#define __NR_times			(__NR_SYSCALL_BASE+ 43)
-					/* 44 was sys_prof */
-#define __NR_brk			(__NR_SYSCALL_BASE+ 45)
-#define __NR_setgid			(__NR_SYSCALL_BASE+ 46)
-#define __NR_getgid			(__NR_SYSCALL_BASE+ 47)
-					/* 48 was sys_signal */
-#define __NR_geteuid			(__NR_SYSCALL_BASE+ 49)
-#define __NR_getegid			(__NR_SYSCALL_BASE+ 50)
-#define __NR_acct			(__NR_SYSCALL_BASE+ 51)
-#define __NR_umount2			(__NR_SYSCALL_BASE+ 52)
-					/* 53 was sys_lock */
-#define __NR_ioctl			(__NR_SYSCALL_BASE+ 54)
-#define __NR_fcntl			(__NR_SYSCALL_BASE+ 55)
-					/* 56 was sys_mpx */
-#define __NR_setpgid			(__NR_SYSCALL_BASE+ 57)
-					/* 58 was sys_ulimit */
-					/* 59 was sys_olduname */
-#define __NR_umask			(__NR_SYSCALL_BASE+ 60)
-#define __NR_chroot			(__NR_SYSCALL_BASE+ 61)
-#define __NR_ustat			(__NR_SYSCALL_BASE+ 62)
-#define __NR_dup2			(__NR_SYSCALL_BASE+ 63)
-#define __NR_getppid			(__NR_SYSCALL_BASE+ 64)
-#define __NR_getpgrp			(__NR_SYSCALL_BASE+ 65)
-#define __NR_setsid			(__NR_SYSCALL_BASE+ 66)
-#define __NR_sigaction			(__NR_SYSCALL_BASE+ 67)
-					/* 68 was sys_sgetmask */
-					/* 69 was sys_ssetmask */
-#define __NR_setreuid			(__NR_SYSCALL_BASE+ 70)
-#define __NR_setregid			(__NR_SYSCALL_BASE+ 71)
-#define __NR_sigsuspend			(__NR_SYSCALL_BASE+ 72)
-#define __NR_sigpending			(__NR_SYSCALL_BASE+ 73)
-#define __NR_sethostname		(__NR_SYSCALL_BASE+ 74)
-#define __NR_setrlimit			(__NR_SYSCALL_BASE+ 75)
-#define __NR_getrlimit			(__NR_SYSCALL_BASE+ 76)	/* Back compat 2GB limited rlimit */
-#define __NR_getrusage			(__NR_SYSCALL_BASE+ 77)
-#define __NR_gettimeofday		(__NR_SYSCALL_BASE+ 78)
-#define __NR_settimeofday		(__NR_SYSCALL_BASE+ 79)
-#define __NR_getgroups			(__NR_SYSCALL_BASE+ 80)
-#define __NR_setgroups			(__NR_SYSCALL_BASE+ 81)
-#define __NR_select			(__NR_SYSCALL_BASE+ 82)
-#define __NR_symlink			(__NR_SYSCALL_BASE+ 83)
-					/* 84 was sys_lstat */
-#define __NR_readlink			(__NR_SYSCALL_BASE+ 85)
-#define __NR_uselib			(__NR_SYSCALL_BASE+ 86)
-#define __NR_swapon			(__NR_SYSCALL_BASE+ 87)
-#define __NR_reboot			(__NR_SYSCALL_BASE+ 88)
-#define __NR_readdir			(__NR_SYSCALL_BASE+ 89)
-#define __NR_mmap			(__NR_SYSCALL_BASE+ 90)
-#define __NR_munmap			(__NR_SYSCALL_BASE+ 91)
-#define __NR_truncate			(__NR_SYSCALL_BASE+ 92)
-#define __NR_ftruncate			(__NR_SYSCALL_BASE+ 93)
-#define __NR_fchmod			(__NR_SYSCALL_BASE+ 94)
-#define __NR_fchown			(__NR_SYSCALL_BASE+ 95)
-#define __NR_getpriority		(__NR_SYSCALL_BASE+ 96)
-#define __NR_setpriority		(__NR_SYSCALL_BASE+ 97)
-					/* 98 was sys_profil */
-#define __NR_statfs			(__NR_SYSCALL_BASE+ 99)
-#define __NR_fstatfs			(__NR_SYSCALL_BASE+100)
-					/* 101 was sys_ioperm */
-#define __NR_socketcall			(__NR_SYSCALL_BASE+102)
-#define __NR_syslog			(__NR_SYSCALL_BASE+103)
-#define __NR_setitimer			(__NR_SYSCALL_BASE+104)
-#define __NR_getitimer			(__NR_SYSCALL_BASE+105)
-#define __NR_stat			(__NR_SYSCALL_BASE+106)
-#define __NR_lstat			(__NR_SYSCALL_BASE+107)
-#define __NR_fstat			(__NR_SYSCALL_BASE+108)
-					/* 109 was sys_uname */
-					/* 110 was sys_iopl */
-#define __NR_vhangup			(__NR_SYSCALL_BASE+111)
-					/* 112 was sys_idle */
-#define __NR_syscall			(__NR_SYSCALL_BASE+113) /* syscall to call a syscall! */
-#define __NR_wait4			(__NR_SYSCALL_BASE+114)
-#define __NR_swapoff			(__NR_SYSCALL_BASE+115)
-#define __NR_sysinfo			(__NR_SYSCALL_BASE+116)
-#define __NR_ipc			(__NR_SYSCALL_BASE+117)
-#define __NR_fsync			(__NR_SYSCALL_BASE+118)
-#define __NR_sigreturn			(__NR_SYSCALL_BASE+119)
-#define __NR_clone			(__NR_SYSCALL_BASE+120)
-#define __NR_setdomainname		(__NR_SYSCALL_BASE+121)
-#define __NR_uname			(__NR_SYSCALL_BASE+122)
-					/* 123 was sys_modify_ldt */
-#define __NR_adjtimex			(__NR_SYSCALL_BASE+124)
-#define __NR_mprotect			(__NR_SYSCALL_BASE+125)
-#define __NR_sigprocmask		(__NR_SYSCALL_BASE+126)
-					/* 127 was sys_create_module */
-#define __NR_init_module		(__NR_SYSCALL_BASE+128)
-#define __NR_delete_module		(__NR_SYSCALL_BASE+129)
-					/* 130 was sys_get_kernel_syms */
-#define __NR_quotactl			(__NR_SYSCALL_BASE+131)
-#define __NR_getpgid			(__NR_SYSCALL_BASE+132)
-#define __NR_fchdir			(__NR_SYSCALL_BASE+133)
-#define __NR_bdflush			(__NR_SYSCALL_BASE+134)
-#define __NR_sysfs			(__NR_SYSCALL_BASE+135)
-#define __NR_personality		(__NR_SYSCALL_BASE+136)
-					/* 137 was sys_afs_syscall */
-#define __NR_setfsuid			(__NR_SYSCALL_BASE+138)
-#define __NR_setfsgid			(__NR_SYSCALL_BASE+139)
-#define __NR__llseek			(__NR_SYSCALL_BASE+140)
-#define __NR_getdents			(__NR_SYSCALL_BASE+141)
-#define __NR__newselect			(__NR_SYSCALL_BASE+142)
-#define __NR_flock			(__NR_SYSCALL_BASE+143)
-#define __NR_msync			(__NR_SYSCALL_BASE+144)
-#define __NR_readv			(__NR_SYSCALL_BASE+145)
-#define __NR_writev			(__NR_SYSCALL_BASE+146)
-#define __NR_getsid			(__NR_SYSCALL_BASE+147)
-#define __NR_fdatasync			(__NR_SYSCALL_BASE+148)
-#define __NR__sysctl			(__NR_SYSCALL_BASE+149)
-#define __NR_mlock			(__NR_SYSCALL_BASE+150)
-#define __NR_munlock			(__NR_SYSCALL_BASE+151)
-#define __NR_mlockall			(__NR_SYSCALL_BASE+152)
-#define __NR_munlockall			(__NR_SYSCALL_BASE+153)
-#define __NR_sched_setparam		(__NR_SYSCALL_BASE+154)
-#define __NR_sched_getparam		(__NR_SYSCALL_BASE+155)
-#define __NR_sched_setscheduler		(__NR_SYSCALL_BASE+156)
-#define __NR_sched_getscheduler		(__NR_SYSCALL_BASE+157)
-#define __NR_sched_yield		(__NR_SYSCALL_BASE+158)
-#define __NR_sched_get_priority_max	(__NR_SYSCALL_BASE+159)
-#define __NR_sched_get_priority_min	(__NR_SYSCALL_BASE+160)
-#define __NR_sched_rr_get_interval	(__NR_SYSCALL_BASE+161)
-#define __NR_nanosleep			(__NR_SYSCALL_BASE+162)
-#define __NR_mremap			(__NR_SYSCALL_BASE+163)
-#define __NR_setresuid			(__NR_SYSCALL_BASE+164)
-#define __NR_getresuid			(__NR_SYSCALL_BASE+165)
-					/* 166 was sys_vm86 */
-					/* 167 was sys_query_module */
-#define __NR_poll			(__NR_SYSCALL_BASE+168)
-#define __NR_nfsservctl			(__NR_SYSCALL_BASE+169)
-#define __NR_setresgid			(__NR_SYSCALL_BASE+170)
-#define __NR_getresgid			(__NR_SYSCALL_BASE+171)
-#define __NR_prctl			(__NR_SYSCALL_BASE+172)
-#define __NR_rt_sigreturn		(__NR_SYSCALL_BASE+173)
-#define __NR_rt_sigaction		(__NR_SYSCALL_BASE+174)
-#define __NR_rt_sigprocmask		(__NR_SYSCALL_BASE+175)
-#define __NR_rt_sigpending		(__NR_SYSCALL_BASE+176)
-#define __NR_rt_sigtimedwait		(__NR_SYSCALL_BASE+177)
-#define __NR_rt_sigqueueinfo		(__NR_SYSCALL_BASE+178)
-#define __NR_rt_sigsuspend		(__NR_SYSCALL_BASE+179)
-#define __NR_pread64			(__NR_SYSCALL_BASE+180)
-#define __NR_pwrite64			(__NR_SYSCALL_BASE+181)
-#define __NR_chown			(__NR_SYSCALL_BASE+182)
-#define __NR_getcwd			(__NR_SYSCALL_BASE+183)
-#define __NR_capget			(__NR_SYSCALL_BASE+184)
-#define __NR_capset			(__NR_SYSCALL_BASE+185)
-#define __NR_sigaltstack		(__NR_SYSCALL_BASE+186)
-#define __NR_sendfile			(__NR_SYSCALL_BASE+187)
-					/* 188 reserved */
-					/* 189 reserved */
-#define __NR_vfork			(__NR_SYSCALL_BASE+190)
-#define __NR_ugetrlimit			(__NR_SYSCALL_BASE+191)	/* SuS compliant getrlimit */
-#define __NR_mmap2			(__NR_SYSCALL_BASE+192)
-#define __NR_truncate64			(__NR_SYSCALL_BASE+193)
-#define __NR_ftruncate64		(__NR_SYSCALL_BASE+194)
-#define __NR_stat64			(__NR_SYSCALL_BASE+195)
-#define __NR_lstat64			(__NR_SYSCALL_BASE+196)
-#define __NR_fstat64			(__NR_SYSCALL_BASE+197)
-#define __NR_lchown32			(__NR_SYSCALL_BASE+198)
-#define __NR_getuid32			(__NR_SYSCALL_BASE+199)
-#define __NR_getgid32			(__NR_SYSCALL_BASE+200)
-#define __NR_geteuid32			(__NR_SYSCALL_BASE+201)
-#define __NR_getegid32			(__NR_SYSCALL_BASE+202)
-#define __NR_setreuid32			(__NR_SYSCALL_BASE+203)
-#define __NR_setregid32			(__NR_SYSCALL_BASE+204)
-#define __NR_getgroups32		(__NR_SYSCALL_BASE+205)
-#define __NR_setgroups32		(__NR_SYSCALL_BASE+206)
-#define __NR_fchown32			(__NR_SYSCALL_BASE+207)
-#define __NR_setresuid32		(__NR_SYSCALL_BASE+208)
-#define __NR_getresuid32		(__NR_SYSCALL_BASE+209)
-#define __NR_setresgid32		(__NR_SYSCALL_BASE+210)
-#define __NR_getresgid32		(__NR_SYSCALL_BASE+211)
-#define __NR_chown32			(__NR_SYSCALL_BASE+212)
-#define __NR_setuid32			(__NR_SYSCALL_BASE+213)
-#define __NR_setgid32			(__NR_SYSCALL_BASE+214)
-#define __NR_setfsuid32			(__NR_SYSCALL_BASE+215)
-#define __NR_setfsgid32			(__NR_SYSCALL_BASE+216)
-#define __NR_getdents64			(__NR_SYSCALL_BASE+217)
-#define __NR_pivot_root			(__NR_SYSCALL_BASE+218)
-#define __NR_mincore			(__NR_SYSCALL_BASE+219)
-#define __NR_madvise			(__NR_SYSCALL_BASE+220)
-#define __NR_fcntl64			(__NR_SYSCALL_BASE+221)
-					/* 222 for tux */
-					/* 223 is unused */
-#define __NR_gettid			(__NR_SYSCALL_BASE+224)
-#define __NR_readahead			(__NR_SYSCALL_BASE+225)
-#define __NR_setxattr			(__NR_SYSCALL_BASE+226)
-#define __NR_lsetxattr			(__NR_SYSCALL_BASE+227)
-#define __NR_fsetxattr			(__NR_SYSCALL_BASE+228)
-#define __NR_getxattr			(__NR_SYSCALL_BASE+229)
-#define __NR_lgetxattr			(__NR_SYSCALL_BASE+230)
-#define __NR_fgetxattr			(__NR_SYSCALL_BASE+231)
-#define __NR_listxattr			(__NR_SYSCALL_BASE+232)
-#define __NR_llistxattr			(__NR_SYSCALL_BASE+233)
-#define __NR_flistxattr			(__NR_SYSCALL_BASE+234)
-#define __NR_removexattr		(__NR_SYSCALL_BASE+235)
-#define __NR_lremovexattr		(__NR_SYSCALL_BASE+236)
-#define __NR_fremovexattr		(__NR_SYSCALL_BASE+237)
-#define __NR_tkill			(__NR_SYSCALL_BASE+238)
-#define __NR_sendfile64			(__NR_SYSCALL_BASE+239)
-#define __NR_futex			(__NR_SYSCALL_BASE+240)
-#define __NR_sched_setaffinity		(__NR_SYSCALL_BASE+241)
-#define __NR_sched_getaffinity		(__NR_SYSCALL_BASE+242)
-#define __NR_io_setup			(__NR_SYSCALL_BASE+243)
-#define __NR_io_destroy			(__NR_SYSCALL_BASE+244)
-#define __NR_io_getevents		(__NR_SYSCALL_BASE+245)
-#define __NR_io_submit			(__NR_SYSCALL_BASE+246)
-#define __NR_io_cancel			(__NR_SYSCALL_BASE+247)
-#define __NR_exit_group			(__NR_SYSCALL_BASE+248)
-#define __NR_lookup_dcookie		(__NR_SYSCALL_BASE+249)
-#define __NR_epoll_create		(__NR_SYSCALL_BASE+250)
-#define __NR_epoll_ctl			(__NR_SYSCALL_BASE+251)
-#define __NR_epoll_wait			(__NR_SYSCALL_BASE+252)
-#define __NR_remap_file_pages		(__NR_SYSCALL_BASE+253)
-					/* 254 for set_thread_area */
-					/* 255 for get_thread_area */
-#define __NR_set_tid_address		(__NR_SYSCALL_BASE+256)
-#define __NR_timer_create		(__NR_SYSCALL_BASE+257)
-#define __NR_timer_settime		(__NR_SYSCALL_BASE+258)
-#define __NR_timer_gettime		(__NR_SYSCALL_BASE+259)
-#define __NR_timer_getoverrun		(__NR_SYSCALL_BASE+260)
-#define __NR_timer_delete		(__NR_SYSCALL_BASE+261)
-#define __NR_clock_settime		(__NR_SYSCALL_BASE+262)
-#define __NR_clock_gettime		(__NR_SYSCALL_BASE+263)
-#define __NR_clock_getres		(__NR_SYSCALL_BASE+264)
-#define __NR_clock_nanosleep		(__NR_SYSCALL_BASE+265)
-#define __NR_statfs64			(__NR_SYSCALL_BASE+266)
-#define __NR_fstatfs64			(__NR_SYSCALL_BASE+267)
-#define __NR_tgkill			(__NR_SYSCALL_BASE+268)
-#define __NR_utimes			(__NR_SYSCALL_BASE+269)
-#define __NR_arm_fadvise64_64		(__NR_SYSCALL_BASE+270)
-#define __NR_pciconfig_iobase		(__NR_SYSCALL_BASE+271)
-#define __NR_pciconfig_read		(__NR_SYSCALL_BASE+272)
-#define __NR_pciconfig_write		(__NR_SYSCALL_BASE+273)
-#define __NR_mq_open			(__NR_SYSCALL_BASE+274)
-#define __NR_mq_unlink			(__NR_SYSCALL_BASE+275)
-#define __NR_mq_timedsend		(__NR_SYSCALL_BASE+276)
-#define __NR_mq_timedreceive		(__NR_SYSCALL_BASE+277)
-#define __NR_mq_notify			(__NR_SYSCALL_BASE+278)
-#define __NR_mq_getsetattr		(__NR_SYSCALL_BASE+279)
-#define __NR_waitid			(__NR_SYSCALL_BASE+280)
-#define __NR_socket			(__NR_SYSCALL_BASE+281)
-#define __NR_bind			(__NR_SYSCALL_BASE+282)
-#define __NR_connect			(__NR_SYSCALL_BASE+283)
-#define __NR_listen			(__NR_SYSCALL_BASE+284)
-#define __NR_accept			(__NR_SYSCALL_BASE+285)
-#define __NR_getsockname		(__NR_SYSCALL_BASE+286)
-#define __NR_getpeername		(__NR_SYSCALL_BASE+287)
-#define __NR_socketpair			(__NR_SYSCALL_BASE+288)
-#define __NR_send			(__NR_SYSCALL_BASE+289)
-#define __NR_sendto			(__NR_SYSCALL_BASE+290)
-#define __NR_recv			(__NR_SYSCALL_BASE+291)
-#define __NR_recvfrom			(__NR_SYSCALL_BASE+292)
-#define __NR_shutdown			(__NR_SYSCALL_BASE+293)
-#define __NR_setsockopt			(__NR_SYSCALL_BASE+294)
-#define __NR_getsockopt			(__NR_SYSCALL_BASE+295)
-#define __NR_sendmsg			(__NR_SYSCALL_BASE+296)
-#define __NR_recvmsg			(__NR_SYSCALL_BASE+297)
-#define __NR_semop			(__NR_SYSCALL_BASE+298)
-#define __NR_semget			(__NR_SYSCALL_BASE+299)
-#define __NR_semctl			(__NR_SYSCALL_BASE+300)
-#define __NR_msgsnd			(__NR_SYSCALL_BASE+301)
-#define __NR_msgrcv			(__NR_SYSCALL_BASE+302)
-#define __NR_msgget			(__NR_SYSCALL_BASE+303)
-#define __NR_msgctl			(__NR_SYSCALL_BASE+304)
-#define __NR_shmat			(__NR_SYSCALL_BASE+305)
-#define __NR_shmdt			(__NR_SYSCALL_BASE+306)
-#define __NR_shmget			(__NR_SYSCALL_BASE+307)
-#define __NR_shmctl			(__NR_SYSCALL_BASE+308)
-#define __NR_add_key			(__NR_SYSCALL_BASE+309)
-#define __NR_request_key		(__NR_SYSCALL_BASE+310)
-#define __NR_keyctl			(__NR_SYSCALL_BASE+311)
-#define __NR_semtimedop			(__NR_SYSCALL_BASE+312)
-#define __NR_vserver			(__NR_SYSCALL_BASE+313)
-#define __NR_ioprio_set			(__NR_SYSCALL_BASE+314)
-#define __NR_ioprio_get			(__NR_SYSCALL_BASE+315)
-#define __NR_inotify_init		(__NR_SYSCALL_BASE+316)
-#define __NR_inotify_add_watch		(__NR_SYSCALL_BASE+317)
-#define __NR_inotify_rm_watch		(__NR_SYSCALL_BASE+318)
-#define __NR_mbind			(__NR_SYSCALL_BASE+319)
-#define __NR_get_mempolicy		(__NR_SYSCALL_BASE+320)
-#define __NR_set_mempolicy		(__NR_SYSCALL_BASE+321)
-#define __NR_openat			(__NR_SYSCALL_BASE+322)
-#define __NR_mkdirat			(__NR_SYSCALL_BASE+323)
-#define __NR_mknodat			(__NR_SYSCALL_BASE+324)
-#define __NR_fchownat			(__NR_SYSCALL_BASE+325)
-#define __NR_futimesat			(__NR_SYSCALL_BASE+326)
-#define __NR_fstatat64			(__NR_SYSCALL_BASE+327)
-#define __NR_unlinkat			(__NR_SYSCALL_BASE+328)
-#define __NR_renameat			(__NR_SYSCALL_BASE+329)
-#define __NR_linkat			(__NR_SYSCALL_BASE+330)
-#define __NR_symlinkat			(__NR_SYSCALL_BASE+331)
-#define __NR_readlinkat			(__NR_SYSCALL_BASE+332)
-#define __NR_fchmodat			(__NR_SYSCALL_BASE+333)
-#define __NR_faccessat			(__NR_SYSCALL_BASE+334)
-#define __NR_pselect6			(__NR_SYSCALL_BASE+335)
-#define __NR_ppoll			(__NR_SYSCALL_BASE+336)
-#define __NR_unshare			(__NR_SYSCALL_BASE+337)
-#define __NR_set_robust_list		(__NR_SYSCALL_BASE+338)
-#define __NR_get_robust_list		(__NR_SYSCALL_BASE+339)
-#define __NR_splice			(__NR_SYSCALL_BASE+340)
-#define __NR_arm_sync_file_range	(__NR_SYSCALL_BASE+341)
+#include <asm/unistd-common.h>
 #define __NR_sync_file_range2		__NR_arm_sync_file_range
-#define __NR_tee			(__NR_SYSCALL_BASE+342)
-#define __NR_vmsplice			(__NR_SYSCALL_BASE+343)
-#define __NR_move_pages			(__NR_SYSCALL_BASE+344)
-#define __NR_getcpu			(__NR_SYSCALL_BASE+345)
-#define __NR_epoll_pwait		(__NR_SYSCALL_BASE+346)
-#define __NR_kexec_load			(__NR_SYSCALL_BASE+347)
-#define __NR_utimensat			(__NR_SYSCALL_BASE+348)
-#define __NR_signalfd			(__NR_SYSCALL_BASE+349)
-#define __NR_timerfd_create		(__NR_SYSCALL_BASE+350)
-#define __NR_eventfd			(__NR_SYSCALL_BASE+351)
-#define __NR_fallocate			(__NR_SYSCALL_BASE+352)
-#define __NR_timerfd_settime		(__NR_SYSCALL_BASE+353)
-#define __NR_timerfd_gettime		(__NR_SYSCALL_BASE+354)
-#define __NR_signalfd4			(__NR_SYSCALL_BASE+355)
-#define __NR_eventfd2			(__NR_SYSCALL_BASE+356)
-#define __NR_epoll_create1		(__NR_SYSCALL_BASE+357)
-#define __NR_dup3			(__NR_SYSCALL_BASE+358)
-#define __NR_pipe2			(__NR_SYSCALL_BASE+359)
-#define __NR_inotify_init1		(__NR_SYSCALL_BASE+360)
-#define __NR_preadv			(__NR_SYSCALL_BASE+361)
-#define __NR_pwritev			(__NR_SYSCALL_BASE+362)
-#define __NR_rt_tgsigqueueinfo		(__NR_SYSCALL_BASE+363)
-#define __NR_perf_event_open		(__NR_SYSCALL_BASE+364)
-#define __NR_recvmmsg			(__NR_SYSCALL_BASE+365)
-#define __NR_accept4			(__NR_SYSCALL_BASE+366)
-#define __NR_fanotify_init		(__NR_SYSCALL_BASE+367)
-#define __NR_fanotify_mark		(__NR_SYSCALL_BASE+368)
-#define __NR_prlimit64			(__NR_SYSCALL_BASE+369)
-#define __NR_name_to_handle_at		(__NR_SYSCALL_BASE+370)
-#define __NR_open_by_handle_at		(__NR_SYSCALL_BASE+371)
-#define __NR_clock_adjtime		(__NR_SYSCALL_BASE+372)
-#define __NR_syncfs			(__NR_SYSCALL_BASE+373)
-#define __NR_sendmmsg			(__NR_SYSCALL_BASE+374)
-#define __NR_setns			(__NR_SYSCALL_BASE+375)
-#define __NR_process_vm_readv		(__NR_SYSCALL_BASE+376)
-#define __NR_process_vm_writev		(__NR_SYSCALL_BASE+377)
-#define __NR_kcmp			(__NR_SYSCALL_BASE+378)
-#define __NR_finit_module		(__NR_SYSCALL_BASE+379)
-#define __NR_sched_setattr		(__NR_SYSCALL_BASE+380)
-#define __NR_sched_getattr		(__NR_SYSCALL_BASE+381)
-#define __NR_renameat2			(__NR_SYSCALL_BASE+382)
-#define __NR_seccomp			(__NR_SYSCALL_BASE+383)
-#define __NR_getrandom			(__NR_SYSCALL_BASE+384)
-#define __NR_memfd_create		(__NR_SYSCALL_BASE+385)
-#define __NR_bpf			(__NR_SYSCALL_BASE+386)
-#define __NR_execveat			(__NR_SYSCALL_BASE+387)
-#define __NR_userfaultfd		(__NR_SYSCALL_BASE+388)
-#define __NR_membarrier			(__NR_SYSCALL_BASE+389)
-#define __NR_mlock2			(__NR_SYSCALL_BASE+390)
-#define __NR_copy_file_range		(__NR_SYSCALL_BASE+391)
-#define __NR_preadv2			(__NR_SYSCALL_BASE+392)
-#define __NR_pwritev2			(__NR_SYSCALL_BASE+393)
 
 /*
  * The following SWIs are ARM private.
@@ -431,22 +36,4 @@
 #define __ARM_NR_usr32			(__ARM_NR_BASE+4)
 #define __ARM_NR_set_tls		(__ARM_NR_BASE+5)
 
-/*
- * The following syscalls are obsolete and no longer available for EABI.
- */
-#if defined(__ARM_EABI__)
-#undef __NR_time
-#undef __NR_umount
-#undef __NR_stime
-#undef __NR_alarm
-#undef __NR_utime
-#undef __NR_getrlimit
-#undef __NR_select
-#undef __NR_readdir
-#undef __NR_mmap
-#undef __NR_socketcall
-#undef __NR_syscall
-#undef __NR_ipc
-#endif
-
 #endif /* __ASM_ARM_UNISTD_H */
diff --git a/linux-headers/asm-powerpc/kvm.h b/linux-headers/asm-powerpc/kvm.h
index c93cf35ce3..cc0908b6c2 100644
--- a/linux-headers/asm-powerpc/kvm.h
+++ b/linux-headers/asm-powerpc/kvm.h
@@ -413,6 +413,26 @@ struct kvm_get_htab_header {
 	__u16	n_invalid;
 };
 
+/* For KVM_PPC_CONFIGURE_V3_MMU */
+struct kvm_ppc_mmuv3_cfg {
+	__u64	flags;
+	__u64	process_table;	/* second doubleword of partition table entry */
+};
+
+/* Flag values for KVM_PPC_CONFIGURE_V3_MMU */
+#define KVM_PPC_MMUV3_RADIX	1	/* 1 = radix mode, 0 = HPT */
+#define KVM_PPC_MMUV3_GTSE	2	/* global translation shootdown enb. */
+
+/* For KVM_PPC_GET_RMMU_INFO */
+struct kvm_ppc_rmmu_info {
+	struct kvm_ppc_radix_geom {
+		__u8	page_shift;
+		__u8	level_bits[4];
+		__u8	pad[3];
+	}	geometries[8];
+	__u32	ap_encodings[8];
+};
+
 /* Per-vcpu XICS interrupt controller state */
 #define KVM_REG_PPC_ICP_STATE	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
 
@@ -573,6 +593,10 @@ struct kvm_get_htab_header {
 #define KVM_REG_PPC_SPRG9	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xba)
 #define KVM_REG_PPC_DBSR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xbb)
 
+/* POWER9 registers */
+#define KVM_REG_PPC_TIDR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbc)
+#define KVM_REG_PPC_PSSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbd)
+
 /* Transactional Memory checkpointed state:
  * This is all GPRs, all VSX regs and a subset of SPRs
  */
@@ -596,6 +620,7 @@ struct kvm_get_htab_header {
 #define KVM_REG_PPC_TM_VSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U32 | 0x67)
 #define KVM_REG_PPC_TM_DSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x68)
 #define KVM_REG_PPC_TM_TAR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x69)
+#define KVM_REG_PPC_TM_XER	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x6a)
 
 /* PPC64 eXternal Interrupt Controller Specification */
 #define KVM_DEV_XICS_GRP_SOURCES	1	/* 64-bit source attributes */
diff --git a/linux-headers/asm-powerpc/unistd.h b/linux-headers/asm-powerpc/unistd.h
index 1e66eba4c6..598043c7b6 100644
--- a/linux-headers/asm-powerpc/unistd.h
+++ b/linux-headers/asm-powerpc/unistd.h
@@ -392,5 +392,6 @@
 #define __NR_copy_file_range	379
 #define __NR_preadv2		380
 #define __NR_pwritev2		381
+#define __NR_kexec_file_load	382
 
 #endif /* _ASM_POWERPC_UNISTD_H_ */
diff --git a/linux-headers/asm-x86/kvm_para.h b/linux-headers/asm-x86/kvm_para.h
index e41c5c1a28..0739a74626 100644
--- a/linux-headers/asm-x86/kvm_para.h
+++ b/linux-headers/asm-x86/kvm_para.h
@@ -45,7 +45,9 @@ struct kvm_steal_time {
 	__u64 steal;
 	__u32 version;
 	__u32 flags;
-	__u32 pad[12];
+	__u8  preempted;
+	__u8  u8_pad[3];
+	__u32 pad[11];
 };
 
 #define KVM_STEAL_ALIGNMENT_BITS 5
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
index bb0ed71223..659039c359 100644
--- a/linux-headers/linux/kvm.h
+++ b/linux-headers/linux/kvm.h
@@ -651,6 +651,9 @@ struct kvm_enable_cap {
 };
 
 /* for KVM_PPC_GET_PVINFO */
+
+#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
+
 struct kvm_ppc_pvinfo {
 	/* out */
 	__u32 flags;
@@ -682,8 +685,6 @@ struct kvm_ppc_smmu_info {
 	struct kvm_ppc_one_seg_page_size sps[KVM_PPC_PAGE_SIZES_MAX_SZ];
 };
 
-#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
-
 #define KVMIO 0xAE
 
 /* machine type bits, to be used as argument to KVM_CREATE_VM */
@@ -870,6 +871,8 @@ struct kvm_ppc_smmu_info {
 #define KVM_CAP_S390_USER_INSTR0 130
 #define KVM_CAP_MSI_DEVID 131
 #define KVM_CAP_PPC_HTM 132
+#define KVM_CAP_PPC_MMU_RADIX 134
+#define KVM_CAP_PPC_MMU_HASH_V3 135
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
@@ -1186,6 +1189,10 @@ struct kvm_s390_ucas_mapping {
 #define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr)
 /* Available with KVM_CAP_PPC_RTAS */
 #define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO,  0xac, struct kvm_rtas_token_args)
+/* Available with KVM_CAP_PPC_RADIX_MMU or KVM_CAP_PPC_HASH_MMU_V3 */
+#define KVM_PPC_CONFIGURE_V3_MMU  _IOW(KVMIO,  0xaf, struct kvm_ppc_mmuv3_cfg)
+/* Available with KVM_CAP_PPC_RADIX_MMU */
+#define KVM_PPC_GET_RMMU_INFO	  _IOW(KVMIO,  0xb0, struct kvm_ppc_rmmu_info)
 
 /* ioctl for vm fd */
 #define KVM_CREATE_DEVICE	  _IOWR(KVMIO,  0xe0, struct kvm_create_device)
diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
index 759b850a3e..531cb2eda9 100644
--- a/linux-headers/linux/vfio.h
+++ b/linux-headers/linux/vfio.h
@@ -203,6 +203,16 @@ struct vfio_device_info {
 };
 #define VFIO_DEVICE_GET_INFO		_IO(VFIO_TYPE, VFIO_BASE + 7)
 
+/*
+ * Vendor driver using Mediated device framework should provide device_api
+ * attribute in supported type attribute groups. Device API string should be one
+ * of the following corresponding to device flags in vfio_device_info structure.
+ */
+
+#define VFIO_DEVICE_API_PCI_STRING		"vfio-pci"
+#define VFIO_DEVICE_API_PLATFORM_STRING		"vfio-platform"
+#define VFIO_DEVICE_API_AMBA_STRING		"vfio-amba"
+
 /**
  * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8,
  *				       struct vfio_region_info)
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt() Sam Bobroff
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:14   ` David Gibson
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 4/9] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3 Sam Bobroff
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

Use the new ioctl, KVM_PPC_GET_RMMU_INFO, to fetch radix MMU
information from KVM and present the page encodings in the device tree
under ibm,processor-radix-AP-encodings. This provides page size
information to the guest which is necessary for it to use radix mode.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 hw/ppc/spapr.c   |  7 +++++++
 target/ppc/cpu.h |  5 +++++
 target/ppc/kvm.c | 32 +++++++++++++++++++++++++++++++-
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index a642e663d4..d629e2630c 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -496,6 +496,13 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
 
     _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu,
                                 ppc_get_compat_smt_threads(cpu)));
+
+    if (env->radix_page_info.count) {
+        _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
+                          env->radix_page_info.entries,
+                          env->radix_page_info.count *
+                          sizeof(env->radix_page_info.entries[0]))));
+    }
 }
 
 static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index afb7ddbdd0..5a96d98b6f 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -914,6 +914,10 @@ struct ppc_segment_page_sizes {
     struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
 };
 
+struct ppc_radix_page_info {
+    uint32_t count;
+    uint32_t entries[PPC_PAGE_SIZES_MAX_SZ];
+};
 
 /*****************************************************************************/
 /* The whole PowerPC CPU context */
@@ -1053,6 +1057,7 @@ struct CPUPPCState {
     ppc_slb_t vrma_slb;
     target_ulong rmls;
     bool ci_large_pages;
+    struct ppc_radix_page_info radix_page_info;
 #endif
 
 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index ec92c64159..390d6342cc 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -328,6 +328,18 @@ static void kvm_get_smmu_info(PowerPCCPU *cpu, struct kvm_ppc_smmu_info *info)
     kvm_get_fallback_smmu_info(cpu, info);
 }
 
+static bool kvm_get_rmmu_info(PowerPCCPU *cpu, struct kvm_ppc_rmmu_info *info)
+{
+    CPUState *cs = CPU(cpu);
+    int ret;
+
+    if (kvm_check_extension(cs->kvm_state, KVM_CAP_PPC_MMU_RADIX)) {
+        ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_GET_RMMU_INFO, info);
+        return (ret == 0);
+    }
+    return false;
+}
+
 static long gethugepagesize(const char *mem_path)
 {
     struct statfs fs;
@@ -441,9 +453,11 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
 {
     static struct kvm_ppc_smmu_info smmu_info;
     static bool has_smmu_info;
+    static struct kvm_ppc_rmmu_info rmmu_info;
+    static bool has_rmmu_info;
     CPUPPCState *env = &cpu->env;
     long rampagesize;
-    int iq, ik, jq, jk;
+    int iq, ik, jq, jk, i;
     bool has_64k_pages = false;
 
     /* We only handle page sizes for 64-bit server guests for now */
@@ -508,6 +522,22 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
     if (!has_64k_pages) {
         env->mmu_model &= ~POWERPC_MMU_64K;
     }
+
+    /* Collect radix page info from kernel if not already */
+    if (!has_rmmu_info) {
+        env->radix_page_info.count = 0;
+        if (kvm_get_rmmu_info(cpu, &rmmu_info)) {
+            for (i = 0; i < 8; i++) {
+                if (rmmu_info.ap_encodings[i]) {
+                    env->radix_page_info.entries[i] =
+                        cpu_to_be32(rmmu_info.ap_encodings[i]);
+                    env->radix_page_info.count++;
+                }
+            }
+        }
+        has_rmmu_info = true;
+    }
+
 }
 #else /* defined (TARGET_PPC64) */
 
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 4/9] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (2 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:16   ` David Gibson
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 5/9] spapr: Only setup HTP if necessary Sam Bobroff
                   ` (6 subsequent siblings)
  10 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

Query and cache the value of two new KVM capabilities that indicate
KVM's support for new radix and hash modes of the MMU.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 target/ppc/kvm.c     | 14 ++++++++++++++
 target/ppc/kvm_ppc.h | 12 ++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 390d6342cc..8d6fd1b067 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -81,6 +81,8 @@ static int cap_papr;
 static int cap_htab_fd;
 static int cap_fixup_hcalls;
 static int cap_htm;             /* Hardware transactional memory support */
+static int cap_mmu_radix;
+static int cap_mmu_hash;
 
 static uint32_t debug_inst_opcode;
 
@@ -134,6 +136,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
     cap_htab_fd = kvm_check_extension(s, KVM_CAP_PPC_HTAB_FD);
     cap_fixup_hcalls = kvm_check_extension(s, KVM_CAP_PPC_FIXUP_HCALL);
     cap_htm = kvm_vm_check_extension(s, KVM_CAP_PPC_HTM);
+    cap_mmu_radix = kvm_vm_check_extension(s, KVM_CAP_PPC_MMU_RADIX);
+    cap_mmu_hash = kvm_vm_check_extension(s, KVM_CAP_PPC_MMU_HASH_V3);
 
     if (!cap_interrupt_level) {
         fprintf(stderr, "KVM: Couldn't find level irq capability. Expect the "
@@ -2408,6 +2412,16 @@ bool kvmppc_has_cap_htm(void)
     return cap_htm;
 }
 
+bool kvmppc_has_cap_mmu_radix(void)
+{
+    return cap_mmu_radix;
+}
+
+bool kvmppc_has_cap_mmu_hash(void)
+{
+    return cap_mmu_hash;
+}
+
 static PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
 {
     ObjectClass *oc = OBJECT_CLASS(pcc);
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index 4b43283913..1c1b94847c 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -56,6 +56,8 @@ void kvmppc_hash64_write_pte(CPUPPCState *env, target_ulong pte_index,
                              target_ulong pte0, target_ulong pte1);
 bool kvmppc_has_cap_fixup_hcalls(void);
 bool kvmppc_has_cap_htm(void);
+bool kvmppc_has_cap_mmu_radix(void);
+bool kvmppc_has_cap_mmu_hash(void);
 int kvmppc_enable_hwrng(void);
 int kvmppc_put_books_sregs(PowerPCCPU *cpu);
 PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
@@ -255,6 +257,16 @@ static inline bool kvmppc_has_cap_htm(void)
     return false;
 }
 
+static inline bool kvmppc_has_cap_mmu_radix(void)
+{
+    return false;
+}
+
+static inline bool kvmppc_has_cap_mmu_hash(void)
+{
+    return false;
+}
+
 static inline int kvmppc_enable_hwrng(void)
 {
     return -1;
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 5/9] spapr: Only setup HTP if necessary.
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (3 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 4/9] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3 Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:24   ` David Gibson
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall Sam Bobroff
                   ` (5 subsequent siblings)
  10 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

Because KVM cannot support radix and hash modes concurrently, QEMU can
avoid allocating a hash page table if KVM supports radix mode.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 hw/ppc/spapr.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index d629e2630c..1411e470c0 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1150,15 +1150,17 @@ static void ppc_spapr_reset(void)
     /* Check for unknown sysbus devices */
     foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL);
 
-    /* Allocate and/or reset the hash page table */
-    spapr_reallocate_hpt(spapr,
+    if (!kvmppc_has_cap_mmu_radix()) {
+        /* Allocate and/or reset the hash page table */
+        spapr_reallocate_hpt(spapr,
                          spapr_hpt_shift_for_ramsize(machine->maxram_size),
                          &error_fatal);
 
-    /* Update the RMA size if necessary */
-    if (spapr->vrma_adjust) {
-        spapr->rma_size = kvmppc_rma_size(spapr_node0_size(),
-                                          spapr->htab_shift);
+        /* Update the RMA size if necessary */
+        if (spapr->vrma_adjust) {
+            spapr->rma_size = kvmppc_rma_size(spapr_node0_size(),
+                                              spapr->htab_shift);
+        }
     }
 
     qemu_devices_reset();
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (4 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 5/9] spapr: Only setup HTP if necessary Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:32   ` David Gibson
  2017-02-09  4:16   ` [Qemu-devel] [Qemu-ppc] " Alexey Kardashevskiy
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 7/9] spapr: Set ISA 3.00 radix and hash bits in OV5 Sam Bobroff
                   ` (4 subsequent siblings)
  10 siblings, 2 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

Both radix and hash modes require guests to use
h_register_process_table() to set up the MMU. Implement it using the
new KVM ioctl KVM_PPC_CONFIGURE_V3_MMU.

This hypercall is also necessary for fully emulated guests, so it will
need to be reworked to integrate with Suraj's TCG patchset.
---
 hw/ppc/spapr_hcall.c   | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/spapr.h |  3 ++-
 target/ppc/kvm.c       | 12 ++++++++++++
 target/ppc/kvm_ppc.h   |  1 +
 4 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index c9bb6624c4..4de511c386 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1049,6 +1049,50 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
     return H_SUCCESS;
 }
 
+static target_ulong h_register_process_table(PowerPCCPU *cpu,
+                                             sPAPRMachineState *spapr,
+                                             target_ulong opcode,
+                                             target_ulong *args)
+{
+    static target_ulong last_process_table;
+    target_ulong flags = args[0];
+    target_ulong proc_tbl = args[1];
+    target_ulong page_size = args[2];
+    target_ulong table_size = args[3];
+    uint64_t cflags, cproc;
+
+    cflags = (flags & 4) ? KVM_PPC_MMUV3_RADIX : 0;
+    cflags |= (flags & 1) ? KVM_PPC_MMUV3_GTSE : 0;
+    cproc = (flags & 4) ? (1ul << 63) : 0;
+    if (!(flags & 0x10)) {
+        if ((last_process_table & (1ul << 63)) != cproc) {
+            return H_PARAMETER;
+        }
+        cproc = last_process_table;
+    } else if (!(flags & 0x8)) {
+        ; /* do nothing */
+    } else if (flags & 4) {
+        /* radix */
+        if (table_size > 24 || (proc_tbl & 0xfff) || (proc_tbl >> 60)) {
+            return H_PARAMETER;
+        }
+        cproc |= proc_tbl | table_size;
+    } else {
+        /* hash, possibly with process table */
+        if (table_size > 24 || (proc_tbl >> 38) || page_size > 7) {
+            return H_PARAMETER;
+        }
+        cproc = (proc_tbl << 25) | (page_size << 5) | table_size;
+    }
+    last_process_table = cproc;
+    fprintf(stderr, "calling config mmu flags=%lx proctbl=%lx\n",
+            cflags, cproc);
+    if  (!kvmppc_configure_v3_mmu(cpu, cflags, cproc)) {
+        return H_HARDWARE;
+    }
+    return H_SUCCESS;
+}
+
 static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
 static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_HCALL_BASE + 1];
 
@@ -1136,6 +1180,10 @@ static void hypercall_register_types(void)
 
     /* ibm,client-architecture-support support */
     spapr_register_hypercall(KVMPPC_H_CAS, h_client_architecture_support);
+
+    /* Power9 MMU support */
+    spapr_register_hypercall(H_REGISTER_PROCESS_TABLE,
+                             h_register_process_table);
 }
 
 type_init(hypercall_register_types)
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index bd5bcf70de..92bda0f36d 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -347,7 +347,8 @@ struct sPAPRMachineState {
 #define H_XIRR_X                0x2FC
 #define H_RANDOM                0x300
 #define H_SET_MODE              0x31C
-#define MAX_HCALL_OPCODE        H_SET_MODE
+#define H_REGISTER_PROCESS_TABLE 0x37C
+#define MAX_HCALL_OPCODE        H_REGISTER_PROCESS_TABLE
 
 /* The hcalls above are standardized in PAPR and implemented by pHyp
  * as well.
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 8d6fd1b067..0d1443616c 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -344,6 +344,18 @@ static bool kvm_get_rmmu_info(PowerPCCPU *cpu, struct kvm_ppc_rmmu_info *info)
     return false;
 }
 
+bool kvmppc_configure_v3_mmu(PowerPCCPU *cpu, uint64_t flags, uint64_t proc_tbl)
+{
+    CPUState *cs = CPU(cpu);
+    int ret;
+    struct kvm_ppc_mmuv3_cfg cfg;
+
+    cfg.flags = flags;
+    cfg.process_table = proc_tbl;
+    ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_CONFIGURE_V3_MMU, &cfg);
+    return ret == 0;
+}
+
 static long gethugepagesize(const char *mem_path)
 {
     struct statfs fs;
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index 1c1b94847c..0b8b77583a 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -33,6 +33,7 @@ int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
 int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
 int kvmppc_set_tcr(PowerPCCPU *cpu);
 int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
+bool kvmppc_configure_v3_mmu(PowerPCCPU *cpu, uint64_t flags, uint64_t proctbl);
 #ifndef CONFIG_USER_ONLY
 off_t kvmppc_alloc_rma(void **rma);
 bool kvmppc_spapr_use_multitce(void);
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 7/9] spapr: Set ISA 3.00 radix and hash bits in OV5
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (5 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:34   ` David Gibson
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 8/9] spapr: Advertise ISA 3.0 MMU features in pa_features Sam Bobroff
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

Set new option vector 5 bits to indicate KVM support for in-memory
radix or hash modes and related options. The existing logic will
propagate the results back to the guest in the device tree. This
allows guests to perform client architecture support negotiation on
the new radix and hash MMU modes and will cause ISA 3.00 guests to
start using h_register_process_table().

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 hw/ppc/spapr.c              | 8 ++++++++
 include/hw/ppc/spapr_ovec.h | 6 ++++++
 2 files changed, 14 insertions(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 1411e470c0..c6a3a638cd 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1862,6 +1862,14 @@ static void ppc_spapr_init(MachineState *machine)
     }
 
     spapr_ovec_set(spapr->ov5, OV5_FORM1_AFFINITY);
+    if (kvmppc_has_cap_mmu_radix()) {
+        spapr_ovec_set(spapr->ov5, OV5_MMU_RADIX);
+    }
+    if (kvmppc_has_cap_mmu_hash()) {
+        spapr_ovec_set(spapr->ov5, OV5_MMU_HASH);
+    }
+    spapr_ovec_set(spapr->ov5, OV5_SEG_HCALL);
+    spapr_ovec_set(spapr->ov5, OV5_SHOOTDOWN);
 
     /* advertise support for dedicated HP event source to guests */
     if (spapr->use_hotplug_event_source) {
diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h
index 0f14753ff8..0a77e2a14b 100644
--- a/include/hw/ppc/spapr_ovec.h
+++ b/include/hw/ppc/spapr_ovec.h
@@ -47,6 +47,12 @@ typedef struct sPAPROptionVector sPAPROptionVector;
 #define OV5_DRCONF_MEMORY       OV_BIT(2, 2)
 #define OV5_FORM1_AFFINITY      OV_BIT(5, 0)
 #define OV5_HP_EVT              OV_BIT(6, 5)
+#define OV5_INT_ARCH_LVL        OV_BIT(23, 7)
+#define OV5_MMU_RADIX           OV_BIT(24, 0)
+#define OV5_MMU_HASH            OV_BIT(24, 1)
+#define OV5_SEG_RADIX           OV_BIT(24, 2)
+#define OV5_SEG_HCALL           OV_BIT(24, 3)
+#define OV5_SHOOTDOWN           OV_BIT(24, 4)
 
 /* interfaces */
 sPAPROptionVector *spapr_ovec_new(void);
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 8/9] spapr: Advertise ISA 3.0 MMU features in pa_features
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (6 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 7/9] spapr: Set ISA 3.00 radix and hash bits in OV5 Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:42   ` David Gibson
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 9/9] spapr: Small cleanup of PPC MMU enums Sam Bobroff
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

Set the default ibm,pa_features bits for ISA 3.0.

Providing the radix MMU support bit in ibm,pa-features will cause some
recent (e.g. 4.9) kernels to attempt to initialize the MMU as if they
were a radix host, which will cause them to crash. So, if a guest
performs a client architecture support call without indicating ISA
3.00 support (specifically, if they do not indicate that they support
either new radix or new hash mode) then the radix bit is removed from
ibm,pa-features to avoid triggering the bug.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 hw/ppc/spapr.c         | 125 +++++++++++++++++++++++++++++++------------------
 hw/ppc/spapr_hcall.c   |   4 +-
 include/hw/ppc/spapr.h |   1 +
 3 files changed, 83 insertions(+), 47 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index c6a3a638cd..325a9c587b 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -194,6 +194,76 @@ static int spapr_fixup_cpu_numa_dt(void *fdt, int offset, CPUState *cs)
     return ret;
 }
 
+/* Populate the "ibm,pa-features" property */
+static int spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset,
+                                      bool legacy_guest)
+{
+    uint8_t pa_features_206[] = { 6, 0,
+        0xf6, 0x1f, 0xc7, 0x00, 0x80, 0xc0 };
+    uint8_t pa_features_207[] = { 24, 0,
+        0xf6, 0x1f, 0xc7, 0xc0, 0x80, 0xf0,
+        0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+        0x80, 0x00, 0x80, 0x00, 0x00, 0x00 };
+    uint8_t pa_features_300[70 + 2] = { 70, 0,
+        0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xf0, /* 0 - 5 */
+        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, /* 6 - 11 */
+        0x00, 0x00, 0x00, 0x00, 0x80, 0x00, /* 12 - 17 */
+        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 18 - 23 */
+        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 24 - 29 */
+        0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, /* 30 - 35 */
+        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 36 - 41 */
+        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 42 - 47 */
+        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 48 - 53 */
+        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 54 - 59 */
+        0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 60 - 64 */
+        0x00, 0x00, 0x00, 0x00,             /* 66 - 69 */
+        };
+    uint8_t *pa_features;
+    size_t pa_size;
+
+    switch (env->mmu_model) {
+    case POWERPC_MMU_2_06:
+    case POWERPC_MMU_2_06a:
+        pa_features = pa_features_206;
+        pa_size = sizeof(pa_features_206);
+        break;
+    case POWERPC_MMU_2_07:
+    case POWERPC_MMU_2_07a:
+        pa_features = pa_features_207;
+        pa_size = sizeof(pa_features_207);
+        break;
+    case POWERPC_MMU_3_00:
+        pa_features = pa_features_300;
+        pa_size = sizeof(pa_features_300);
+        break;
+    default:
+        return 0; /* TODO, this is actually an error! */
+    }
+
+    if (env->ci_large_pages) {
+        /*
+         * Note: we keep CI large pages off by default because a 64K capable
+         * guest provisioned with large pages might otherwise try to map a qemu
+         * framebuffer (or other kind of memory mapped PCI BAR) using 64K pages
+         * even if that qemu runs on a 4k host.
+         * We dd this bit back here if we are confident this is not an issue
+         */
+        pa_features[3] |= 0x20;
+    }
+    if (kvmppc_has_cap_htm() && pa_size > 24) {
+        pa_features[24] |= 0x80;    /* Transactional memory support */
+    }
+    if (legacy_guest && pa_size > 40) {
+        /* Workaround for broken kernels that attempt (guest) radix
+         * mode when they can't handle it, if they see the radix bit set
+         * in pa-features. So hide it from them. */
+        pa_features[40 + 2] &= ~0x80; /* Radix MMU */
+    }
+
+    return fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size);
+}
+
 static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
 {
     int ret = 0, offset, cpus_offset;
@@ -204,6 +274,7 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
 
     CPU_FOREACH(cs) {
         PowerPCCPU *cpu = POWERPC_CPU(cs);
+        CPUPPCState *env = &cpu->env;
         DeviceClass *dc = DEVICE_GET_CLASS(cs);
         int index = ppc_get_vcpu_dt_id(cpu);
 
@@ -245,6 +316,12 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
         if (ret < 0) {
             return ret;
         }
+
+        ret = spapr_populate_pa_features(env, fdt, offset,
+                                         spapr->cas_legacy_guest_workaround);
+        if (ret < 0) {
+            return ret;
+        }
     }
     return ret;
 }
@@ -346,51 +423,6 @@ static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
     return 0;
 }
 
-/* Populate the "ibm,pa-features" property */
-static void spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset)
-{
-    uint8_t pa_features_206[] = { 6, 0,
-        0xf6, 0x1f, 0xc7, 0x00, 0x80, 0xc0 };
-    uint8_t pa_features_207[] = { 24, 0,
-        0xf6, 0x1f, 0xc7, 0xc0, 0x80, 0xf0,
-        0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
-        0x80, 0x00, 0x80, 0x00, 0x00, 0x00 };
-    uint8_t *pa_features;
-    size_t pa_size;
-
-    switch (env->mmu_model) {
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
-        pa_features = pa_features_206;
-        pa_size = sizeof(pa_features_206);
-        break;
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
-        pa_features = pa_features_207;
-        pa_size = sizeof(pa_features_207);
-        break;
-    default:
-        return;
-    }
-
-    if (env->ci_large_pages) {
-        /*
-         * Note: we keep CI large pages off by default because a 64K capable
-         * guest provisioned with large pages might otherwise try to map a qemu
-         * framebuffer (or other kind of memory mapped PCI BAR) using 64K pages
-         * even if that qemu runs on a 4k host.
-         * We dd this bit back here if we are confident this is not an issue
-         */
-        pa_features[3] |= 0x20;
-    }
-    if (kvmppc_has_cap_htm() && pa_size > 24) {
-        pa_features[24] |= 0x80;    /* Transactional memory support */
-    }
-
-    _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
-}
-
 static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
                                   sPAPRMachineState *spapr)
 {
@@ -484,7 +516,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
                           page_sizes_prop, page_sizes_prop_size)));
     }
 
-    spapr_populate_pa_features(env, fdt, offset);
+    _FDT(spapr_populate_pa_features(env, fdt, offset, false));
 
     _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id",
                            cs->cpu_index / vcpus_per_socket)));
@@ -1870,6 +1902,7 @@ static void ppc_spapr_init(MachineState *machine)
     }
     spapr_ovec_set(spapr->ov5, OV5_SEG_HCALL);
     spapr_ovec_set(spapr->ov5, OV5_SHOOTDOWN);
+    spapr_ovec_set(spapr->ov5, OV5_SEG_HCALL);
 
     /* advertise support for dedicated HP event source to guests */
     if (spapr->use_hotplug_event_source) {
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 4de511c386..d04f696e65 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -999,7 +999,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
         }
     }
 
-    if (!cpu_version) {
+    if (!cpu_version  && !spapr->cas_legacy_guest_workaround) {
         cpu_update = false;
     }
 
@@ -1033,6 +1033,8 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
                                         ov5_cas_old, spapr->ov5_cas);
     spapr_ovec_stderr("update", 16, ov5_updates);
     fprintf(stderr, "Old CAS reboot flag: %d\n", spapr->cas_reboot);
+    spapr->cas_legacy_guest_workaround = !spapr_ovec_test(ov5_updates, OV5_MMU_RADIX) &&
+                                         !spapr_ovec_test(ov5_updates, OV5_MMU_HASH);
 
     if (!spapr->cas_reboot) {
         spapr->cas_reboot =
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 92bda0f36d..974338d1df 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -77,6 +77,7 @@ struct sPAPRMachineState {
     sPAPROptionVector *ov5;         /* QEMU-supported option vectors */
     sPAPROptionVector *ov5_cas;     /* negotiated (via CAS) option vectors */
     bool cas_reboot;
+    bool cas_legacy_guest_workaround;
 
     Notifier epow_notifier;
     QTAILQ_HEAD(, sPAPREventLogEntry) pending_events;
-- 
2.11.0

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

* [Qemu-devel] [RFC PATCH 9/9] spapr: Small cleanup of PPC MMU enums
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (7 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 8/9] spapr: Advertise ISA 3.0 MMU features in pa_features Sam Bobroff
@ 2017-02-07  2:56 ` Sam Bobroff
  2017-02-09  2:49   ` David Gibson
  2017-02-09  2:51 ` [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support David Gibson
  2017-02-09  3:21 ` Alexey Kardashevskiy
  10 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07  2:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, david

The PPC MMU types are sometimes treated as if they were a bit field
and sometime as if they were an enum which causes maintenance
problems: flipping bits in the MMU type (which is done on both the 1TB
segment and 64K segment bits) currently produces new MMU type
values that are not handled in every "switch" on it, sometimes causing
an abort().

This patch provides some macros that can be used to filter out the
"bit field-like" bits so that the remainder of the value can be
switched on, like an enum. This allows removal of all of the
"degraded" types from the list and should ease maintenance.

Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
---
 hw/ppc/spapr.c          | 10 +++-----
 target/ppc/cpu-qom.h    | 12 ++++-----
 target/ppc/kvm.c        |  8 +++---
 target/ppc/mmu-hash64.c | 10 ++++----
 target/ppc/mmu_helper.c | 67 ++++++++++++++++++++-----------------------------
 target/ppc/translate.c  | 12 ++++-----
 6 files changed, 51 insertions(+), 68 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 325a9c587b..f9de02759a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -222,18 +222,16 @@ static int spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset,
     uint8_t *pa_features;
     size_t pa_size;
 
-    switch (env->mmu_model) {
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
+    switch (POWERPC_MMU_VER(env->mmu_model)) {
+    case POWERPC_MMU_VER_2_06:
         pa_features = pa_features_206;
         pa_size = sizeof(pa_features_206);
         break;
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
+    case POWERPC_MMU_VER_2_07:
         pa_features = pa_features_207;
         pa_size = sizeof(pa_features_207);
         break;
-    case POWERPC_MMU_3_00:
+    case POWERPC_MMU_VER_3_00:
         pa_features = pa_features_300;
         pa_size = sizeof(pa_features_300);
         break;
diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
index 1577cc8224..8ea055c18d 100644
--- a/target/ppc/cpu-qom.h
+++ b/target/ppc/cpu-qom.h
@@ -79,21 +79,21 @@ enum powerpc_mmu_t {
     POWERPC_MMU_2_06       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG
                              | POWERPC_MMU_64K
                              | POWERPC_MMU_AMR | 0x00000003,
-    /* Architecture 2.06 "degraded" (no 1T segments)           */
-    POWERPC_MMU_2_06a      = POWERPC_MMU_64 | POWERPC_MMU_AMR
-                             | 0x00000003,
     /* Architecture 2.07 variant                               */
     POWERPC_MMU_2_07       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG
                              | POWERPC_MMU_64K
                              | POWERPC_MMU_AMR | 0x00000004,
-    /* Architecture 2.07 "degraded" (no 1T segments)           */
-    POWERPC_MMU_2_07a      = POWERPC_MMU_64 | POWERPC_MMU_AMR
-                             | 0x00000004,
     /* Architecture 3.00 variant                               */
     POWERPC_MMU_3_00       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG
                              | POWERPC_MMU_64K
                              | POWERPC_MMU_AMR | 0x00000005,
 };
+#define POWERPC_MMU_VER(x) ((x) & (POWERPC_MMU_64 | 0xFFFF))
+#define POWERPC_MMU_VER_64B POWERPC_MMU_VER(POWERPC_MMU_64B)
+#define POWERPC_MMU_VER_2_03 POWERPC_MMU_VER(POWERPC_MMU_2_03)
+#define POWERPC_MMU_VER_2_06 POWERPC_MMU_VER(POWERPC_MMU_2_06)
+#define POWERPC_MMU_VER_2_07 POWERPC_MMU_VER(POWERPC_MMU_2_07)
+#define POWERPC_MMU_VER_3_00 POWERPC_MMU_VER(POWERPC_MMU_3_00)
 
 /*****************************************************************************/
 /* Exception model                                                           */
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 0d1443616c..1687d8e47e 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -285,8 +285,8 @@ static void kvm_get_fallback_smmu_info(PowerPCCPU *cpu,
             info->flags |= KVM_PPC_1T_SEGMENTS;
         }
 
-        if (env->mmu_model == POWERPC_MMU_2_06 ||
-            env->mmu_model == POWERPC_MMU_2_07) {
+        if (POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_06 ||
+           POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_07) {
             info->slb_size = 32;
         } else {
             info->slb_size = 64;
@@ -300,8 +300,8 @@ static void kvm_get_fallback_smmu_info(PowerPCCPU *cpu,
         i++;
 
         /* 64K on MMU 2.06 and later */
-        if (env->mmu_model == POWERPC_MMU_2_06 ||
-            env->mmu_model == POWERPC_MMU_2_07) {
+        if (POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_06 ||
+            POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_07) {
             info->sps[i].page_shift = 16;
             info->sps[i].slb_enc = 0x110;
             info->sps[i].enc[0].page_shift = 16;
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index 0efc8c63fa..7f0b7b3df5 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -1004,8 +1004,8 @@ void helper_store_lpcr(CPUPPCState *env, target_ulong val)
     uint64_t lpcr = 0;
 
     /* Filter out bits */
-    switch (env->mmu_model) {
-    case POWERPC_MMU_64B: /* 970 */
+    switch (POWERPC_MMU_VER(env->mmu_model)) {
+    case POWERPC_MMU_VER_64B: /* 970 */
         if (val & 0x40) {
             lpcr |= LPCR_LPES0;
         }
@@ -1031,19 +1031,19 @@ void helper_store_lpcr(CPUPPCState *env, target_ulong val)
          * to dig HRMOR out of HID5
          */
         break;
-    case POWERPC_MMU_2_03: /* P5p */
+    case POWERPC_MMU_VER_2_03: /* P5p */
         lpcr = val & (LPCR_RMLS | LPCR_ILE |
                       LPCR_LPES0 | LPCR_LPES1 |
                       LPCR_RMI | LPCR_HDICE);
         break;
-    case POWERPC_MMU_2_06: /* P7 */
+    case POWERPC_MMU_VER_2_06: /* P7 */
         lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
                       LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
                       LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
                       LPCR_MER | LPCR_TC |
                       LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE);
         break;
-    case POWERPC_MMU_2_07: /* P8 */
+    case POWERPC_MMU_VER_2_07: /* P8 */
         lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
                       LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
                       LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
index 172a305e0f..e65e4d337f 100644
--- a/target/ppc/mmu_helper.c
+++ b/target/ppc/mmu_helper.c
@@ -1260,7 +1260,7 @@ static void mmu6xx_dump_mmu(FILE *f, fprintf_function cpu_fprintf,
 
 void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env)
 {
-    switch (env->mmu_model) {
+    switch (POWERPC_MMU_VER(env->mmu_model)) {
     case POWERPC_MMU_BOOKE:
         mmubooke_dump_mmu(f, cpu_fprintf, env);
         break;
@@ -1272,12 +1272,10 @@ void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env)
         mmu6xx_dump_mmu(f, cpu_fprintf, env);
         break;
 #if defined(TARGET_PPC64)
-    case POWERPC_MMU_64B:
-    case POWERPC_MMU_2_03:
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
+    case POWERPC_MMU_VER_64B:
+    case POWERPC_MMU_VER_2_03:
+    case POWERPC_MMU_VER_2_06:
+    case POWERPC_MMU_VER_2_07:
         dump_slb(f, cpu_fprintf, ppc_env_get_cpu(env));
         break;
 #endif
@@ -1412,14 +1410,12 @@ hwaddr ppc_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
     CPUPPCState *env = &cpu->env;
     mmu_ctx_t ctx;
 
-    switch (env->mmu_model) {
+    switch (POWERPC_MMU_VER(env->mmu_model)) {
 #if defined(TARGET_PPC64)
-    case POWERPC_MMU_64B:
-    case POWERPC_MMU_2_03:
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
+    case POWERPC_MMU_VER_64B:
+    case POWERPC_MMU_VER_2_03:
+    case POWERPC_MMU_VER_2_06:
+    case POWERPC_MMU_VER_2_07:
         return ppc_hash64_get_phys_page_debug(cpu, addr);
 #endif
 
@@ -1904,6 +1900,12 @@ void ppc_tlb_invalidate_all(CPUPPCState *env)
 {
     PowerPCCPU *cpu = ppc_env_get_cpu(env);
 
+#if defined(TARGET_PPC64)
+    if (env->mmu_model & POWERPC_MMU_64) {
+        env->tlb_need_flush = 0;
+        tlb_flush(CPU(cpu));
+    } else
+#endif /* defined(TARGET_PPC64) */
     switch (env->mmu_model) {
     case POWERPC_MMU_SOFT_6xx:
     case POWERPC_MMU_SOFT_74xx:
@@ -1928,21 +1930,12 @@ void ppc_tlb_invalidate_all(CPUPPCState *env)
         break;
     case POWERPC_MMU_32B:
     case POWERPC_MMU_601:
-#if defined(TARGET_PPC64)
-    case POWERPC_MMU_64B:
-    case POWERPC_MMU_2_03:
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
-    case POWERPC_MMU_3_00:
-#endif /* defined(TARGET_PPC64) */
         env->tlb_need_flush = 0;
         tlb_flush(CPU(cpu));
         break;
     default:
         /* XXX: TODO */
-        cpu_abort(CPU(cpu), "Unknown MMU model %d\n", env->mmu_model);
+        cpu_abort(CPU(cpu), "Unknown MMU model %x\n", env->mmu_model);
         break;
     }
 }
@@ -1951,6 +1944,16 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
 {
 #if !defined(FLUSH_ALL_TLBS)
     addr &= TARGET_PAGE_MASK;
+#if defined(TARGET_PPC64)
+    if (env->mmu_model & POWERPC_MMU_64) {
+        /* tlbie invalidate TLBs for all segments */
+        /* XXX: given the fact that there are too many segments to invalidate,
+         *      and we still don't have a tlb_flush_mask(env, n, mask) in QEMU,
+         *      we just invalidate all TLBs
+         */
+        env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
+    } else
+#endif /* defined(TARGET_PPC64) */
     switch (env->mmu_model) {
     case POWERPC_MMU_SOFT_6xx:
     case POWERPC_MMU_SOFT_74xx:
@@ -1968,22 +1971,6 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
          */
         env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
         break;
-#if defined(TARGET_PPC64)
-    case POWERPC_MMU_64B:
-    case POWERPC_MMU_2_03:
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
-    case POWERPC_MMU_3_00:
-        /* tlbie invalidate TLBs for all segments */
-        /* XXX: given the fact that there are too many segments to invalidate,
-         *      and we still don't have a tlb_flush_mask(env, n, mask) in QEMU,
-         *      we just invalidate all TLBs
-         */
-        env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
-        break;
-#endif /* defined(TARGET_PPC64) */
     default:
         /* Should never reach here with other MMU models */
         assert(0);
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index 121218087f..1edf3f2133 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -6910,18 +6910,16 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
     }
 #endif
 
-    switch (env->mmu_model) {
+    switch (POWERPC_MMU_VER(env->mmu_model)) {
     case POWERPC_MMU_32B:
     case POWERPC_MMU_601:
     case POWERPC_MMU_SOFT_6xx:
     case POWERPC_MMU_SOFT_74xx:
 #if defined(TARGET_PPC64)
-    case POWERPC_MMU_64B:
-    case POWERPC_MMU_2_03:
-    case POWERPC_MMU_2_06:
-    case POWERPC_MMU_2_06a:
-    case POWERPC_MMU_2_07:
-    case POWERPC_MMU_2_07a:
+    case POWERPC_MMU_VER_64B:
+    case POWERPC_MMU_VER_2_03:
+    case POWERPC_MMU_VER_2_06:
+    case POWERPC_MMU_VER_2_07:
 #endif
         cpu_fprintf(f, " SDR1 " TARGET_FMT_lx "   DAR " TARGET_FMT_lx
                        "  DSISR " TARGET_FMT_lx "\n", env->spr[SPR_SDR1],
-- 
2.11.0

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

* Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH 2/9] Update headers using update-linux-headers.sh
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh Sam Bobroff
@ 2017-02-07 12:59   ` Thomas Huth
  2017-02-09  4:53     ` Sam Bobroff
  2017-02-09  1:55   ` [Qemu-devel] " David Gibson
  1 sibling, 1 reply; 30+ messages in thread
From: Thomas Huth @ 2017-02-07 12:59 UTC (permalink / raw)
  To: Sam Bobroff, qemu-devel; +Cc: qemu-ppc, david, qemu-arm

On 07.02.2017 03:56, Sam Bobroff wrote:
> This provides some new definitions needed by ISA 3.00 guests.
> 
> It is a large change because this is the first import since
> some kernel header files have become autogenerated.
> 
> Note: update-linux-headers.sh currently generates a change that
> (incorrectly) removes virtio_mmio.h and the change has been manually
> adjusted to prevent that.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  include/standard-headers/linux/input-event-codes.h |   2 +-
>  include/standard-headers/linux/pci_regs.h          |   8 +
>  include/standard-headers/linux/virtio_ids.h        |   1 +
>  linux-headers/asm-arm/kvm.h                        |   2 +
>  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
>  linux-headers/asm-powerpc/kvm.h                    |  25 ++
>  linux-headers/asm-powerpc/unistd.h                 |   1 +
>  linux-headers/asm-x86/kvm_para.h                   |   4 +-
>  linux-headers/linux/kvm.h                          |  11 +-
>  linux-headers/linux/vfio.h                         |  10 +
>  10 files changed, 63 insertions(+), 420 deletions(-)
[...]
> diff --git a/linux-headers/asm-arm/unistd.h b/linux-headers/asm-arm/unistd.h
> index ceb5450c81..155571b874 100644
> --- a/linux-headers/asm-arm/unistd.h
> +++ b/linux-headers/asm-arm/unistd.h
> @@ -17,409 +17,14 @@
>  
>  #if defined(__thumb__) || defined(__ARM_EABI__)
>  #define __NR_SYSCALL_BASE	0
> +#include <asm/unistd-eabi.h>
>  #else
>  #define __NR_SYSCALL_BASE	__NR_OABI_SYSCALL_BASE
> +#include <asm/unistd-oabi.h>
>  #endif
>  
> -/*
> - * This file contains the system call numbers.
> - */
[...]

Looks like the contents of asm-arm/unistd.h has been moved to two new
files, unistd-eabi.h and unistd-oabi.h, but they are not part of your
patch. I guess update-linux-headers.sh needs a fix for that?

 Thomas

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

* Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt()
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt() Sam Bobroff
@ 2017-02-07 15:47   ` Thomas Huth
  2017-02-09  1:53     ` David Gibson
  2017-02-07 22:12   ` [Qemu-devel] " Michael Roth
  1 sibling, 1 reply; 30+ messages in thread
From: Thomas Huth @ 2017-02-07 15:47 UTC (permalink / raw)
  To: Sam Bobroff, qemu-devel; +Cc: qemu-ppc, david

On 07.02.2017 03:56, Sam Bobroff wrote:
> The last byte of the option vector was missing due to an off-by-one
> error. Without this fix, client architecture support negotiation will
> fail because the last byte of option vector 5, which contains the MMU
> support, will be missed.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  hw/ppc/spapr_ovec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
> index 4f4c090a29..18dbc4a9ac 100644
> --- a/hw/ppc/spapr_ovec.c
> +++ b/hw/ppc/spapr_ovec.c
> @@ -251,7 +251,7 @@ int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
>          }
>      }
>  
> -    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len);
> +    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len + 1);
>  }

It took a while 'til I understood the encoding / length calculation of
the property here, but I think you're right. According to LoPAPR the
total length of the property is n+2 where n is the value of the first
byte. Since n is vec_len-1 in the QEMU code, vec_len+1 is the right
value for the property length.

Reviewed-by: Thomas Huth <thuth@redhat.com>

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

* Re: [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt()
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt() Sam Bobroff
  2017-02-07 15:47   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
@ 2017-02-07 22:12   ` Michael Roth
  2017-02-07 22:53     ` Sam Bobroff
  1 sibling, 1 reply; 30+ messages in thread
From: Michael Roth @ 2017-02-07 22:12 UTC (permalink / raw)
  To: Sam Bobroff, qemu-devel; +Cc: qemu-ppc, david

Quoting Sam Bobroff (2017-02-06 20:56:44)
> The last byte of the option vector was missing due to an off-by-one
> error. Without this fix, client architecture support negotiation will
> fail because the last byte of option vector 5, which contains the MMU
> support, will be missed.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  hw/ppc/spapr_ovec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
> index 4f4c090a29..18dbc4a9ac 100644
> --- a/hw/ppc/spapr_ovec.c
> +++ b/hw/ppc/spapr_ovec.c
> @@ -251,7 +251,7 @@ int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
>          }
>      }
> 
> -    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len);
> +    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len + 1);
>  }
> 
>  void spapr_ovec_ruler(int width, sPAPROptionVector *ov)
> -- 
> 2.11.0
> 

I noticed this working on another series and ended up with the same fix.

The patch doesn't apply cleanly for me though due to the "spapr_ovec_ruler"
reference. But, assuming that is unrelated to this series:

Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>

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

* Re: [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt()
  2017-02-07 22:12   ` [Qemu-devel] " Michael Roth
@ 2017-02-07 22:53     ` Sam Bobroff
  0 siblings, 0 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-07 22:53 UTC (permalink / raw)
  To: Michael Roth; +Cc: qemu-devel, qemu-ppc, david

On Tue, Feb 07, 2017 at 04:12:47PM -0600, Michael Roth wrote:
> Quoting Sam Bobroff (2017-02-06 20:56:44)
> > The last byte of the option vector was missing due to an off-by-one
> > error. Without this fix, client architecture support negotiation will
> > fail because the last byte of option vector 5, which contains the MMU
> > support, will be missed.
> > 
> > Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> > ---
> >  hw/ppc/spapr_ovec.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
> > index 4f4c090a29..18dbc4a9ac 100644
> > --- a/hw/ppc/spapr_ovec.c
> > +++ b/hw/ppc/spapr_ovec.c
> > @@ -251,7 +251,7 @@ int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
> >          }
> >      }
> > 
> > -    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len);
> > +    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len + 1);
> >  }
> > 
> >  void spapr_ovec_ruler(int width, sPAPROptionVector *ov)
> > -- 
> > 2.11.0
> > 
> 
> I noticed this working on another series and ended up with the same fix.
> 
> The patch doesn't apply cleanly for me though due to the "spapr_ovec_ruler"
> reference. But, assuming that is unrelated to this series:
> 
> Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>

You're corret, that line is unrelated.

Thanks!
Sam.

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

* Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt()
  2017-02-07 15:47   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
@ 2017-02-09  1:53     ` David Gibson
  0 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  1:53 UTC (permalink / raw)
  To: Thomas Huth; +Cc: Sam Bobroff, qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 1621 bytes --]

On Tue, Feb 07, 2017 at 04:47:53PM +0100, Thomas Huth wrote:
> On 07.02.2017 03:56, Sam Bobroff wrote:
> > The last byte of the option vector was missing due to an off-by-one
> > error. Without this fix, client architecture support negotiation will
> > fail because the last byte of option vector 5, which contains the MMU
> > support, will be missed.
> > 
> > Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> > ---
> >  hw/ppc/spapr_ovec.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
> > index 4f4c090a29..18dbc4a9ac 100644
> > --- a/hw/ppc/spapr_ovec.c
> > +++ b/hw/ppc/spapr_ovec.c
> > @@ -251,7 +251,7 @@ int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
> >          }
> >      }
> >  
> > -    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len);
> > +    return fdt_setprop(fdt, fdt_offset, name, vec, vec_len + 1);
> >  }
> 
> It took a while 'til I understood the encoding / length calculation of
> the property here, but I think you're right. According to LoPAPR the
> total length of the property is n+2 where n is the value of the first
> byte. Since n is vec_len-1 in the QEMU code, vec_len+1 is the right
> value for the property length.
> 
> Reviewed-by: Thomas Huth <thuth@redhat.com>

This is a correct fix regardless of the rest of the series, so I've
applied it to ppc-for-2.9.


-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh Sam Bobroff
  2017-02-07 12:59   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
@ 2017-02-09  1:55   ` David Gibson
  2017-02-09  4:54     ` Sam Bobroff
  1 sibling, 1 reply; 30+ messages in thread
From: David Gibson @ 2017-02-09  1:55 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 30822 bytes --]

On Tue, Feb 07, 2017 at 01:56:45PM +1100, Sam Bobroff wrote:
> This provides some new definitions needed by ISA 3.00 guests.
> 
> It is a large change because this is the first import since
> some kernel header files have become autogenerated.
> 
> Note: update-linux-headers.sh currently generates a change that
> (incorrectly) removes virtio_mmio.h and the change has been manually
> adjusted to prevent that.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>

It's no great problem for this RFC series, but in general please
include the SHA of the kernel commit you're updating to, and, if it's
not in Linus's tree yet, a link to a repo containing the kernel
version in question.

> ---
>  include/standard-headers/linux/input-event-codes.h |   2 +-
>  include/standard-headers/linux/pci_regs.h          |   8 +
>  include/standard-headers/linux/virtio_ids.h        |   1 +
>  linux-headers/asm-arm/kvm.h                        |   2 +
>  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
>  linux-headers/asm-powerpc/kvm.h                    |  25 ++
>  linux-headers/asm-powerpc/unistd.h                 |   1 +
>  linux-headers/asm-x86/kvm_para.h                   |   4 +-
>  linux-headers/linux/kvm.h                          |  11 +-
>  linux-headers/linux/vfio.h                         |  10 +
>  10 files changed, 63 insertions(+), 420 deletions(-)
> 
> diff --git a/include/standard-headers/linux/input-event-codes.h b/include/standard-headers/linux/input-event-codes.h
> index 5c10f7e25d..c8b3338375 100644
> --- a/include/standard-headers/linux/input-event-codes.h
> +++ b/include/standard-headers/linux/input-event-codes.h
> @@ -640,7 +640,7 @@
>   * Control a data application associated with the currently viewed channel,
>   * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.)
>   */
> -#define KEY_DATA			0x275
> +#define KEY_DATA			0x277
>  
>  #define BTN_TRIGGER_HAPPY		0x2c0
>  #define BTN_TRIGGER_HAPPY1		0x2c0
> diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
> index e5a2e68b22..174d114708 100644
> --- a/include/standard-headers/linux/pci_regs.h
> +++ b/include/standard-headers/linux/pci_regs.h
> @@ -23,6 +23,14 @@
>  #define LINUX_PCI_REGS_H
>  
>  /*
> + * Conventional PCI and PCI-X Mode 1 devices have 256 bytes of
> + * configuration space.  PCI-X Mode 2 and PCIe devices have 4096 bytes of
> + * configuration space.
> + */
> +#define PCI_CFG_SPACE_SIZE	256
> +#define PCI_CFG_SPACE_EXP_SIZE	4096
> +
> +/*
>   * Under PCI, each device has 256 bytes of configuration address space,
>   * of which the first 64 bytes are standardized as follows:
>   */
> diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h
> index fe74e422d4..6d5c3b2d4f 100644
> --- a/include/standard-headers/linux/virtio_ids.h
> +++ b/include/standard-headers/linux/virtio_ids.h
> @@ -43,4 +43,5 @@
>  #define VIRTIO_ID_INPUT        18 /* virtio input */
>  #define VIRTIO_ID_VSOCK        19 /* virtio vsock transport */
>  #define VIRTIO_ID_CRYPTO       20 /* virtio crypto */
> +
>  #endif /* _LINUX_VIRTIO_IDS_H */
> diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h
> index 2fb7859465..09a555cc83 100644
> --- a/linux-headers/asm-arm/kvm.h
> +++ b/linux-headers/asm-arm/kvm.h
> @@ -87,9 +87,11 @@ struct kvm_regs {
>  /* Supported VGICv3 address types  */
>  #define KVM_VGIC_V3_ADDR_TYPE_DIST	2
>  #define KVM_VGIC_V3_ADDR_TYPE_REDIST	3
> +#define KVM_VGIC_ITS_ADDR_TYPE		4
>  
>  #define KVM_VGIC_V3_DIST_SIZE		SZ_64K
>  #define KVM_VGIC_V3_REDIST_SIZE		(2 * SZ_64K)
> +#define KVM_VGIC_V3_ITS_SIZE		(2 * SZ_64K)
>  
>  #define KVM_ARM_VCPU_POWER_OFF		0 /* CPU is started in OFF state */
>  #define KVM_ARM_VCPU_PSCI_0_2		1 /* CPU uses PSCI v0.2 */
> diff --git a/linux-headers/asm-arm/unistd.h b/linux-headers/asm-arm/unistd.h
> index ceb5450c81..155571b874 100644
> --- a/linux-headers/asm-arm/unistd.h
> +++ b/linux-headers/asm-arm/unistd.h
> @@ -17,409 +17,14 @@
>  
>  #if defined(__thumb__) || defined(__ARM_EABI__)
>  #define __NR_SYSCALL_BASE	0
> +#include <asm/unistd-eabi.h>
>  #else
>  #define __NR_SYSCALL_BASE	__NR_OABI_SYSCALL_BASE
> +#include <asm/unistd-oabi.h>
>  #endif
>  
> -/*
> - * This file contains the system call numbers.
> - */
> -
> -#define __NR_restart_syscall		(__NR_SYSCALL_BASE+  0)
> -#define __NR_exit			(__NR_SYSCALL_BASE+  1)
> -#define __NR_fork			(__NR_SYSCALL_BASE+  2)
> -#define __NR_read			(__NR_SYSCALL_BASE+  3)
> -#define __NR_write			(__NR_SYSCALL_BASE+  4)
> -#define __NR_open			(__NR_SYSCALL_BASE+  5)
> -#define __NR_close			(__NR_SYSCALL_BASE+  6)
> -					/* 7 was sys_waitpid */
> -#define __NR_creat			(__NR_SYSCALL_BASE+  8)
> -#define __NR_link			(__NR_SYSCALL_BASE+  9)
> -#define __NR_unlink			(__NR_SYSCALL_BASE+ 10)
> -#define __NR_execve			(__NR_SYSCALL_BASE+ 11)
> -#define __NR_chdir			(__NR_SYSCALL_BASE+ 12)
> -#define __NR_time			(__NR_SYSCALL_BASE+ 13)
> -#define __NR_mknod			(__NR_SYSCALL_BASE+ 14)
> -#define __NR_chmod			(__NR_SYSCALL_BASE+ 15)
> -#define __NR_lchown			(__NR_SYSCALL_BASE+ 16)
> -					/* 17 was sys_break */
> -					/* 18 was sys_stat */
> -#define __NR_lseek			(__NR_SYSCALL_BASE+ 19)
> -#define __NR_getpid			(__NR_SYSCALL_BASE+ 20)
> -#define __NR_mount			(__NR_SYSCALL_BASE+ 21)
> -#define __NR_umount			(__NR_SYSCALL_BASE+ 22)
> -#define __NR_setuid			(__NR_SYSCALL_BASE+ 23)
> -#define __NR_getuid			(__NR_SYSCALL_BASE+ 24)
> -#define __NR_stime			(__NR_SYSCALL_BASE+ 25)
> -#define __NR_ptrace			(__NR_SYSCALL_BASE+ 26)
> -#define __NR_alarm			(__NR_SYSCALL_BASE+ 27)
> -					/* 28 was sys_fstat */
> -#define __NR_pause			(__NR_SYSCALL_BASE+ 29)
> -#define __NR_utime			(__NR_SYSCALL_BASE+ 30)
> -					/* 31 was sys_stty */
> -					/* 32 was sys_gtty */
> -#define __NR_access			(__NR_SYSCALL_BASE+ 33)
> -#define __NR_nice			(__NR_SYSCALL_BASE+ 34)
> -					/* 35 was sys_ftime */
> -#define __NR_sync			(__NR_SYSCALL_BASE+ 36)
> -#define __NR_kill			(__NR_SYSCALL_BASE+ 37)
> -#define __NR_rename			(__NR_SYSCALL_BASE+ 38)
> -#define __NR_mkdir			(__NR_SYSCALL_BASE+ 39)
> -#define __NR_rmdir			(__NR_SYSCALL_BASE+ 40)
> -#define __NR_dup			(__NR_SYSCALL_BASE+ 41)
> -#define __NR_pipe			(__NR_SYSCALL_BASE+ 42)
> -#define __NR_times			(__NR_SYSCALL_BASE+ 43)
> -					/* 44 was sys_prof */
> -#define __NR_brk			(__NR_SYSCALL_BASE+ 45)
> -#define __NR_setgid			(__NR_SYSCALL_BASE+ 46)
> -#define __NR_getgid			(__NR_SYSCALL_BASE+ 47)
> -					/* 48 was sys_signal */
> -#define __NR_geteuid			(__NR_SYSCALL_BASE+ 49)
> -#define __NR_getegid			(__NR_SYSCALL_BASE+ 50)
> -#define __NR_acct			(__NR_SYSCALL_BASE+ 51)
> -#define __NR_umount2			(__NR_SYSCALL_BASE+ 52)
> -					/* 53 was sys_lock */
> -#define __NR_ioctl			(__NR_SYSCALL_BASE+ 54)
> -#define __NR_fcntl			(__NR_SYSCALL_BASE+ 55)
> -					/* 56 was sys_mpx */
> -#define __NR_setpgid			(__NR_SYSCALL_BASE+ 57)
> -					/* 58 was sys_ulimit */
> -					/* 59 was sys_olduname */
> -#define __NR_umask			(__NR_SYSCALL_BASE+ 60)
> -#define __NR_chroot			(__NR_SYSCALL_BASE+ 61)
> -#define __NR_ustat			(__NR_SYSCALL_BASE+ 62)
> -#define __NR_dup2			(__NR_SYSCALL_BASE+ 63)
> -#define __NR_getppid			(__NR_SYSCALL_BASE+ 64)
> -#define __NR_getpgrp			(__NR_SYSCALL_BASE+ 65)
> -#define __NR_setsid			(__NR_SYSCALL_BASE+ 66)
> -#define __NR_sigaction			(__NR_SYSCALL_BASE+ 67)
> -					/* 68 was sys_sgetmask */
> -					/* 69 was sys_ssetmask */
> -#define __NR_setreuid			(__NR_SYSCALL_BASE+ 70)
> -#define __NR_setregid			(__NR_SYSCALL_BASE+ 71)
> -#define __NR_sigsuspend			(__NR_SYSCALL_BASE+ 72)
> -#define __NR_sigpending			(__NR_SYSCALL_BASE+ 73)
> -#define __NR_sethostname		(__NR_SYSCALL_BASE+ 74)
> -#define __NR_setrlimit			(__NR_SYSCALL_BASE+ 75)
> -#define __NR_getrlimit			(__NR_SYSCALL_BASE+ 76)	/* Back compat 2GB limited rlimit */
> -#define __NR_getrusage			(__NR_SYSCALL_BASE+ 77)
> -#define __NR_gettimeofday		(__NR_SYSCALL_BASE+ 78)
> -#define __NR_settimeofday		(__NR_SYSCALL_BASE+ 79)
> -#define __NR_getgroups			(__NR_SYSCALL_BASE+ 80)
> -#define __NR_setgroups			(__NR_SYSCALL_BASE+ 81)
> -#define __NR_select			(__NR_SYSCALL_BASE+ 82)
> -#define __NR_symlink			(__NR_SYSCALL_BASE+ 83)
> -					/* 84 was sys_lstat */
> -#define __NR_readlink			(__NR_SYSCALL_BASE+ 85)
> -#define __NR_uselib			(__NR_SYSCALL_BASE+ 86)
> -#define __NR_swapon			(__NR_SYSCALL_BASE+ 87)
> -#define __NR_reboot			(__NR_SYSCALL_BASE+ 88)
> -#define __NR_readdir			(__NR_SYSCALL_BASE+ 89)
> -#define __NR_mmap			(__NR_SYSCALL_BASE+ 90)
> -#define __NR_munmap			(__NR_SYSCALL_BASE+ 91)
> -#define __NR_truncate			(__NR_SYSCALL_BASE+ 92)
> -#define __NR_ftruncate			(__NR_SYSCALL_BASE+ 93)
> -#define __NR_fchmod			(__NR_SYSCALL_BASE+ 94)
> -#define __NR_fchown			(__NR_SYSCALL_BASE+ 95)
> -#define __NR_getpriority		(__NR_SYSCALL_BASE+ 96)
> -#define __NR_setpriority		(__NR_SYSCALL_BASE+ 97)
> -					/* 98 was sys_profil */
> -#define __NR_statfs			(__NR_SYSCALL_BASE+ 99)
> -#define __NR_fstatfs			(__NR_SYSCALL_BASE+100)
> -					/* 101 was sys_ioperm */
> -#define __NR_socketcall			(__NR_SYSCALL_BASE+102)
> -#define __NR_syslog			(__NR_SYSCALL_BASE+103)
> -#define __NR_setitimer			(__NR_SYSCALL_BASE+104)
> -#define __NR_getitimer			(__NR_SYSCALL_BASE+105)
> -#define __NR_stat			(__NR_SYSCALL_BASE+106)
> -#define __NR_lstat			(__NR_SYSCALL_BASE+107)
> -#define __NR_fstat			(__NR_SYSCALL_BASE+108)
> -					/* 109 was sys_uname */
> -					/* 110 was sys_iopl */
> -#define __NR_vhangup			(__NR_SYSCALL_BASE+111)
> -					/* 112 was sys_idle */
> -#define __NR_syscall			(__NR_SYSCALL_BASE+113) /* syscall to call a syscall! */
> -#define __NR_wait4			(__NR_SYSCALL_BASE+114)
> -#define __NR_swapoff			(__NR_SYSCALL_BASE+115)
> -#define __NR_sysinfo			(__NR_SYSCALL_BASE+116)
> -#define __NR_ipc			(__NR_SYSCALL_BASE+117)
> -#define __NR_fsync			(__NR_SYSCALL_BASE+118)
> -#define __NR_sigreturn			(__NR_SYSCALL_BASE+119)
> -#define __NR_clone			(__NR_SYSCALL_BASE+120)
> -#define __NR_setdomainname		(__NR_SYSCALL_BASE+121)
> -#define __NR_uname			(__NR_SYSCALL_BASE+122)
> -					/* 123 was sys_modify_ldt */
> -#define __NR_adjtimex			(__NR_SYSCALL_BASE+124)
> -#define __NR_mprotect			(__NR_SYSCALL_BASE+125)
> -#define __NR_sigprocmask		(__NR_SYSCALL_BASE+126)
> -					/* 127 was sys_create_module */
> -#define __NR_init_module		(__NR_SYSCALL_BASE+128)
> -#define __NR_delete_module		(__NR_SYSCALL_BASE+129)
> -					/* 130 was sys_get_kernel_syms */
> -#define __NR_quotactl			(__NR_SYSCALL_BASE+131)
> -#define __NR_getpgid			(__NR_SYSCALL_BASE+132)
> -#define __NR_fchdir			(__NR_SYSCALL_BASE+133)
> -#define __NR_bdflush			(__NR_SYSCALL_BASE+134)
> -#define __NR_sysfs			(__NR_SYSCALL_BASE+135)
> -#define __NR_personality		(__NR_SYSCALL_BASE+136)
> -					/* 137 was sys_afs_syscall */
> -#define __NR_setfsuid			(__NR_SYSCALL_BASE+138)
> -#define __NR_setfsgid			(__NR_SYSCALL_BASE+139)
> -#define __NR__llseek			(__NR_SYSCALL_BASE+140)
> -#define __NR_getdents			(__NR_SYSCALL_BASE+141)
> -#define __NR__newselect			(__NR_SYSCALL_BASE+142)
> -#define __NR_flock			(__NR_SYSCALL_BASE+143)
> -#define __NR_msync			(__NR_SYSCALL_BASE+144)
> -#define __NR_readv			(__NR_SYSCALL_BASE+145)
> -#define __NR_writev			(__NR_SYSCALL_BASE+146)
> -#define __NR_getsid			(__NR_SYSCALL_BASE+147)
> -#define __NR_fdatasync			(__NR_SYSCALL_BASE+148)
> -#define __NR__sysctl			(__NR_SYSCALL_BASE+149)
> -#define __NR_mlock			(__NR_SYSCALL_BASE+150)
> -#define __NR_munlock			(__NR_SYSCALL_BASE+151)
> -#define __NR_mlockall			(__NR_SYSCALL_BASE+152)
> -#define __NR_munlockall			(__NR_SYSCALL_BASE+153)
> -#define __NR_sched_setparam		(__NR_SYSCALL_BASE+154)
> -#define __NR_sched_getparam		(__NR_SYSCALL_BASE+155)
> -#define __NR_sched_setscheduler		(__NR_SYSCALL_BASE+156)
> -#define __NR_sched_getscheduler		(__NR_SYSCALL_BASE+157)
> -#define __NR_sched_yield		(__NR_SYSCALL_BASE+158)
> -#define __NR_sched_get_priority_max	(__NR_SYSCALL_BASE+159)
> -#define __NR_sched_get_priority_min	(__NR_SYSCALL_BASE+160)
> -#define __NR_sched_rr_get_interval	(__NR_SYSCALL_BASE+161)
> -#define __NR_nanosleep			(__NR_SYSCALL_BASE+162)
> -#define __NR_mremap			(__NR_SYSCALL_BASE+163)
> -#define __NR_setresuid			(__NR_SYSCALL_BASE+164)
> -#define __NR_getresuid			(__NR_SYSCALL_BASE+165)
> -					/* 166 was sys_vm86 */
> -					/* 167 was sys_query_module */
> -#define __NR_poll			(__NR_SYSCALL_BASE+168)
> -#define __NR_nfsservctl			(__NR_SYSCALL_BASE+169)
> -#define __NR_setresgid			(__NR_SYSCALL_BASE+170)
> -#define __NR_getresgid			(__NR_SYSCALL_BASE+171)
> -#define __NR_prctl			(__NR_SYSCALL_BASE+172)
> -#define __NR_rt_sigreturn		(__NR_SYSCALL_BASE+173)
> -#define __NR_rt_sigaction		(__NR_SYSCALL_BASE+174)
> -#define __NR_rt_sigprocmask		(__NR_SYSCALL_BASE+175)
> -#define __NR_rt_sigpending		(__NR_SYSCALL_BASE+176)
> -#define __NR_rt_sigtimedwait		(__NR_SYSCALL_BASE+177)
> -#define __NR_rt_sigqueueinfo		(__NR_SYSCALL_BASE+178)
> -#define __NR_rt_sigsuspend		(__NR_SYSCALL_BASE+179)
> -#define __NR_pread64			(__NR_SYSCALL_BASE+180)
> -#define __NR_pwrite64			(__NR_SYSCALL_BASE+181)
> -#define __NR_chown			(__NR_SYSCALL_BASE+182)
> -#define __NR_getcwd			(__NR_SYSCALL_BASE+183)
> -#define __NR_capget			(__NR_SYSCALL_BASE+184)
> -#define __NR_capset			(__NR_SYSCALL_BASE+185)
> -#define __NR_sigaltstack		(__NR_SYSCALL_BASE+186)
> -#define __NR_sendfile			(__NR_SYSCALL_BASE+187)
> -					/* 188 reserved */
> -					/* 189 reserved */
> -#define __NR_vfork			(__NR_SYSCALL_BASE+190)
> -#define __NR_ugetrlimit			(__NR_SYSCALL_BASE+191)	/* SuS compliant getrlimit */
> -#define __NR_mmap2			(__NR_SYSCALL_BASE+192)
> -#define __NR_truncate64			(__NR_SYSCALL_BASE+193)
> -#define __NR_ftruncate64		(__NR_SYSCALL_BASE+194)
> -#define __NR_stat64			(__NR_SYSCALL_BASE+195)
> -#define __NR_lstat64			(__NR_SYSCALL_BASE+196)
> -#define __NR_fstat64			(__NR_SYSCALL_BASE+197)
> -#define __NR_lchown32			(__NR_SYSCALL_BASE+198)
> -#define __NR_getuid32			(__NR_SYSCALL_BASE+199)
> -#define __NR_getgid32			(__NR_SYSCALL_BASE+200)
> -#define __NR_geteuid32			(__NR_SYSCALL_BASE+201)
> -#define __NR_getegid32			(__NR_SYSCALL_BASE+202)
> -#define __NR_setreuid32			(__NR_SYSCALL_BASE+203)
> -#define __NR_setregid32			(__NR_SYSCALL_BASE+204)
> -#define __NR_getgroups32		(__NR_SYSCALL_BASE+205)
> -#define __NR_setgroups32		(__NR_SYSCALL_BASE+206)
> -#define __NR_fchown32			(__NR_SYSCALL_BASE+207)
> -#define __NR_setresuid32		(__NR_SYSCALL_BASE+208)
> -#define __NR_getresuid32		(__NR_SYSCALL_BASE+209)
> -#define __NR_setresgid32		(__NR_SYSCALL_BASE+210)
> -#define __NR_getresgid32		(__NR_SYSCALL_BASE+211)
> -#define __NR_chown32			(__NR_SYSCALL_BASE+212)
> -#define __NR_setuid32			(__NR_SYSCALL_BASE+213)
> -#define __NR_setgid32			(__NR_SYSCALL_BASE+214)
> -#define __NR_setfsuid32			(__NR_SYSCALL_BASE+215)
> -#define __NR_setfsgid32			(__NR_SYSCALL_BASE+216)
> -#define __NR_getdents64			(__NR_SYSCALL_BASE+217)
> -#define __NR_pivot_root			(__NR_SYSCALL_BASE+218)
> -#define __NR_mincore			(__NR_SYSCALL_BASE+219)
> -#define __NR_madvise			(__NR_SYSCALL_BASE+220)
> -#define __NR_fcntl64			(__NR_SYSCALL_BASE+221)
> -					/* 222 for tux */
> -					/* 223 is unused */
> -#define __NR_gettid			(__NR_SYSCALL_BASE+224)
> -#define __NR_readahead			(__NR_SYSCALL_BASE+225)
> -#define __NR_setxattr			(__NR_SYSCALL_BASE+226)
> -#define __NR_lsetxattr			(__NR_SYSCALL_BASE+227)
> -#define __NR_fsetxattr			(__NR_SYSCALL_BASE+228)
> -#define __NR_getxattr			(__NR_SYSCALL_BASE+229)
> -#define __NR_lgetxattr			(__NR_SYSCALL_BASE+230)
> -#define __NR_fgetxattr			(__NR_SYSCALL_BASE+231)
> -#define __NR_listxattr			(__NR_SYSCALL_BASE+232)
> -#define __NR_llistxattr			(__NR_SYSCALL_BASE+233)
> -#define __NR_flistxattr			(__NR_SYSCALL_BASE+234)
> -#define __NR_removexattr		(__NR_SYSCALL_BASE+235)
> -#define __NR_lremovexattr		(__NR_SYSCALL_BASE+236)
> -#define __NR_fremovexattr		(__NR_SYSCALL_BASE+237)
> -#define __NR_tkill			(__NR_SYSCALL_BASE+238)
> -#define __NR_sendfile64			(__NR_SYSCALL_BASE+239)
> -#define __NR_futex			(__NR_SYSCALL_BASE+240)
> -#define __NR_sched_setaffinity		(__NR_SYSCALL_BASE+241)
> -#define __NR_sched_getaffinity		(__NR_SYSCALL_BASE+242)
> -#define __NR_io_setup			(__NR_SYSCALL_BASE+243)
> -#define __NR_io_destroy			(__NR_SYSCALL_BASE+244)
> -#define __NR_io_getevents		(__NR_SYSCALL_BASE+245)
> -#define __NR_io_submit			(__NR_SYSCALL_BASE+246)
> -#define __NR_io_cancel			(__NR_SYSCALL_BASE+247)
> -#define __NR_exit_group			(__NR_SYSCALL_BASE+248)
> -#define __NR_lookup_dcookie		(__NR_SYSCALL_BASE+249)
> -#define __NR_epoll_create		(__NR_SYSCALL_BASE+250)
> -#define __NR_epoll_ctl			(__NR_SYSCALL_BASE+251)
> -#define __NR_epoll_wait			(__NR_SYSCALL_BASE+252)
> -#define __NR_remap_file_pages		(__NR_SYSCALL_BASE+253)
> -					/* 254 for set_thread_area */
> -					/* 255 for get_thread_area */
> -#define __NR_set_tid_address		(__NR_SYSCALL_BASE+256)
> -#define __NR_timer_create		(__NR_SYSCALL_BASE+257)
> -#define __NR_timer_settime		(__NR_SYSCALL_BASE+258)
> -#define __NR_timer_gettime		(__NR_SYSCALL_BASE+259)
> -#define __NR_timer_getoverrun		(__NR_SYSCALL_BASE+260)
> -#define __NR_timer_delete		(__NR_SYSCALL_BASE+261)
> -#define __NR_clock_settime		(__NR_SYSCALL_BASE+262)
> -#define __NR_clock_gettime		(__NR_SYSCALL_BASE+263)
> -#define __NR_clock_getres		(__NR_SYSCALL_BASE+264)
> -#define __NR_clock_nanosleep		(__NR_SYSCALL_BASE+265)
> -#define __NR_statfs64			(__NR_SYSCALL_BASE+266)
> -#define __NR_fstatfs64			(__NR_SYSCALL_BASE+267)
> -#define __NR_tgkill			(__NR_SYSCALL_BASE+268)
> -#define __NR_utimes			(__NR_SYSCALL_BASE+269)
> -#define __NR_arm_fadvise64_64		(__NR_SYSCALL_BASE+270)
> -#define __NR_pciconfig_iobase		(__NR_SYSCALL_BASE+271)
> -#define __NR_pciconfig_read		(__NR_SYSCALL_BASE+272)
> -#define __NR_pciconfig_write		(__NR_SYSCALL_BASE+273)
> -#define __NR_mq_open			(__NR_SYSCALL_BASE+274)
> -#define __NR_mq_unlink			(__NR_SYSCALL_BASE+275)
> -#define __NR_mq_timedsend		(__NR_SYSCALL_BASE+276)
> -#define __NR_mq_timedreceive		(__NR_SYSCALL_BASE+277)
> -#define __NR_mq_notify			(__NR_SYSCALL_BASE+278)
> -#define __NR_mq_getsetattr		(__NR_SYSCALL_BASE+279)
> -#define __NR_waitid			(__NR_SYSCALL_BASE+280)
> -#define __NR_socket			(__NR_SYSCALL_BASE+281)
> -#define __NR_bind			(__NR_SYSCALL_BASE+282)
> -#define __NR_connect			(__NR_SYSCALL_BASE+283)
> -#define __NR_listen			(__NR_SYSCALL_BASE+284)
> -#define __NR_accept			(__NR_SYSCALL_BASE+285)
> -#define __NR_getsockname		(__NR_SYSCALL_BASE+286)
> -#define __NR_getpeername		(__NR_SYSCALL_BASE+287)
> -#define __NR_socketpair			(__NR_SYSCALL_BASE+288)
> -#define __NR_send			(__NR_SYSCALL_BASE+289)
> -#define __NR_sendto			(__NR_SYSCALL_BASE+290)
> -#define __NR_recv			(__NR_SYSCALL_BASE+291)
> -#define __NR_recvfrom			(__NR_SYSCALL_BASE+292)
> -#define __NR_shutdown			(__NR_SYSCALL_BASE+293)
> -#define __NR_setsockopt			(__NR_SYSCALL_BASE+294)
> -#define __NR_getsockopt			(__NR_SYSCALL_BASE+295)
> -#define __NR_sendmsg			(__NR_SYSCALL_BASE+296)
> -#define __NR_recvmsg			(__NR_SYSCALL_BASE+297)
> -#define __NR_semop			(__NR_SYSCALL_BASE+298)
> -#define __NR_semget			(__NR_SYSCALL_BASE+299)
> -#define __NR_semctl			(__NR_SYSCALL_BASE+300)
> -#define __NR_msgsnd			(__NR_SYSCALL_BASE+301)
> -#define __NR_msgrcv			(__NR_SYSCALL_BASE+302)
> -#define __NR_msgget			(__NR_SYSCALL_BASE+303)
> -#define __NR_msgctl			(__NR_SYSCALL_BASE+304)
> -#define __NR_shmat			(__NR_SYSCALL_BASE+305)
> -#define __NR_shmdt			(__NR_SYSCALL_BASE+306)
> -#define __NR_shmget			(__NR_SYSCALL_BASE+307)
> -#define __NR_shmctl			(__NR_SYSCALL_BASE+308)
> -#define __NR_add_key			(__NR_SYSCALL_BASE+309)
> -#define __NR_request_key		(__NR_SYSCALL_BASE+310)
> -#define __NR_keyctl			(__NR_SYSCALL_BASE+311)
> -#define __NR_semtimedop			(__NR_SYSCALL_BASE+312)
> -#define __NR_vserver			(__NR_SYSCALL_BASE+313)
> -#define __NR_ioprio_set			(__NR_SYSCALL_BASE+314)
> -#define __NR_ioprio_get			(__NR_SYSCALL_BASE+315)
> -#define __NR_inotify_init		(__NR_SYSCALL_BASE+316)
> -#define __NR_inotify_add_watch		(__NR_SYSCALL_BASE+317)
> -#define __NR_inotify_rm_watch		(__NR_SYSCALL_BASE+318)
> -#define __NR_mbind			(__NR_SYSCALL_BASE+319)
> -#define __NR_get_mempolicy		(__NR_SYSCALL_BASE+320)
> -#define __NR_set_mempolicy		(__NR_SYSCALL_BASE+321)
> -#define __NR_openat			(__NR_SYSCALL_BASE+322)
> -#define __NR_mkdirat			(__NR_SYSCALL_BASE+323)
> -#define __NR_mknodat			(__NR_SYSCALL_BASE+324)
> -#define __NR_fchownat			(__NR_SYSCALL_BASE+325)
> -#define __NR_futimesat			(__NR_SYSCALL_BASE+326)
> -#define __NR_fstatat64			(__NR_SYSCALL_BASE+327)
> -#define __NR_unlinkat			(__NR_SYSCALL_BASE+328)
> -#define __NR_renameat			(__NR_SYSCALL_BASE+329)
> -#define __NR_linkat			(__NR_SYSCALL_BASE+330)
> -#define __NR_symlinkat			(__NR_SYSCALL_BASE+331)
> -#define __NR_readlinkat			(__NR_SYSCALL_BASE+332)
> -#define __NR_fchmodat			(__NR_SYSCALL_BASE+333)
> -#define __NR_faccessat			(__NR_SYSCALL_BASE+334)
> -#define __NR_pselect6			(__NR_SYSCALL_BASE+335)
> -#define __NR_ppoll			(__NR_SYSCALL_BASE+336)
> -#define __NR_unshare			(__NR_SYSCALL_BASE+337)
> -#define __NR_set_robust_list		(__NR_SYSCALL_BASE+338)
> -#define __NR_get_robust_list		(__NR_SYSCALL_BASE+339)
> -#define __NR_splice			(__NR_SYSCALL_BASE+340)
> -#define __NR_arm_sync_file_range	(__NR_SYSCALL_BASE+341)
> +#include <asm/unistd-common.h>
>  #define __NR_sync_file_range2		__NR_arm_sync_file_range
> -#define __NR_tee			(__NR_SYSCALL_BASE+342)
> -#define __NR_vmsplice			(__NR_SYSCALL_BASE+343)
> -#define __NR_move_pages			(__NR_SYSCALL_BASE+344)
> -#define __NR_getcpu			(__NR_SYSCALL_BASE+345)
> -#define __NR_epoll_pwait		(__NR_SYSCALL_BASE+346)
> -#define __NR_kexec_load			(__NR_SYSCALL_BASE+347)
> -#define __NR_utimensat			(__NR_SYSCALL_BASE+348)
> -#define __NR_signalfd			(__NR_SYSCALL_BASE+349)
> -#define __NR_timerfd_create		(__NR_SYSCALL_BASE+350)
> -#define __NR_eventfd			(__NR_SYSCALL_BASE+351)
> -#define __NR_fallocate			(__NR_SYSCALL_BASE+352)
> -#define __NR_timerfd_settime		(__NR_SYSCALL_BASE+353)
> -#define __NR_timerfd_gettime		(__NR_SYSCALL_BASE+354)
> -#define __NR_signalfd4			(__NR_SYSCALL_BASE+355)
> -#define __NR_eventfd2			(__NR_SYSCALL_BASE+356)
> -#define __NR_epoll_create1		(__NR_SYSCALL_BASE+357)
> -#define __NR_dup3			(__NR_SYSCALL_BASE+358)
> -#define __NR_pipe2			(__NR_SYSCALL_BASE+359)
> -#define __NR_inotify_init1		(__NR_SYSCALL_BASE+360)
> -#define __NR_preadv			(__NR_SYSCALL_BASE+361)
> -#define __NR_pwritev			(__NR_SYSCALL_BASE+362)
> -#define __NR_rt_tgsigqueueinfo		(__NR_SYSCALL_BASE+363)
> -#define __NR_perf_event_open		(__NR_SYSCALL_BASE+364)
> -#define __NR_recvmmsg			(__NR_SYSCALL_BASE+365)
> -#define __NR_accept4			(__NR_SYSCALL_BASE+366)
> -#define __NR_fanotify_init		(__NR_SYSCALL_BASE+367)
> -#define __NR_fanotify_mark		(__NR_SYSCALL_BASE+368)
> -#define __NR_prlimit64			(__NR_SYSCALL_BASE+369)
> -#define __NR_name_to_handle_at		(__NR_SYSCALL_BASE+370)
> -#define __NR_open_by_handle_at		(__NR_SYSCALL_BASE+371)
> -#define __NR_clock_adjtime		(__NR_SYSCALL_BASE+372)
> -#define __NR_syncfs			(__NR_SYSCALL_BASE+373)
> -#define __NR_sendmmsg			(__NR_SYSCALL_BASE+374)
> -#define __NR_setns			(__NR_SYSCALL_BASE+375)
> -#define __NR_process_vm_readv		(__NR_SYSCALL_BASE+376)
> -#define __NR_process_vm_writev		(__NR_SYSCALL_BASE+377)
> -#define __NR_kcmp			(__NR_SYSCALL_BASE+378)
> -#define __NR_finit_module		(__NR_SYSCALL_BASE+379)
> -#define __NR_sched_setattr		(__NR_SYSCALL_BASE+380)
> -#define __NR_sched_getattr		(__NR_SYSCALL_BASE+381)
> -#define __NR_renameat2			(__NR_SYSCALL_BASE+382)
> -#define __NR_seccomp			(__NR_SYSCALL_BASE+383)
> -#define __NR_getrandom			(__NR_SYSCALL_BASE+384)
> -#define __NR_memfd_create		(__NR_SYSCALL_BASE+385)
> -#define __NR_bpf			(__NR_SYSCALL_BASE+386)
> -#define __NR_execveat			(__NR_SYSCALL_BASE+387)
> -#define __NR_userfaultfd		(__NR_SYSCALL_BASE+388)
> -#define __NR_membarrier			(__NR_SYSCALL_BASE+389)
> -#define __NR_mlock2			(__NR_SYSCALL_BASE+390)
> -#define __NR_copy_file_range		(__NR_SYSCALL_BASE+391)
> -#define __NR_preadv2			(__NR_SYSCALL_BASE+392)
> -#define __NR_pwritev2			(__NR_SYSCALL_BASE+393)
>  
>  /*
>   * The following SWIs are ARM private.
> @@ -431,22 +36,4 @@
>  #define __ARM_NR_usr32			(__ARM_NR_BASE+4)
>  #define __ARM_NR_set_tls		(__ARM_NR_BASE+5)
>  
> -/*
> - * The following syscalls are obsolete and no longer available for EABI.
> - */
> -#if defined(__ARM_EABI__)
> -#undef __NR_time
> -#undef __NR_umount
> -#undef __NR_stime
> -#undef __NR_alarm
> -#undef __NR_utime
> -#undef __NR_getrlimit
> -#undef __NR_select
> -#undef __NR_readdir
> -#undef __NR_mmap
> -#undef __NR_socketcall
> -#undef __NR_syscall
> -#undef __NR_ipc
> -#endif
> -
>  #endif /* __ASM_ARM_UNISTD_H */
> diff --git a/linux-headers/asm-powerpc/kvm.h b/linux-headers/asm-powerpc/kvm.h
> index c93cf35ce3..cc0908b6c2 100644
> --- a/linux-headers/asm-powerpc/kvm.h
> +++ b/linux-headers/asm-powerpc/kvm.h
> @@ -413,6 +413,26 @@ struct kvm_get_htab_header {
>  	__u16	n_invalid;
>  };
>  
> +/* For KVM_PPC_CONFIGURE_V3_MMU */
> +struct kvm_ppc_mmuv3_cfg {
> +	__u64	flags;
> +	__u64	process_table;	/* second doubleword of partition table entry */
> +};
> +
> +/* Flag values for KVM_PPC_CONFIGURE_V3_MMU */
> +#define KVM_PPC_MMUV3_RADIX	1	/* 1 = radix mode, 0 = HPT */
> +#define KVM_PPC_MMUV3_GTSE	2	/* global translation shootdown enb. */
> +
> +/* For KVM_PPC_GET_RMMU_INFO */
> +struct kvm_ppc_rmmu_info {
> +	struct kvm_ppc_radix_geom {
> +		__u8	page_shift;
> +		__u8	level_bits[4];
> +		__u8	pad[3];
> +	}	geometries[8];
> +	__u32	ap_encodings[8];
> +};
> +
>  /* Per-vcpu XICS interrupt controller state */
>  #define KVM_REG_PPC_ICP_STATE	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
>  
> @@ -573,6 +593,10 @@ struct kvm_get_htab_header {
>  #define KVM_REG_PPC_SPRG9	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xba)
>  #define KVM_REG_PPC_DBSR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xbb)
>  
> +/* POWER9 registers */
> +#define KVM_REG_PPC_TIDR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbc)
> +#define KVM_REG_PPC_PSSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbd)
> +
>  /* Transactional Memory checkpointed state:
>   * This is all GPRs, all VSX regs and a subset of SPRs
>   */
> @@ -596,6 +620,7 @@ struct kvm_get_htab_header {
>  #define KVM_REG_PPC_TM_VSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U32 | 0x67)
>  #define KVM_REG_PPC_TM_DSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x68)
>  #define KVM_REG_PPC_TM_TAR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x69)
> +#define KVM_REG_PPC_TM_XER	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x6a)
>  
>  /* PPC64 eXternal Interrupt Controller Specification */
>  #define KVM_DEV_XICS_GRP_SOURCES	1	/* 64-bit source attributes */
> diff --git a/linux-headers/asm-powerpc/unistd.h b/linux-headers/asm-powerpc/unistd.h
> index 1e66eba4c6..598043c7b6 100644
> --- a/linux-headers/asm-powerpc/unistd.h
> +++ b/linux-headers/asm-powerpc/unistd.h
> @@ -392,5 +392,6 @@
>  #define __NR_copy_file_range	379
>  #define __NR_preadv2		380
>  #define __NR_pwritev2		381
> +#define __NR_kexec_file_load	382
>  
>  #endif /* _ASM_POWERPC_UNISTD_H_ */
> diff --git a/linux-headers/asm-x86/kvm_para.h b/linux-headers/asm-x86/kvm_para.h
> index e41c5c1a28..0739a74626 100644
> --- a/linux-headers/asm-x86/kvm_para.h
> +++ b/linux-headers/asm-x86/kvm_para.h
> @@ -45,7 +45,9 @@ struct kvm_steal_time {
>  	__u64 steal;
>  	__u32 version;
>  	__u32 flags;
> -	__u32 pad[12];
> +	__u8  preempted;
> +	__u8  u8_pad[3];
> +	__u32 pad[11];
>  };
>  
>  #define KVM_STEAL_ALIGNMENT_BITS 5
> diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
> index bb0ed71223..659039c359 100644
> --- a/linux-headers/linux/kvm.h
> +++ b/linux-headers/linux/kvm.h
> @@ -651,6 +651,9 @@ struct kvm_enable_cap {
>  };
>  
>  /* for KVM_PPC_GET_PVINFO */
> +
> +#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
> +
>  struct kvm_ppc_pvinfo {
>  	/* out */
>  	__u32 flags;
> @@ -682,8 +685,6 @@ struct kvm_ppc_smmu_info {
>  	struct kvm_ppc_one_seg_page_size sps[KVM_PPC_PAGE_SIZES_MAX_SZ];
>  };
>  
> -#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
> -
>  #define KVMIO 0xAE
>  
>  /* machine type bits, to be used as argument to KVM_CREATE_VM */
> @@ -870,6 +871,8 @@ struct kvm_ppc_smmu_info {
>  #define KVM_CAP_S390_USER_INSTR0 130
>  #define KVM_CAP_MSI_DEVID 131
>  #define KVM_CAP_PPC_HTM 132
> +#define KVM_CAP_PPC_MMU_RADIX 134
> +#define KVM_CAP_PPC_MMU_HASH_V3 135
>  
>  #ifdef KVM_CAP_IRQ_ROUTING
>  
> @@ -1186,6 +1189,10 @@ struct kvm_s390_ucas_mapping {
>  #define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr)
>  /* Available with KVM_CAP_PPC_RTAS */
>  #define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO,  0xac, struct kvm_rtas_token_args)
> +/* Available with KVM_CAP_PPC_RADIX_MMU or KVM_CAP_PPC_HASH_MMU_V3 */
> +#define KVM_PPC_CONFIGURE_V3_MMU  _IOW(KVMIO,  0xaf, struct kvm_ppc_mmuv3_cfg)
> +/* Available with KVM_CAP_PPC_RADIX_MMU */
> +#define KVM_PPC_GET_RMMU_INFO	  _IOW(KVMIO,  0xb0, struct kvm_ppc_rmmu_info)
>  
>  /* ioctl for vm fd */
>  #define KVM_CREATE_DEVICE	  _IOWR(KVMIO,  0xe0, struct kvm_create_device)
> diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
> index 759b850a3e..531cb2eda9 100644
> --- a/linux-headers/linux/vfio.h
> +++ b/linux-headers/linux/vfio.h
> @@ -203,6 +203,16 @@ struct vfio_device_info {
>  };
>  #define VFIO_DEVICE_GET_INFO		_IO(VFIO_TYPE, VFIO_BASE + 7)
>  
> +/*
> + * Vendor driver using Mediated device framework should provide device_api
> + * attribute in supported type attribute groups. Device API string should be one
> + * of the following corresponding to device flags in vfio_device_info structure.
> + */
> +
> +#define VFIO_DEVICE_API_PCI_STRING		"vfio-pci"
> +#define VFIO_DEVICE_API_PLATFORM_STRING		"vfio-platform"
> +#define VFIO_DEVICE_API_AMBA_STRING		"vfio-amba"
> +
>  /**
>   * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8,
>   *				       struct vfio_region_info)

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree Sam Bobroff
@ 2017-02-09  2:14   ` David Gibson
  2017-02-09  5:07     ` Sam Bobroff
  0 siblings, 1 reply; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:14 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 5566 bytes --]

On Tue, Feb 07, 2017 at 01:56:46PM +1100, Sam Bobroff wrote:
> Use the new ioctl, KVM_PPC_GET_RMMU_INFO, to fetch radix MMU
> information from KVM and present the page encodings in the device tree
> under ibm,processor-radix-AP-encodings. This provides page size
> information to the guest which is necessary for it to use radix mode.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  hw/ppc/spapr.c   |  7 +++++++
>  target/ppc/cpu.h |  5 +++++
>  target/ppc/kvm.c | 32 +++++++++++++++++++++++++++++++-
>  3 files changed, 43 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index a642e663d4..d629e2630c 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -496,6 +496,13 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
>  
>      _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu,
>                                  ppc_get_compat_smt_threads(cpu)));
> +
> +    if (env->radix_page_info.count) {
> +        _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
> +                          env->radix_page_info.entries,
> +                          env->radix_page_info.count *
> +                          sizeof(env->radix_page_info.entries[0]))));
> +    }
>  }
>  
>  static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index afb7ddbdd0..5a96d98b6f 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -914,6 +914,10 @@ struct ppc_segment_page_sizes {
>      struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
>  };
>  
> +struct ppc_radix_page_info {
> +    uint32_t count;
> +    uint32_t entries[PPC_PAGE_SIZES_MAX_SZ];

IIUC this info is ready for direct inclusion in the device tree:
i.e. it's big-endian.  That absolutely needs a comment in the
structure.  I'm also not sure it's a good idea, since I assume the TCG
POWER9 code will eventually need to access this information directly
to implement the radix MMU.

Might be clearer to make this data structure native and do the BE
conversion when generating the device tree.

> +};
>  
>  /*****************************************************************************/
>  /* The whole PowerPC CPU context */
> @@ -1053,6 +1057,7 @@ struct CPUPPCState {
>      ppc_slb_t vrma_slb;
>      target_ulong rmls;
>      bool ci_large_pages;
> +    struct ppc_radix_page_info radix_page_info;

I'm not sure this belongs in CPUPPCState.  New fields should generally
be added to PowerPCCPU ("cpu") rather than to CPUPPCState ("env")
unless they need to be directly accessed from TCG generated code.

But even more, AFAICT this should vary only with the CPU type/model,
not with the individual CPU instance.  So this information could
probably go into the CPU class structure instead of the instance.

Yes, there are a lot of things that don't obey those rules already -
that's because a lot of stuff hasn't been converted since the new QOM
stuff was introduced.  But we shouldn't make it any worse with new
patches.

>  #endif
>  
>  #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index ec92c64159..390d6342cc 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -328,6 +328,18 @@ static void kvm_get_smmu_info(PowerPCCPU *cpu, struct kvm_ppc_smmu_info *info)
>      kvm_get_fallback_smmu_info(cpu, info);
>  }
>  
> +static bool kvm_get_rmmu_info(PowerPCCPU *cpu, struct kvm_ppc_rmmu_info *info)
> +{
> +    CPUState *cs = CPU(cpu);
> +    int ret;
> +
> +    if (kvm_check_extension(cs->kvm_state, KVM_CAP_PPC_MMU_RADIX)) {
> +        ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_GET_RMMU_INFO, info);
> +        return (ret == 0);
> +    }
> +    return false;
> +}
> +
>  static long gethugepagesize(const char *mem_path)
>  {
>      struct statfs fs;
> @@ -441,9 +453,11 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
>  {
>      static struct kvm_ppc_smmu_info smmu_info;
>      static bool has_smmu_info;
> +    static struct kvm_ppc_rmmu_info rmmu_info;
> +    static bool has_rmmu_info;
>      CPUPPCState *env = &cpu->env;
>      long rampagesize;
> -    int iq, ik, jq, jk;
> +    int iq, ik, jq, jk, i;
>      bool has_64k_pages = false;
>  
>      /* We only handle page sizes for 64-bit server guests for now */
> @@ -508,6 +522,22 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
>      if (!has_64k_pages) {
>          env->mmu_model &= ~POWERPC_MMU_64K;
>      }
> +
> +    /* Collect radix page info from kernel if not already */
> +    if (!has_rmmu_info) {

Putting the data in the class would avoid this ugly messing with a
static local, for one thing.

> +        env->radix_page_info.count = 0;
> +        if (kvm_get_rmmu_info(cpu, &rmmu_info)) {
> +            for (i = 0; i < 8; i++) {

s/8/PPC_PAGE_SIZES_MAX_SZ/ ?

> +                if (rmmu_info.ap_encodings[i]) {
> +                    env->radix_page_info.entries[i] =
> +                        cpu_to_be32(rmmu_info.ap_encodings[i]);
> +                    env->radix_page_info.count++;
> +                }
> +            }
> +        }
> +        has_rmmu_info = true;
> +    }
> +
>  }
>  #else /* defined (TARGET_PPC64) */
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 4/9] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 4/9] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3 Sam Bobroff
@ 2017-02-09  2:16   ` David Gibson
  0 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:16 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 3076 bytes --]

On Tue, Feb 07, 2017 at 01:56:47PM +1100, Sam Bobroff wrote:
> Query and cache the value of two new KVM capabilities that indicate
> KVM's support for new radix and hash modes of the MMU.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  target/ppc/kvm.c     | 14 ++++++++++++++
>  target/ppc/kvm_ppc.h | 12 ++++++++++++
>  2 files changed, 26 insertions(+)
> 
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 390d6342cc..8d6fd1b067 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -81,6 +81,8 @@ static int cap_papr;
>  static int cap_htab_fd;
>  static int cap_fixup_hcalls;
>  static int cap_htm;             /* Hardware transactional memory support */
> +static int cap_mmu_radix;
> +static int cap_mmu_hash;

Please rename this cap_mmu_hashv3 to avoid confusion.

Apart from that,

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

>  
>  static uint32_t debug_inst_opcode;
>  
> @@ -134,6 +136,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>      cap_htab_fd = kvm_check_extension(s, KVM_CAP_PPC_HTAB_FD);
>      cap_fixup_hcalls = kvm_check_extension(s, KVM_CAP_PPC_FIXUP_HCALL);
>      cap_htm = kvm_vm_check_extension(s, KVM_CAP_PPC_HTM);
> +    cap_mmu_radix = kvm_vm_check_extension(s, KVM_CAP_PPC_MMU_RADIX);
> +    cap_mmu_hash = kvm_vm_check_extension(s, KVM_CAP_PPC_MMU_HASH_V3);
>  
>      if (!cap_interrupt_level) {
>          fprintf(stderr, "KVM: Couldn't find level irq capability. Expect the "
> @@ -2408,6 +2412,16 @@ bool kvmppc_has_cap_htm(void)
>      return cap_htm;
>  }
>  
> +bool kvmppc_has_cap_mmu_radix(void)
> +{
> +    return cap_mmu_radix;
> +}
> +
> +bool kvmppc_has_cap_mmu_hash(void)
> +{
> +    return cap_mmu_hash;
> +}
> +
>  static PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
>  {
>      ObjectClass *oc = OBJECT_CLASS(pcc);
> diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
> index 4b43283913..1c1b94847c 100644
> --- a/target/ppc/kvm_ppc.h
> +++ b/target/ppc/kvm_ppc.h
> @@ -56,6 +56,8 @@ void kvmppc_hash64_write_pte(CPUPPCState *env, target_ulong pte_index,
>                               target_ulong pte0, target_ulong pte1);
>  bool kvmppc_has_cap_fixup_hcalls(void);
>  bool kvmppc_has_cap_htm(void);
> +bool kvmppc_has_cap_mmu_radix(void);
> +bool kvmppc_has_cap_mmu_hash(void);
>  int kvmppc_enable_hwrng(void);
>  int kvmppc_put_books_sregs(PowerPCCPU *cpu);
>  PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
> @@ -255,6 +257,16 @@ static inline bool kvmppc_has_cap_htm(void)
>      return false;
>  }
>  
> +static inline bool kvmppc_has_cap_mmu_radix(void)
> +{
> +    return false;
> +}
> +
> +static inline bool kvmppc_has_cap_mmu_hash(void)
> +{
> +    return false;
> +}
> +
>  static inline int kvmppc_enable_hwrng(void)
>  {
>      return -1;

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 5/9] spapr: Only setup HTP if necessary.
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 5/9] spapr: Only setup HTP if necessary Sam Bobroff
@ 2017-02-09  2:24   ` David Gibson
  0 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:24 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 2141 bytes --]

On Tue, Feb 07, 2017 at 01:56:48PM +1100, Sam Bobroff wrote:
> Because KVM cannot support radix and hash modes concurrently, QEMU can
> avoid allocating a hash page table if KVM supports radix mode.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>

This isn't quite right, it's doing the HPT handling based on whether
or not we *can* do RPT rather than whether we *are* doing RPT.

It'll mostly work for now, while only radix-on-radix and hash-on-hash
are supported, but that won't be true forever.

It will already be wrong if, for example, you tried to run a POWER8
TCG guest on a host that happened to be a POWER9 in radix mode.

> ---
>  hw/ppc/spapr.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index d629e2630c..1411e470c0 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1150,15 +1150,17 @@ static void ppc_spapr_reset(void)
>      /* Check for unknown sysbus devices */
>      foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL);
>  
> -    /* Allocate and/or reset the hash page table */
> -    spapr_reallocate_hpt(spapr,
> +    if (!kvmppc_has_cap_mmu_radix()) {
> +        /* Allocate and/or reset the hash page table */
> +        spapr_reallocate_hpt(spapr,
>                           spapr_hpt_shift_for_ramsize(machine->maxram_size),
>                           &error_fatal);
>  
> -    /* Update the RMA size if necessary */
> -    if (spapr->vrma_adjust) {
> -        spapr->rma_size = kvmppc_rma_size(spapr_node0_size(),
> -                                          spapr->htab_shift);
> +        /* Update the RMA size if necessary */
> +        if (spapr->vrma_adjust) {
> +            spapr->rma_size = kvmppc_rma_size(spapr_node0_size(),
> +                                              spapr->htab_shift);
> +        }
>      }
>  
>      qemu_devices_reset();

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall Sam Bobroff
@ 2017-02-09  2:32   ` David Gibson
  2017-02-09  4:16   ` [Qemu-devel] [Qemu-ppc] " Alexey Kardashevskiy
  1 sibling, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:32 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 5561 bytes --]

On Tue, Feb 07, 2017 at 01:56:49PM +1100, Sam Bobroff wrote:
> Both radix and hash modes require guests to use
> h_register_process_table() to set up the MMU. Implement it using the
> new KVM ioctl KVM_PPC_CONFIGURE_V3_MMU.
> 
> This hypercall is also necessary for fully emulated guests, so it will
> need to be reworked to integrate with Suraj's TCG patchset.
> ---
>  hw/ppc/spapr_hcall.c   | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/hw/ppc/spapr.h |  3 ++-
>  target/ppc/kvm.c       | 12 ++++++++++++
>  target/ppc/kvm_ppc.h   |  1 +
>  4 files changed, 63 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index c9bb6624c4..4de511c386 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -1049,6 +1049,50 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
>      return H_SUCCESS;
>  }
>  
> +static target_ulong h_register_process_table(PowerPCCPU *cpu,
> +                                             sPAPRMachineState *spapr,
> +                                             target_ulong opcode,
> +                                             target_ulong *args)
> +{
> +    static target_ulong last_process_table;

Ewwww.. a static local?  Store this info in sPAPRMachineState instead;
chances are you'll want it in other places eventually anyway (even if
only for debugging).


> +    target_ulong flags = args[0];
> +    target_ulong proc_tbl = args[1];
> +    target_ulong page_size = args[2];
> +    target_ulong table_size = args[3];
> +    uint64_t cflags, cproc;
> +
> +    cflags = (flags & 4) ? KVM_PPC_MMUV3_RADIX : 0;

No #defines for the bits in the hcall arguments?

> +    cflags |= (flags & 1) ? KVM_PPC_MMUV3_GTSE : 0;
> +    cproc = (flags & 4) ? (1ul << 63) : 0;
> +    if (!(flags & 0x10)) {
> +        if ((last_process_table & (1ul << 63)) != cproc) {
> +            return H_PARAMETER;
> +        }
> +        cproc = last_process_table;
> +    } else if (!(flags & 0x8)) {
> +        ; /* do nothing */
> +    } else if (flags & 4) {
> +        /* radix */
> +        if (table_size > 24 || (proc_tbl & 0xfff) || (proc_tbl >> 60)) {
> +            return H_PARAMETER;
> +        }
> +        cproc |= proc_tbl | table_size;
> +    } else {
> +        /* hash, possibly with process table */
> +        if (table_size > 24 || (proc_tbl >> 38) || page_size > 7) {
> +            return H_PARAMETER;
> +        }
> +        cproc = (proc_tbl << 25) | (page_size << 5) | table_size;
> +    }
> +    last_process_table = cproc;
> +    fprintf(stderr, "calling config mmu flags=%lx proctbl=%lx\n",
> +            cflags, cproc);
> +    if  (!kvmppc_configure_v3_mmu(cpu, cflags, cproc)) {
> +        return H_HARDWARE;
> +    }
> +    return H_SUCCESS;
> +}
> +
>  static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
>  static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_HCALL_BASE + 1];
>  
> @@ -1136,6 +1180,10 @@ static void hypercall_register_types(void)
>  
>      /* ibm,client-architecture-support support */
>      spapr_register_hypercall(KVMPPC_H_CAS, h_client_architecture_support);
> +
> +    /* Power9 MMU support */
> +    spapr_register_hypercall(H_REGISTER_PROCESS_TABLE,
> +                             h_register_process_table);
>  }
>  
>  type_init(hypercall_register_types)
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index bd5bcf70de..92bda0f36d 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -347,7 +347,8 @@ struct sPAPRMachineState {
>  #define H_XIRR_X                0x2FC
>  #define H_RANDOM                0x300
>  #define H_SET_MODE              0x31C
> -#define MAX_HCALL_OPCODE        H_SET_MODE
> +#define H_REGISTER_PROCESS_TABLE 0x37C
> +#define MAX_HCALL_OPCODE        H_REGISTER_PROCESS_TABLE
>  
>  /* The hcalls above are standardized in PAPR and implemented by pHyp
>   * as well.
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 8d6fd1b067..0d1443616c 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -344,6 +344,18 @@ static bool kvm_get_rmmu_info(PowerPCCPU *cpu, struct kvm_ppc_rmmu_info *info)
>      return false;
>  }
>  
> +bool kvmppc_configure_v3_mmu(PowerPCCPU *cpu, uint64_t flags, uint64_t proc_tbl)
> +{
> +    CPUState *cs = CPU(cpu);
> +    int ret;
> +    struct kvm_ppc_mmuv3_cfg cfg;
> +
> +    cfg.flags = flags;
> +    cfg.process_table = proc_tbl;
> +    ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_CONFIGURE_V3_MMU, &cfg);
> +    return ret == 0;
> +}
> +
>  static long gethugepagesize(const char *mem_path)
>  {
>      struct statfs fs;
> diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
> index 1c1b94847c..0b8b77583a 100644
> --- a/target/ppc/kvm_ppc.h
> +++ b/target/ppc/kvm_ppc.h
> @@ -33,6 +33,7 @@ int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
>  int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
>  int kvmppc_set_tcr(PowerPCCPU *cpu);
>  int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
> +bool kvmppc_configure_v3_mmu(PowerPCCPU *cpu, uint64_t flags, uint64_t proctbl);
>  #ifndef CONFIG_USER_ONLY
>  off_t kvmppc_alloc_rma(void **rma);
>  bool kvmppc_spapr_use_multitce(void);

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 7/9] spapr: Set ISA 3.00 radix and hash bits in OV5
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 7/9] spapr: Set ISA 3.00 radix and hash bits in OV5 Sam Bobroff
@ 2017-02-09  2:34   ` David Gibson
  0 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:34 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 2482 bytes --]

On Tue, Feb 07, 2017 at 01:56:50PM +1100, Sam Bobroff wrote:
> Set new option vector 5 bits to indicate KVM support for in-memory
> radix or hash modes and related options. The existing logic will
> propagate the results back to the guest in the device tree. This
> allows guests to perform client architecture support negotiation on
> the new radix and hash MMU modes and will cause ISA 3.00 guests to
> start using h_register_process_table().
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  hw/ppc/spapr.c              | 8 ++++++++
>  include/hw/ppc/spapr_ovec.h | 6 ++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 1411e470c0..c6a3a638cd 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -1862,6 +1862,14 @@ static void ppc_spapr_init(MachineState *machine)
>      }
>  
>      spapr_ovec_set(spapr->ov5, OV5_FORM1_AFFINITY);
> +    if (kvmppc_has_cap_mmu_radix()) {
> +        spapr_ovec_set(spapr->ov5, OV5_MMU_RADIX);
> +    }
> +    if (kvmppc_has_cap_mmu_hash()) {
> +        spapr_ovec_set(spapr->ov5, OV5_MMU_HASH);
> +    }
> +    spapr_ovec_set(spapr->ov5, OV5_SEG_HCALL);
> +    spapr_ovec_set(spapr->ov5, OV5_SHOOTDOWN);

What are these last two bits about?  AFAICT nothing has been
implemented for them, and they shouldn't be set until that's the case.

>  
>      /* advertise support for dedicated HP event source to guests */
>      if (spapr->use_hotplug_event_source) {
> diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h
> index 0f14753ff8..0a77e2a14b 100644
> --- a/include/hw/ppc/spapr_ovec.h
> +++ b/include/hw/ppc/spapr_ovec.h
> @@ -47,6 +47,12 @@ typedef struct sPAPROptionVector sPAPROptionVector;
>  #define OV5_DRCONF_MEMORY       OV_BIT(2, 2)
>  #define OV5_FORM1_AFFINITY      OV_BIT(5, 0)
>  #define OV5_HP_EVT              OV_BIT(6, 5)
> +#define OV5_INT_ARCH_LVL        OV_BIT(23, 7)
> +#define OV5_MMU_RADIX           OV_BIT(24, 0)
> +#define OV5_MMU_HASH            OV_BIT(24, 1)
> +#define OV5_SEG_RADIX           OV_BIT(24, 2)
> +#define OV5_SEG_HCALL           OV_BIT(24, 3)
> +#define OV5_SHOOTDOWN           OV_BIT(24, 4)
>  
>  /* interfaces */
>  sPAPROptionVector *spapr_ovec_new(void);

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 8/9] spapr: Advertise ISA 3.0 MMU features in pa_features
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 8/9] spapr: Advertise ISA 3.0 MMU features in pa_features Sam Bobroff
@ 2017-02-09  2:42   ` David Gibson
  0 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:42 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 10063 bytes --]

On Tue, Feb 07, 2017 at 01:56:51PM +1100, Sam Bobroff wrote:
> Set the default ibm,pa_features bits for ISA 3.0.
> 
> Providing the radix MMU support bit in ibm,pa-features will cause some
> recent (e.g. 4.9) kernels to attempt to initialize the MMU as if they
> were a radix host, which will cause them to crash. So, if a guest
> performs a client architecture support call without indicating ISA
> 3.00 support (specifically, if they do not indicate that they support
> either new radix or new hash mode) then the radix bit is removed from
> ibm,pa-features to avoid triggering the bug.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> ---
>  hw/ppc/spapr.c         | 125 +++++++++++++++++++++++++++++++------------------
>  hw/ppc/spapr_hcall.c   |   4 +-
>  include/hw/ppc/spapr.h |   1 +
>  3 files changed, 83 insertions(+), 47 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index c6a3a638cd..325a9c587b 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -194,6 +194,76 @@ static int spapr_fixup_cpu_numa_dt(void *fdt, int offset, CPUState *cs)
>      return ret;
>  }
>  
> +/* Populate the "ibm,pa-features" property */
> +static int spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset,
> +                                      bool legacy_guest)
> +{
> +    uint8_t pa_features_206[] = { 6, 0,
> +        0xf6, 0x1f, 0xc7, 0x00, 0x80, 0xc0 };
> +    uint8_t pa_features_207[] = { 24, 0,
> +        0xf6, 0x1f, 0xc7, 0xc0, 0x80, 0xf0,
> +        0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
> +        0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
> +        0x80, 0x00, 0x80, 0x00, 0x00, 0x00 };
> +    uint8_t pa_features_300[70 + 2] = { 70, 0,
> +        0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xf0, /* 0 - 5 */
> +        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, /* 6 - 11 */
> +        0x00, 0x00, 0x00, 0x00, 0x80, 0x00, /* 12 - 17 */
> +        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 18 - 23 */
> +        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 24 - 29 */
> +        0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, /* 30 - 35 */
> +        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 36 - 41 */
> +        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 42 - 47 */
> +        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 48 - 53 */
> +        0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /* 54 - 59 */
> +        0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* 60 - 64 */
> +        0x00, 0x00, 0x00, 0x00,             /* 66 - 69 */
> +        };
> +    uint8_t *pa_features;
> +    size_t pa_size;
> +
> +    switch (env->mmu_model) {
> +    case POWERPC_MMU_2_06:
> +    case POWERPC_MMU_2_06a:
> +        pa_features = pa_features_206;
> +        pa_size = sizeof(pa_features_206);
> +        break;
> +    case POWERPC_MMU_2_07:
> +    case POWERPC_MMU_2_07a:
> +        pa_features = pa_features_207;
> +        pa_size = sizeof(pa_features_207);
> +        break;
> +    case POWERPC_MMU_3_00:
> +        pa_features = pa_features_300;
> +        pa_size = sizeof(pa_features_300);
> +        break;
> +    default:
> +        return 0; /* TODO, this is actually an error! */
> +    }
> +
> +    if (env->ci_large_pages) {
> +        /*
> +         * Note: we keep CI large pages off by default because a 64K capable
> +         * guest provisioned with large pages might otherwise try to map a qemu
> +         * framebuffer (or other kind of memory mapped PCI BAR) using 64K pages
> +         * even if that qemu runs on a 4k host.
> +         * We dd this bit back here if we are confident this is not an issue
> +         */
> +        pa_features[3] |= 0x20;
> +    }
> +    if (kvmppc_has_cap_htm() && pa_size > 24) {
> +        pa_features[24] |= 0x80;    /* Transactional memory support */
> +    }
> +    if (legacy_guest && pa_size > 40) {
> +        /* Workaround for broken kernels that attempt (guest) radix
> +         * mode when they can't handle it, if they see the radix bit set
> +         * in pa-features. So hide it from them. */
> +        pa_features[40 + 2] &= ~0x80; /* Radix MMU */
> +    }
> +
> +    return fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size);
> +}
> +
>  static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
>  {
>      int ret = 0, offset, cpus_offset;
> @@ -204,6 +274,7 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
>  
>      CPU_FOREACH(cs) {
>          PowerPCCPU *cpu = POWERPC_CPU(cs);
> +        CPUPPCState *env = &cpu->env;
>          DeviceClass *dc = DEVICE_GET_CLASS(cs);
>          int index = ppc_get_vcpu_dt_id(cpu);
>  
> @@ -245,6 +316,12 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
>          if (ret < 0) {
>              return ret;
>          }
> +
> +        ret = spapr_populate_pa_features(env, fdt, offset,
> +                                         spapr->cas_legacy_guest_workaround);
> +        if (ret < 0) {
> +            return ret;
> +        }
>      }
>      return ret;
>  }
> @@ -346,51 +423,6 @@ static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
>      return 0;
>  }
>  
> -/* Populate the "ibm,pa-features" property */
> -static void spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset)
> -{
> -    uint8_t pa_features_206[] = { 6, 0,
> -        0xf6, 0x1f, 0xc7, 0x00, 0x80, 0xc0 };
> -    uint8_t pa_features_207[] = { 24, 0,
> -        0xf6, 0x1f, 0xc7, 0xc0, 0x80, 0xf0,
> -        0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
> -        0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
> -        0x80, 0x00, 0x80, 0x00, 0x00, 0x00 };
> -    uint8_t *pa_features;
> -    size_t pa_size;
> -
> -    switch (env->mmu_model) {
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> -        pa_features = pa_features_206;
> -        pa_size = sizeof(pa_features_206);
> -        break;
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> -        pa_features = pa_features_207;
> -        pa_size = sizeof(pa_features_207);
> -        break;
> -    default:
> -        return;
> -    }
> -
> -    if (env->ci_large_pages) {
> -        /*
> -         * Note: we keep CI large pages off by default because a 64K capable
> -         * guest provisioned with large pages might otherwise try to map a qemu
> -         * framebuffer (or other kind of memory mapped PCI BAR) using 64K pages
> -         * even if that qemu runs on a 4k host.
> -         * We dd this bit back here if we are confident this is not an issue
> -         */
> -        pa_features[3] |= 0x20;
> -    }
> -    if (kvmppc_has_cap_htm() && pa_size > 24) {
> -        pa_features[24] |= 0x80;    /* Transactional memory support */
> -    }
> -
> -    _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
> -}
> -
>  static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
>                                    sPAPRMachineState *spapr)
>  {
> @@ -484,7 +516,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
>                            page_sizes_prop, page_sizes_prop_size)));
>      }
>  
> -    spapr_populate_pa_features(env, fdt, offset);
> +    _FDT(spapr_populate_pa_features(env, fdt, offset, false));
>  
>      _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id",
>                             cs->cpu_index / vcpus_per_socket)));
> @@ -1870,6 +1902,7 @@ static void ppc_spapr_init(MachineState *machine)
>      }
>      spapr_ovec_set(spapr->ov5, OV5_SEG_HCALL);
>      spapr_ovec_set(spapr->ov5, OV5_SHOOTDOWN);
> +    spapr_ovec_set(spapr->ov5, OV5_SEG_HCALL);

Dup'ed line above.

>  
>      /* advertise support for dedicated HP event source to guests */
>      if (spapr->use_hotplug_event_source) {
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index 4de511c386..d04f696e65 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -999,7 +999,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
>          }
>      }
>  
> -    if (!cpu_version) {
> +    if (!cpu_version  && !spapr->cas_legacy_guest_workaround) {
>          cpu_update = false;
>      }
>  
> @@ -1033,6 +1033,8 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
>                                          ov5_cas_old, spapr->ov5_cas);
>      spapr_ovec_stderr("update", 16, ov5_updates);
>      fprintf(stderr, "Old CAS reboot flag: %d\n", spapr->cas_reboot);
> +    spapr->cas_legacy_guest_workaround = !spapr_ovec_test(ov5_updates, OV5_MMU_RADIX) &&
> +                                         !spapr_ovec_test(ov5_updates, OV5_MMU_HASH);

This is a little bit icky, since cas_legacy_guest_workaround isn't
explicitly reset when you have a non-CAS reboot.  In practice it will
probably work, because it is reset on every CAS, but it does mean that
the pre-CAS value can depend on the previous guest booted which is
conceptually incorrect.

I think it would be preferable to determine whether you have a legacy
guest at the point you need it, directly from spapr->ov5_cas.  The CAS
core already manages resets of that correctly across both CAS and
non-CAS reboots.


>      if (!spapr->cas_reboot) {
>          spapr->cas_reboot =
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 92bda0f36d..974338d1df 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -77,6 +77,7 @@ struct sPAPRMachineState {
>      sPAPROptionVector *ov5;         /* QEMU-supported option vectors */
>      sPAPROptionVector *ov5_cas;     /* negotiated (via CAS) option vectors */
>      bool cas_reboot;
> +    bool cas_legacy_guest_workaround;
>  
>      Notifier epow_notifier;
>      QTAILQ_HEAD(, sPAPREventLogEntry) pending_events;

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 9/9] spapr: Small cleanup of PPC MMU enums
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 9/9] spapr: Small cleanup of PPC MMU enums Sam Bobroff
@ 2017-02-09  2:49   ` David Gibson
  0 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:49 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 13034 bytes --]

On Tue, Feb 07, 2017 at 01:56:52PM +1100, Sam Bobroff wrote:
> The PPC MMU types are sometimes treated as if they were a bit field
> and sometime as if they were an enum which causes maintenance
> problems: flipping bits in the MMU type (which is done on both the 1TB
> segment and 64K segment bits) currently produces new MMU type
> values that are not handled in every "switch" on it, sometimes causing
> an abort().
> 
> This patch provides some macros that can be used to filter out the
> "bit field-like" bits so that the remainder of the value can be
> switched on, like an enum. This allows removal of all of the
> "degraded" types from the list and should ease maintenance.
> 
> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

This looks like a good fix independent of the POWER9 stuff.  Can you
move this to the front of the series (which will require fixing some
rebase conflicts) so I can apply it without waiting on the rest?

> ---
>  hw/ppc/spapr.c          | 10 +++-----
>  target/ppc/cpu-qom.h    | 12 ++++-----
>  target/ppc/kvm.c        |  8 +++---
>  target/ppc/mmu-hash64.c | 10 ++++----
>  target/ppc/mmu_helper.c | 67 ++++++++++++++++++++-----------------------------
>  target/ppc/translate.c  | 12 ++++-----
>  6 files changed, 51 insertions(+), 68 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 325a9c587b..f9de02759a 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -222,18 +222,16 @@ static int spapr_populate_pa_features(CPUPPCState *env, void *fdt, int offset,
>      uint8_t *pa_features;
>      size_t pa_size;
>  
> -    switch (env->mmu_model) {
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> +    switch (POWERPC_MMU_VER(env->mmu_model)) {
> +    case POWERPC_MMU_VER_2_06:
>          pa_features = pa_features_206;
>          pa_size = sizeof(pa_features_206);
>          break;
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> +    case POWERPC_MMU_VER_2_07:
>          pa_features = pa_features_207;
>          pa_size = sizeof(pa_features_207);
>          break;
> -    case POWERPC_MMU_3_00:
> +    case POWERPC_MMU_VER_3_00:
>          pa_features = pa_features_300;
>          pa_size = sizeof(pa_features_300);
>          break;
> diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> index 1577cc8224..8ea055c18d 100644
> --- a/target/ppc/cpu-qom.h
> +++ b/target/ppc/cpu-qom.h
> @@ -79,21 +79,21 @@ enum powerpc_mmu_t {
>      POWERPC_MMU_2_06       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG
>                               | POWERPC_MMU_64K
>                               | POWERPC_MMU_AMR | 0x00000003,
> -    /* Architecture 2.06 "degraded" (no 1T segments)           */
> -    POWERPC_MMU_2_06a      = POWERPC_MMU_64 | POWERPC_MMU_AMR
> -                             | 0x00000003,
>      /* Architecture 2.07 variant                               */
>      POWERPC_MMU_2_07       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG
>                               | POWERPC_MMU_64K
>                               | POWERPC_MMU_AMR | 0x00000004,
> -    /* Architecture 2.07 "degraded" (no 1T segments)           */
> -    POWERPC_MMU_2_07a      = POWERPC_MMU_64 | POWERPC_MMU_AMR
> -                             | 0x00000004,
>      /* Architecture 3.00 variant                               */
>      POWERPC_MMU_3_00       = POWERPC_MMU_64 | POWERPC_MMU_1TSEG
>                               | POWERPC_MMU_64K
>                               | POWERPC_MMU_AMR | 0x00000005,
>  };
> +#define POWERPC_MMU_VER(x) ((x) & (POWERPC_MMU_64 | 0xFFFF))
> +#define POWERPC_MMU_VER_64B POWERPC_MMU_VER(POWERPC_MMU_64B)
> +#define POWERPC_MMU_VER_2_03 POWERPC_MMU_VER(POWERPC_MMU_2_03)
> +#define POWERPC_MMU_VER_2_06 POWERPC_MMU_VER(POWERPC_MMU_2_06)
> +#define POWERPC_MMU_VER_2_07 POWERPC_MMU_VER(POWERPC_MMU_2_07)
> +#define POWERPC_MMU_VER_3_00 POWERPC_MMU_VER(POWERPC_MMU_3_00)
>  
>  /*****************************************************************************/
>  /* Exception model                                                           */
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 0d1443616c..1687d8e47e 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -285,8 +285,8 @@ static void kvm_get_fallback_smmu_info(PowerPCCPU *cpu,
>              info->flags |= KVM_PPC_1T_SEGMENTS;
>          }
>  
> -        if (env->mmu_model == POWERPC_MMU_2_06 ||
> -            env->mmu_model == POWERPC_MMU_2_07) {
> +        if (POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_06 ||
> +           POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_07) {
>              info->slb_size = 32;
>          } else {
>              info->slb_size = 64;
> @@ -300,8 +300,8 @@ static void kvm_get_fallback_smmu_info(PowerPCCPU *cpu,
>          i++;
>  
>          /* 64K on MMU 2.06 and later */
> -        if (env->mmu_model == POWERPC_MMU_2_06 ||
> -            env->mmu_model == POWERPC_MMU_2_07) {
> +        if (POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_06 ||
> +            POWERPC_MMU_VER(env->mmu_model) == POWERPC_MMU_VER_2_07) {
>              info->sps[i].page_shift = 16;
>              info->sps[i].slb_enc = 0x110;
>              info->sps[i].enc[0].page_shift = 16;
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 0efc8c63fa..7f0b7b3df5 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -1004,8 +1004,8 @@ void helper_store_lpcr(CPUPPCState *env, target_ulong val)
>      uint64_t lpcr = 0;
>  
>      /* Filter out bits */
> -    switch (env->mmu_model) {
> -    case POWERPC_MMU_64B: /* 970 */
> +    switch (POWERPC_MMU_VER(env->mmu_model)) {
> +    case POWERPC_MMU_VER_64B: /* 970 */
>          if (val & 0x40) {
>              lpcr |= LPCR_LPES0;
>          }
> @@ -1031,19 +1031,19 @@ void helper_store_lpcr(CPUPPCState *env, target_ulong val)
>           * to dig HRMOR out of HID5
>           */
>          break;
> -    case POWERPC_MMU_2_03: /* P5p */
> +    case POWERPC_MMU_VER_2_03: /* P5p */
>          lpcr = val & (LPCR_RMLS | LPCR_ILE |
>                        LPCR_LPES0 | LPCR_LPES1 |
>                        LPCR_RMI | LPCR_HDICE);
>          break;
> -    case POWERPC_MMU_2_06: /* P7 */
> +    case POWERPC_MMU_VER_2_06: /* P7 */
>          lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
>                        LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
>                        LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
>                        LPCR_MER | LPCR_TC |
>                        LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE);
>          break;
> -    case POWERPC_MMU_2_07: /* P8 */
> +    case POWERPC_MMU_VER_2_07: /* P8 */
>          lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
>                        LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
>                        LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
> diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
> index 172a305e0f..e65e4d337f 100644
> --- a/target/ppc/mmu_helper.c
> +++ b/target/ppc/mmu_helper.c
> @@ -1260,7 +1260,7 @@ static void mmu6xx_dump_mmu(FILE *f, fprintf_function cpu_fprintf,
>  
>  void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env)
>  {
> -    switch (env->mmu_model) {
> +    switch (POWERPC_MMU_VER(env->mmu_model)) {
>      case POWERPC_MMU_BOOKE:
>          mmubooke_dump_mmu(f, cpu_fprintf, env);
>          break;
> @@ -1272,12 +1272,10 @@ void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env)
>          mmu6xx_dump_mmu(f, cpu_fprintf, env);
>          break;
>  #if defined(TARGET_PPC64)
> -    case POWERPC_MMU_64B:
> -    case POWERPC_MMU_2_03:
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> +    case POWERPC_MMU_VER_64B:
> +    case POWERPC_MMU_VER_2_03:
> +    case POWERPC_MMU_VER_2_06:
> +    case POWERPC_MMU_VER_2_07:
>          dump_slb(f, cpu_fprintf, ppc_env_get_cpu(env));
>          break;
>  #endif
> @@ -1412,14 +1410,12 @@ hwaddr ppc_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
>      CPUPPCState *env = &cpu->env;
>      mmu_ctx_t ctx;
>  
> -    switch (env->mmu_model) {
> +    switch (POWERPC_MMU_VER(env->mmu_model)) {
>  #if defined(TARGET_PPC64)
> -    case POWERPC_MMU_64B:
> -    case POWERPC_MMU_2_03:
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> +    case POWERPC_MMU_VER_64B:
> +    case POWERPC_MMU_VER_2_03:
> +    case POWERPC_MMU_VER_2_06:
> +    case POWERPC_MMU_VER_2_07:
>          return ppc_hash64_get_phys_page_debug(cpu, addr);
>  #endif
>  
> @@ -1904,6 +1900,12 @@ void ppc_tlb_invalidate_all(CPUPPCState *env)
>  {
>      PowerPCCPU *cpu = ppc_env_get_cpu(env);
>  
> +#if defined(TARGET_PPC64)
> +    if (env->mmu_model & POWERPC_MMU_64) {
> +        env->tlb_need_flush = 0;
> +        tlb_flush(CPU(cpu));
> +    } else
> +#endif /* defined(TARGET_PPC64) */
>      switch (env->mmu_model) {
>      case POWERPC_MMU_SOFT_6xx:
>      case POWERPC_MMU_SOFT_74xx:
> @@ -1928,21 +1930,12 @@ void ppc_tlb_invalidate_all(CPUPPCState *env)
>          break;
>      case POWERPC_MMU_32B:
>      case POWERPC_MMU_601:
> -#if defined(TARGET_PPC64)
> -    case POWERPC_MMU_64B:
> -    case POWERPC_MMU_2_03:
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> -    case POWERPC_MMU_3_00:
> -#endif /* defined(TARGET_PPC64) */
>          env->tlb_need_flush = 0;
>          tlb_flush(CPU(cpu));
>          break;
>      default:
>          /* XXX: TODO */
> -        cpu_abort(CPU(cpu), "Unknown MMU model %d\n", env->mmu_model);
> +        cpu_abort(CPU(cpu), "Unknown MMU model %x\n", env->mmu_model);
>          break;
>      }
>  }
> @@ -1951,6 +1944,16 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
>  {
>  #if !defined(FLUSH_ALL_TLBS)
>      addr &= TARGET_PAGE_MASK;
> +#if defined(TARGET_PPC64)
> +    if (env->mmu_model & POWERPC_MMU_64) {
> +        /* tlbie invalidate TLBs for all segments */
> +        /* XXX: given the fact that there are too many segments to invalidate,
> +         *      and we still don't have a tlb_flush_mask(env, n, mask) in QEMU,
> +         *      we just invalidate all TLBs
> +         */
> +        env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
> +    } else
> +#endif /* defined(TARGET_PPC64) */
>      switch (env->mmu_model) {
>      case POWERPC_MMU_SOFT_6xx:
>      case POWERPC_MMU_SOFT_74xx:
> @@ -1968,22 +1971,6 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
>           */
>          env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
>          break;
> -#if defined(TARGET_PPC64)
> -    case POWERPC_MMU_64B:
> -    case POWERPC_MMU_2_03:
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> -    case POWERPC_MMU_3_00:
> -        /* tlbie invalidate TLBs for all segments */
> -        /* XXX: given the fact that there are too many segments to invalidate,
> -         *      and we still don't have a tlb_flush_mask(env, n, mask) in QEMU,
> -         *      we just invalidate all TLBs
> -         */
> -        env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
> -        break;
> -#endif /* defined(TARGET_PPC64) */
>      default:
>          /* Should never reach here with other MMU models */
>          assert(0);
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index 121218087f..1edf3f2133 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -6910,18 +6910,16 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
>      }
>  #endif
>  
> -    switch (env->mmu_model) {
> +    switch (POWERPC_MMU_VER(env->mmu_model)) {
>      case POWERPC_MMU_32B:
>      case POWERPC_MMU_601:
>      case POWERPC_MMU_SOFT_6xx:
>      case POWERPC_MMU_SOFT_74xx:
>  #if defined(TARGET_PPC64)
> -    case POWERPC_MMU_64B:
> -    case POWERPC_MMU_2_03:
> -    case POWERPC_MMU_2_06:
> -    case POWERPC_MMU_2_06a:
> -    case POWERPC_MMU_2_07:
> -    case POWERPC_MMU_2_07a:
> +    case POWERPC_MMU_VER_64B:
> +    case POWERPC_MMU_VER_2_03:
> +    case POWERPC_MMU_VER_2_06:
> +    case POWERPC_MMU_VER_2_07:
>  #endif
>          cpu_fprintf(f, " SDR1 " TARGET_FMT_lx "   DAR " TARGET_FMT_lx
>                         "  DSISR " TARGET_FMT_lx "\n", env->spr[SPR_SDR1],

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (8 preceding siblings ...)
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 9/9] spapr: Small cleanup of PPC MMU enums Sam Bobroff
@ 2017-02-09  2:51 ` David Gibson
  2017-02-09  3:21 ` Alexey Kardashevskiy
  10 siblings, 0 replies; 30+ messages in thread
From: David Gibson @ 2017-02-09  2:51 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc

[-- Attachment #1: Type: text/plain, Size: 4564 bytes --]

On Tue, Feb 07, 2017 at 01:56:43PM +1100, Sam Bobroff wrote:
> 
> Because KVM will soon provide the necessary infrastructure for KVM guests to
> run on POWER9 CPUs, we can now start exploiting this new functionality from
> QEMU. See:
> https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-January/153433.html
> 
> This work is not yet complete but it is functional and is presented for early
> review. It overlaps in some places with current work supporting the same guests
> under full emulation.
> 
> This set aims to support only the following scenarios:
> * A POWER9 host running in radix mode, running a guest in radix mode.
> * A POWER9 host running in hash mode, running a guest in hash mode.
> * A POWER9 host running in hash mode, running a guest in legacy(+) mode.
> (+) Where legacy means that the guest does not support ISA 3.00.
> 
> Hash or radix mode for the host is controlled via the "disable_radix" kernel
> command line parameter: the host will use radix unless disable_radix is given.
> For the guest it should be automatically selected to match the host.
> 
> Bad legacy guests: There are some recent kernels (e.g. 4.9) that will, when run
> as a KVM guest and if the ibm,pa-features entry in the device tree has the
> Radix MMU bit set, attempt to initialize the MMU as if they were a host (which
> will cause them to crash). To avoid exposing this problem, the Radix MMU bit
> is removed from ibm,pa-features when a legacy guest is detected.
> 
> Prerequsites:
> * This set is based on current QEMU master, but relies on some work already posted here:
> https://lists.gnu.org/archive/html/qemu-devel/2017-01/msg02527.html
> Specifically patches 1..4 which set up the new CPU and MMU models.

Ok, I've merged 1/9 and reviewed the rest.

> Notes:
>     * Migration/snapshots are not yet investigated.

So, it's reasonable to avoid migration for now.  I'm even ok merging
something without migration support *IF* it isn't a silent failure:
i.e. it must have at least a stub that will fail the migration early
if it's in a mode that's not supported.

>     * If the host cannot support the guest (e.g. radix host and a legacy guest)
>       then the guest will crash but QEMU should probably terminate with a
>       descriptive message.

Uh, yes, that would certainly be better.
> 
> 
> Sam Bobroff (9):
>   spapr: fix off-by-one error in spapr_ovec_populate_dt()
>   Update headers using update-linux-headers.sh
>   spapr: Add ibm,processor-radix-AP-encodings to the device tree
>   target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3
>   spapr: Only setup HTP if necessary.
>   spapr: Add h_register_process_table() hypercall
>   spapr: Set ISA 3.00 radix and hash bits in OV5
>   spapr: Advertise ISA 3.0 MMU features in pa_features
>   spapr: Small cleanup of PPC MMU enums
> 
>  hw/ppc/spapr.c                                     | 152 +++++---
>  hw/ppc/spapr_hcall.c                               |  52 ++-
>  hw/ppc/spapr_ovec.c                                |   2 +-
>  include/hw/ppc/spapr.h                             |   4 +-
>  include/hw/ppc/spapr_ovec.h                        |   6 +
>  include/standard-headers/linux/input-event-codes.h |   2 +-
>  include/standard-headers/linux/pci_regs.h          |   8 +
>  include/standard-headers/linux/virtio_ids.h        |   1 +
>  linux-headers/asm-arm/kvm.h                        |   2 +
>  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
>  linux-headers/asm-powerpc/kvm.h                    |  25 ++
>  linux-headers/asm-powerpc/unistd.h                 |   1 +
>  linux-headers/asm-x86/kvm_para.h                   |   4 +-
>  linux-headers/linux/kvm.h                          |  11 +-
>  linux-headers/linux/vfio.h                         |  10 +
>  target/ppc/cpu-qom.h                               |  12 +-
>  target/ppc/cpu.h                                   |   5 +
>  target/ppc/kvm.c                                   |  66 +++-
>  target/ppc/kvm_ppc.h                               |  13 +
>  target/ppc/mmu-hash64.c                            |  10 +-
>  target/ppc/mmu_helper.c                            |  67 ++--
>  target/ppc/translate.c                             |  12 +-
>  22 files changed, 346 insertions(+), 538 deletions(-)
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support
  2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
                   ` (9 preceding siblings ...)
  2017-02-09  2:51 ` [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support David Gibson
@ 2017-02-09  3:21 ` Alexey Kardashevskiy
  10 siblings, 0 replies; 30+ messages in thread
From: Alexey Kardashevskiy @ 2017-02-09  3:21 UTC (permalink / raw)
  To: Sam Bobroff, qemu-devel; +Cc: qemu-ppc, david

On 07/02/17 13:56, Sam Bobroff wrote:
> Because KVM will soon provide the necessary infrastructure for KVM guests to
> run on POWER9 CPUs, we can now start exploiting this new functionality from
> QEMU. See:
> https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-January/153433.html
> 
> This work is not yet complete but it is functional and is presented for early
> review. It overlaps in some places with current work supporting the same guests
> under full emulation.
> 
> This set aims to support only the following scenarios:
> * A POWER9 host running in radix mode, running a guest in radix mode.
> * A POWER9 host running in hash mode, running a guest in hash mode.
> * A POWER9 host running in hash mode, running a guest in legacy(+) mode.
> (+) Where legacy means that the guest does not support ISA 3.00.
> 
> Hash or radix mode for the host is controlled via the "disable_radix" kernel
> command line parameter: the host will use radix unless disable_radix is given.
> For the guest it should be automatically selected to match the host.
> 
> Bad legacy guests: There are some recent kernels (e.g. 4.9) that will, when run
> as a KVM guest and if the ibm,pa-features entry in the device tree has the
> Radix MMU bit set, attempt to initialize the MMU as if they were a host (which
> will cause them to crash). To avoid exposing this problem, the Radix MMU bit
> is removed from ibm,pa-features when a legacy guest is detected.
> 
> Prerequsites:
> * This set is based on current QEMU master, but relies on some work already posted here:
> https://lists.gnu.org/archive/html/qemu-devel/2017-01/msg02527.html
> Specifically patches 1..4 which set up the new CPU and MMU models.


It would help if you pushed this as a tree with all prerequisites somewhere
(github?); same about the kernel which has bits which this patchset is
using. Thanks.


> 
> Notes:
>     * Migration/snapshots are not yet investigated.
>     * If the host cannot support the guest (e.g. radix host and a legacy guest)
>       then the guest will crash but QEMU should probably terminate with a
>       descriptive message.
> 
> 
> Sam Bobroff (9):
>   spapr: fix off-by-one error in spapr_ovec_populate_dt()
>   Update headers using update-linux-headers.sh
>   spapr: Add ibm,processor-radix-AP-encodings to the device tree
>   target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3
>   spapr: Only setup HTP if necessary.
>   spapr: Add h_register_process_table() hypercall
>   spapr: Set ISA 3.00 radix and hash bits in OV5
>   spapr: Advertise ISA 3.0 MMU features in pa_features
>   spapr: Small cleanup of PPC MMU enums
> 
>  hw/ppc/spapr.c                                     | 152 +++++---
>  hw/ppc/spapr_hcall.c                               |  52 ++-
>  hw/ppc/spapr_ovec.c                                |   2 +-
>  include/hw/ppc/spapr.h                             |   4 +-
>  include/hw/ppc/spapr_ovec.h                        |   6 +
>  include/standard-headers/linux/input-event-codes.h |   2 +-
>  include/standard-headers/linux/pci_regs.h          |   8 +
>  include/standard-headers/linux/virtio_ids.h        |   1 +
>  linux-headers/asm-arm/kvm.h                        |   2 +
>  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
>  linux-headers/asm-powerpc/kvm.h                    |  25 ++
>  linux-headers/asm-powerpc/unistd.h                 |   1 +
>  linux-headers/asm-x86/kvm_para.h                   |   4 +-
>  linux-headers/linux/kvm.h                          |  11 +-
>  linux-headers/linux/vfio.h                         |  10 +
>  target/ppc/cpu-qom.h                               |  12 +-
>  target/ppc/cpu.h                                   |   5 +
>  target/ppc/kvm.c                                   |  66 +++-
>  target/ppc/kvm_ppc.h                               |  13 +
>  target/ppc/mmu-hash64.c                            |  10 +-
>  target/ppc/mmu_helper.c                            |  67 ++--
>  target/ppc/translate.c                             |  12 +-
>  22 files changed, 346 insertions(+), 538 deletions(-)
> 


-- 
Alexey

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

* Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall
  2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall Sam Bobroff
  2017-02-09  2:32   ` David Gibson
@ 2017-02-09  4:16   ` Alexey Kardashevskiy
  1 sibling, 0 replies; 30+ messages in thread
From: Alexey Kardashevskiy @ 2017-02-09  4:16 UTC (permalink / raw)
  To: Sam Bobroff, qemu-devel; +Cc: qemu-ppc, david

On 07/02/17 13:56, Sam Bobroff wrote:
> Both radix and hash modes require guests to use
> h_register_process_table() to set up the MMU. Implement it using the
> new KVM ioctl KVM_PPC_CONFIGURE_V3_MMU.
> 
> This hypercall is also necessary for fully emulated guests, so it will
> need to be reworked to integrate with Suraj's TCG patchset.
> ---
>  hw/ppc/spapr_hcall.c   | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/hw/ppc/spapr.h |  3 ++-
>  target/ppc/kvm.c       | 12 ++++++++++++
>  target/ppc/kvm_ppc.h   |  1 +
>  4 files changed, 63 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index c9bb6624c4..4de511c386 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -1049,6 +1049,50 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu_,
>      return H_SUCCESS;
>  }
>  
> +static target_ulong h_register_process_table(PowerPCCPU *cpu,
> +                                             sPAPRMachineState *spapr,
> +                                             target_ulong opcode,
> +                                             target_ulong *args)
> +{
> +    static target_ulong last_process_table;
> +    target_ulong flags = args[0];
> +    target_ulong proc_tbl = args[1];
> +    target_ulong page_size = args[2];
> +    target_ulong table_size = args[3];
> +    uint64_t cflags, cproc;
> +
> +    cflags = (flags & 4) ? KVM_PPC_MMUV3_RADIX : 0;
> +    cflags |= (flags & 1) ? KVM_PPC_MMUV3_GTSE : 0;
> +    cproc = (flags & 4) ? (1ul << 63) : 0;
> +    if (!(flags & 0x10)) {
> +        if ((last_process_table & (1ul << 63)) != cproc) {
> +            return H_PARAMETER;
> +        }
> +        cproc = last_process_table;
> +    } else if (!(flags & 0x8)) {
> +        ; /* do nothing */
> +    } else if (flags & 4) {
> +        /* radix */
> +        if (table_size > 24 || (proc_tbl & 0xfff) || (proc_tbl >> 60)) {
> +            return H_PARAMETER;
> +        }
> +        cproc |= proc_tbl | table_size;
> +    } else {
> +        /* hash, possibly with process table */
> +        if (table_size > 24 || (proc_tbl >> 38) || page_size > 7) {
> +            return H_PARAMETER;
> +        }
> +        cproc = (proc_tbl << 25) | (page_size << 5) | table_size;
> +    }
> +    last_process_table = cproc;
> +    fprintf(stderr, "calling config mmu flags=%lx proctbl=%lx\n",
> +            cflags, cproc);
> +    if  (!kvmppc_configure_v3_mmu(cpu, cflags, cproc)) {
> +        return H_HARDWARE;
> +    }
> +    return H_SUCCESS;
> +}
> +
>  static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
>  static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_HCALL_BASE + 1];
>  
> @@ -1136,6 +1180,10 @@ static void hypercall_register_types(void)
>  
>      /* ibm,client-architecture-support support */
>      spapr_register_hypercall(KVMPPC_H_CAS, h_client_architecture_support);
> +
> +    /* Power9 MMU support */
> +    spapr_register_hypercall(H_REGISTER_PROCESS_TABLE,
> +                             h_register_process_table);
>  }
>  
>  type_init(hypercall_register_types)
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index bd5bcf70de..92bda0f36d 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -347,7 +347,8 @@ struct sPAPRMachineState {
>  #define H_XIRR_X                0x2FC
>  #define H_RANDOM                0x300
>  #define H_SET_MODE              0x31C
> -#define MAX_HCALL_OPCODE        H_SET_MODE
> +#define H_REGISTER_PROCESS_TABLE 0x37C


It is H_REGISTER_PROC_TBL now:

https://git.kernel.org/cgit/virt/kvm/kvm.git/tree/arch/powerpc/include/asm/hvcall.h?h=linux-next#n279


> +#define MAX_HCALL_OPCODE        H_REGISTER_PROCESS_TABLE
>  
>  /* The hcalls above are standardized in PAPR and implemented by pHyp
>   * as well.
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 8d6fd1b067..0d1443616c 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -344,6 +344,18 @@ static bool kvm_get_rmmu_info(PowerPCCPU *cpu, struct kvm_ppc_rmmu_info *info)
>      return false;
>  }
>  
> +bool kvmppc_configure_v3_mmu(PowerPCCPU *cpu, uint64_t flags, uint64_t proc_tbl)
> +{
> +    CPUState *cs = CPU(cpu);
> +    int ret;
> +    struct kvm_ppc_mmuv3_cfg cfg;
> +
> +    cfg.flags = flags;
> +    cfg.process_table = proc_tbl;
> +    ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_CONFIGURE_V3_MMU, &cfg);
> +    return ret == 0;
> +}
> +
>  static long gethugepagesize(const char *mem_path)
>  {
>      struct statfs fs;
> diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
> index 1c1b94847c..0b8b77583a 100644
> --- a/target/ppc/kvm_ppc.h
> +++ b/target/ppc/kvm_ppc.h
> @@ -33,6 +33,7 @@ int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
>  int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
>  int kvmppc_set_tcr(PowerPCCPU *cpu);
>  int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
> +bool kvmppc_configure_v3_mmu(PowerPCCPU *cpu, uint64_t flags, uint64_t proctbl);
>  #ifndef CONFIG_USER_ONLY
>  off_t kvmppc_alloc_rma(void **rma);
>  bool kvmppc_spapr_use_multitce(void);
> 


-- 
Alexey

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

* Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH 2/9] Update headers using update-linux-headers.sh
  2017-02-07 12:59   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
@ 2017-02-09  4:53     ` Sam Bobroff
  2017-02-09  7:45       ` Thomas Huth
  0 siblings, 1 reply; 30+ messages in thread
From: Sam Bobroff @ 2017-02-09  4:53 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-devel, qemu-ppc, david, qemu-arm

On Tue, Feb 07, 2017 at 01:59:52PM +0100, Thomas Huth wrote:
> On 07.02.2017 03:56, Sam Bobroff wrote:
> > This provides some new definitions needed by ISA 3.00 guests.
> > 
> > It is a large change because this is the first import since
> > some kernel header files have become autogenerated.
> > 
> > Note: update-linux-headers.sh currently generates a change that
> > (incorrectly) removes virtio_mmio.h and the change has been manually
> > adjusted to prevent that.
> > 
> > Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> > ---
> >  include/standard-headers/linux/input-event-codes.h |   2 +-
> >  include/standard-headers/linux/pci_regs.h          |   8 +
> >  include/standard-headers/linux/virtio_ids.h        |   1 +
> >  linux-headers/asm-arm/kvm.h                        |   2 +
> >  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
> >  linux-headers/asm-powerpc/kvm.h                    |  25 ++
> >  linux-headers/asm-powerpc/unistd.h                 |   1 +
> >  linux-headers/asm-x86/kvm_para.h                   |   4 +-
> >  linux-headers/linux/kvm.h                          |  11 +-
> >  linux-headers/linux/vfio.h                         |  10 +
> >  10 files changed, 63 insertions(+), 420 deletions(-)
> [...]
> > diff --git a/linux-headers/asm-arm/unistd.h b/linux-headers/asm-arm/unistd.h
> > index ceb5450c81..155571b874 100644
> > --- a/linux-headers/asm-arm/unistd.h
> > +++ b/linux-headers/asm-arm/unistd.h
> > @@ -17,409 +17,14 @@
> >  
> >  #if defined(__thumb__) || defined(__ARM_EABI__)
> >  #define __NR_SYSCALL_BASE	0
> > +#include <asm/unistd-eabi.h>
> >  #else
> >  #define __NR_SYSCALL_BASE	__NR_OABI_SYSCALL_BASE
> > +#include <asm/unistd-oabi.h>
> >  #endif
> >  
> > -/*
> > - * This file contains the system call numbers.
> > - */
> [...]
> 
> Looks like the contents of asm-arm/unistd.h has been moved to two new
> files, unistd-eabi.h and unistd-oabi.h, but they are not part of your
> patch. I guess update-linux-headers.sh needs a fix for that?
> 
>  Thomas

Ah thanks! I'll look at it.

Should I try to fix the other problem with update-linux-headers.sh at
the same time? (I'm referring to the issue I noted in the commit
message, about virtio_mmio.h)

Cheers,
Sam.

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

* Re: [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh
  2017-02-09  1:55   ` [Qemu-devel] " David Gibson
@ 2017-02-09  4:54     ` Sam Bobroff
  0 siblings, 0 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-09  4:54 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-devel, qemu-ppc

On Thu, Feb 09, 2017 at 12:55:49PM +1100, David Gibson wrote:
> On Tue, Feb 07, 2017 at 01:56:45PM +1100, Sam Bobroff wrote:
> > This provides some new definitions needed by ISA 3.00 guests.
> > 
> > It is a large change because this is the first import since
> > some kernel header files have become autogenerated.
> > 
> > Note: update-linux-headers.sh currently generates a change that
> > (incorrectly) removes virtio_mmio.h and the change has been manually
> > adjusted to prevent that.
> > 
> > Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> 
> It's no great problem for this RFC series, but in general please
> include the SHA of the kernel commit you're updating to, and, if it's
> not in Linus's tree yet, a link to a repo containing the kernel
> version in question.

OK. I'll include it in the next version of this set too.

> > ---
> >  include/standard-headers/linux/input-event-codes.h |   2 +-
> >  include/standard-headers/linux/pci_regs.h          |   8 +
> >  include/standard-headers/linux/virtio_ids.h        |   1 +
> >  linux-headers/asm-arm/kvm.h                        |   2 +
> >  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
> >  linux-headers/asm-powerpc/kvm.h                    |  25 ++
> >  linux-headers/asm-powerpc/unistd.h                 |   1 +
> >  linux-headers/asm-x86/kvm_para.h                   |   4 +-
> >  linux-headers/linux/kvm.h                          |  11 +-
> >  linux-headers/linux/vfio.h                         |  10 +
> >  10 files changed, 63 insertions(+), 420 deletions(-)
> > 
> > diff --git a/include/standard-headers/linux/input-event-codes.h b/include/standard-headers/linux/input-event-codes.h
> > index 5c10f7e25d..c8b3338375 100644
> > --- a/include/standard-headers/linux/input-event-codes.h
> > +++ b/include/standard-headers/linux/input-event-codes.h
> > @@ -640,7 +640,7 @@
> >   * Control a data application associated with the currently viewed channel,
> >   * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.)
> >   */
> > -#define KEY_DATA			0x275
> > +#define KEY_DATA			0x277
> >  
> >  #define BTN_TRIGGER_HAPPY		0x2c0
> >  #define BTN_TRIGGER_HAPPY1		0x2c0
> > diff --git a/include/standard-headers/linux/pci_regs.h b/include/standard-headers/linux/pci_regs.h
> > index e5a2e68b22..174d114708 100644
> > --- a/include/standard-headers/linux/pci_regs.h
> > +++ b/include/standard-headers/linux/pci_regs.h
> > @@ -23,6 +23,14 @@
> >  #define LINUX_PCI_REGS_H
> >  
> >  /*
> > + * Conventional PCI and PCI-X Mode 1 devices have 256 bytes of
> > + * configuration space.  PCI-X Mode 2 and PCIe devices have 4096 bytes of
> > + * configuration space.
> > + */
> > +#define PCI_CFG_SPACE_SIZE	256
> > +#define PCI_CFG_SPACE_EXP_SIZE	4096
> > +
> > +/*
> >   * Under PCI, each device has 256 bytes of configuration address space,
> >   * of which the first 64 bytes are standardized as follows:
> >   */
> > diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h
> > index fe74e422d4..6d5c3b2d4f 100644
> > --- a/include/standard-headers/linux/virtio_ids.h
> > +++ b/include/standard-headers/linux/virtio_ids.h
> > @@ -43,4 +43,5 @@
> >  #define VIRTIO_ID_INPUT        18 /* virtio input */
> >  #define VIRTIO_ID_VSOCK        19 /* virtio vsock transport */
> >  #define VIRTIO_ID_CRYPTO       20 /* virtio crypto */
> > +
> >  #endif /* _LINUX_VIRTIO_IDS_H */
> > diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h
> > index 2fb7859465..09a555cc83 100644
> > --- a/linux-headers/asm-arm/kvm.h
> > +++ b/linux-headers/asm-arm/kvm.h
> > @@ -87,9 +87,11 @@ struct kvm_regs {
> >  /* Supported VGICv3 address types  */
> >  #define KVM_VGIC_V3_ADDR_TYPE_DIST	2
> >  #define KVM_VGIC_V3_ADDR_TYPE_REDIST	3
> > +#define KVM_VGIC_ITS_ADDR_TYPE		4
> >  
> >  #define KVM_VGIC_V3_DIST_SIZE		SZ_64K
> >  #define KVM_VGIC_V3_REDIST_SIZE		(2 * SZ_64K)
> > +#define KVM_VGIC_V3_ITS_SIZE		(2 * SZ_64K)
> >  
> >  #define KVM_ARM_VCPU_POWER_OFF		0 /* CPU is started in OFF state */
> >  #define KVM_ARM_VCPU_PSCI_0_2		1 /* CPU uses PSCI v0.2 */
> > diff --git a/linux-headers/asm-arm/unistd.h b/linux-headers/asm-arm/unistd.h
> > index ceb5450c81..155571b874 100644
> > --- a/linux-headers/asm-arm/unistd.h
> > +++ b/linux-headers/asm-arm/unistd.h
> > @@ -17,409 +17,14 @@
> >  
> >  #if defined(__thumb__) || defined(__ARM_EABI__)
> >  #define __NR_SYSCALL_BASE	0
> > +#include <asm/unistd-eabi.h>
> >  #else
> >  #define __NR_SYSCALL_BASE	__NR_OABI_SYSCALL_BASE
> > +#include <asm/unistd-oabi.h>
> >  #endif
> >  
> > -/*
> > - * This file contains the system call numbers.
> > - */
> > -
> > -#define __NR_restart_syscall		(__NR_SYSCALL_BASE+  0)
> > -#define __NR_exit			(__NR_SYSCALL_BASE+  1)
> > -#define __NR_fork			(__NR_SYSCALL_BASE+  2)
> > -#define __NR_read			(__NR_SYSCALL_BASE+  3)
> > -#define __NR_write			(__NR_SYSCALL_BASE+  4)
> > -#define __NR_open			(__NR_SYSCALL_BASE+  5)
> > -#define __NR_close			(__NR_SYSCALL_BASE+  6)
> > -					/* 7 was sys_waitpid */
> > -#define __NR_creat			(__NR_SYSCALL_BASE+  8)
> > -#define __NR_link			(__NR_SYSCALL_BASE+  9)
> > -#define __NR_unlink			(__NR_SYSCALL_BASE+ 10)
> > -#define __NR_execve			(__NR_SYSCALL_BASE+ 11)
> > -#define __NR_chdir			(__NR_SYSCALL_BASE+ 12)
> > -#define __NR_time			(__NR_SYSCALL_BASE+ 13)
> > -#define __NR_mknod			(__NR_SYSCALL_BASE+ 14)
> > -#define __NR_chmod			(__NR_SYSCALL_BASE+ 15)
> > -#define __NR_lchown			(__NR_SYSCALL_BASE+ 16)
> > -					/* 17 was sys_break */
> > -					/* 18 was sys_stat */
> > -#define __NR_lseek			(__NR_SYSCALL_BASE+ 19)
> > -#define __NR_getpid			(__NR_SYSCALL_BASE+ 20)
> > -#define __NR_mount			(__NR_SYSCALL_BASE+ 21)
> > -#define __NR_umount			(__NR_SYSCALL_BASE+ 22)
> > -#define __NR_setuid			(__NR_SYSCALL_BASE+ 23)
> > -#define __NR_getuid			(__NR_SYSCALL_BASE+ 24)
> > -#define __NR_stime			(__NR_SYSCALL_BASE+ 25)
> > -#define __NR_ptrace			(__NR_SYSCALL_BASE+ 26)
> > -#define __NR_alarm			(__NR_SYSCALL_BASE+ 27)
> > -					/* 28 was sys_fstat */
> > -#define __NR_pause			(__NR_SYSCALL_BASE+ 29)
> > -#define __NR_utime			(__NR_SYSCALL_BASE+ 30)
> > -					/* 31 was sys_stty */
> > -					/* 32 was sys_gtty */
> > -#define __NR_access			(__NR_SYSCALL_BASE+ 33)
> > -#define __NR_nice			(__NR_SYSCALL_BASE+ 34)
> > -					/* 35 was sys_ftime */
> > -#define __NR_sync			(__NR_SYSCALL_BASE+ 36)
> > -#define __NR_kill			(__NR_SYSCALL_BASE+ 37)
> > -#define __NR_rename			(__NR_SYSCALL_BASE+ 38)
> > -#define __NR_mkdir			(__NR_SYSCALL_BASE+ 39)
> > -#define __NR_rmdir			(__NR_SYSCALL_BASE+ 40)
> > -#define __NR_dup			(__NR_SYSCALL_BASE+ 41)
> > -#define __NR_pipe			(__NR_SYSCALL_BASE+ 42)
> > -#define __NR_times			(__NR_SYSCALL_BASE+ 43)
> > -					/* 44 was sys_prof */
> > -#define __NR_brk			(__NR_SYSCALL_BASE+ 45)
> > -#define __NR_setgid			(__NR_SYSCALL_BASE+ 46)
> > -#define __NR_getgid			(__NR_SYSCALL_BASE+ 47)
> > -					/* 48 was sys_signal */
> > -#define __NR_geteuid			(__NR_SYSCALL_BASE+ 49)
> > -#define __NR_getegid			(__NR_SYSCALL_BASE+ 50)
> > -#define __NR_acct			(__NR_SYSCALL_BASE+ 51)
> > -#define __NR_umount2			(__NR_SYSCALL_BASE+ 52)
> > -					/* 53 was sys_lock */
> > -#define __NR_ioctl			(__NR_SYSCALL_BASE+ 54)
> > -#define __NR_fcntl			(__NR_SYSCALL_BASE+ 55)
> > -					/* 56 was sys_mpx */
> > -#define __NR_setpgid			(__NR_SYSCALL_BASE+ 57)
> > -					/* 58 was sys_ulimit */
> > -					/* 59 was sys_olduname */
> > -#define __NR_umask			(__NR_SYSCALL_BASE+ 60)
> > -#define __NR_chroot			(__NR_SYSCALL_BASE+ 61)
> > -#define __NR_ustat			(__NR_SYSCALL_BASE+ 62)
> > -#define __NR_dup2			(__NR_SYSCALL_BASE+ 63)
> > -#define __NR_getppid			(__NR_SYSCALL_BASE+ 64)
> > -#define __NR_getpgrp			(__NR_SYSCALL_BASE+ 65)
> > -#define __NR_setsid			(__NR_SYSCALL_BASE+ 66)
> > -#define __NR_sigaction			(__NR_SYSCALL_BASE+ 67)
> > -					/* 68 was sys_sgetmask */
> > -					/* 69 was sys_ssetmask */
> > -#define __NR_setreuid			(__NR_SYSCALL_BASE+ 70)
> > -#define __NR_setregid			(__NR_SYSCALL_BASE+ 71)
> > -#define __NR_sigsuspend			(__NR_SYSCALL_BASE+ 72)
> > -#define __NR_sigpending			(__NR_SYSCALL_BASE+ 73)
> > -#define __NR_sethostname		(__NR_SYSCALL_BASE+ 74)
> > -#define __NR_setrlimit			(__NR_SYSCALL_BASE+ 75)
> > -#define __NR_getrlimit			(__NR_SYSCALL_BASE+ 76)	/* Back compat 2GB limited rlimit */
> > -#define __NR_getrusage			(__NR_SYSCALL_BASE+ 77)
> > -#define __NR_gettimeofday		(__NR_SYSCALL_BASE+ 78)
> > -#define __NR_settimeofday		(__NR_SYSCALL_BASE+ 79)
> > -#define __NR_getgroups			(__NR_SYSCALL_BASE+ 80)
> > -#define __NR_setgroups			(__NR_SYSCALL_BASE+ 81)
> > -#define __NR_select			(__NR_SYSCALL_BASE+ 82)
> > -#define __NR_symlink			(__NR_SYSCALL_BASE+ 83)
> > -					/* 84 was sys_lstat */
> > -#define __NR_readlink			(__NR_SYSCALL_BASE+ 85)
> > -#define __NR_uselib			(__NR_SYSCALL_BASE+ 86)
> > -#define __NR_swapon			(__NR_SYSCALL_BASE+ 87)
> > -#define __NR_reboot			(__NR_SYSCALL_BASE+ 88)
> > -#define __NR_readdir			(__NR_SYSCALL_BASE+ 89)
> > -#define __NR_mmap			(__NR_SYSCALL_BASE+ 90)
> > -#define __NR_munmap			(__NR_SYSCALL_BASE+ 91)
> > -#define __NR_truncate			(__NR_SYSCALL_BASE+ 92)
> > -#define __NR_ftruncate			(__NR_SYSCALL_BASE+ 93)
> > -#define __NR_fchmod			(__NR_SYSCALL_BASE+ 94)
> > -#define __NR_fchown			(__NR_SYSCALL_BASE+ 95)
> > -#define __NR_getpriority		(__NR_SYSCALL_BASE+ 96)
> > -#define __NR_setpriority		(__NR_SYSCALL_BASE+ 97)
> > -					/* 98 was sys_profil */
> > -#define __NR_statfs			(__NR_SYSCALL_BASE+ 99)
> > -#define __NR_fstatfs			(__NR_SYSCALL_BASE+100)
> > -					/* 101 was sys_ioperm */
> > -#define __NR_socketcall			(__NR_SYSCALL_BASE+102)
> > -#define __NR_syslog			(__NR_SYSCALL_BASE+103)
> > -#define __NR_setitimer			(__NR_SYSCALL_BASE+104)
> > -#define __NR_getitimer			(__NR_SYSCALL_BASE+105)
> > -#define __NR_stat			(__NR_SYSCALL_BASE+106)
> > -#define __NR_lstat			(__NR_SYSCALL_BASE+107)
> > -#define __NR_fstat			(__NR_SYSCALL_BASE+108)
> > -					/* 109 was sys_uname */
> > -					/* 110 was sys_iopl */
> > -#define __NR_vhangup			(__NR_SYSCALL_BASE+111)
> > -					/* 112 was sys_idle */
> > -#define __NR_syscall			(__NR_SYSCALL_BASE+113) /* syscall to call a syscall! */
> > -#define __NR_wait4			(__NR_SYSCALL_BASE+114)
> > -#define __NR_swapoff			(__NR_SYSCALL_BASE+115)
> > -#define __NR_sysinfo			(__NR_SYSCALL_BASE+116)
> > -#define __NR_ipc			(__NR_SYSCALL_BASE+117)
> > -#define __NR_fsync			(__NR_SYSCALL_BASE+118)
> > -#define __NR_sigreturn			(__NR_SYSCALL_BASE+119)
> > -#define __NR_clone			(__NR_SYSCALL_BASE+120)
> > -#define __NR_setdomainname		(__NR_SYSCALL_BASE+121)
> > -#define __NR_uname			(__NR_SYSCALL_BASE+122)
> > -					/* 123 was sys_modify_ldt */
> > -#define __NR_adjtimex			(__NR_SYSCALL_BASE+124)
> > -#define __NR_mprotect			(__NR_SYSCALL_BASE+125)
> > -#define __NR_sigprocmask		(__NR_SYSCALL_BASE+126)
> > -					/* 127 was sys_create_module */
> > -#define __NR_init_module		(__NR_SYSCALL_BASE+128)
> > -#define __NR_delete_module		(__NR_SYSCALL_BASE+129)
> > -					/* 130 was sys_get_kernel_syms */
> > -#define __NR_quotactl			(__NR_SYSCALL_BASE+131)
> > -#define __NR_getpgid			(__NR_SYSCALL_BASE+132)
> > -#define __NR_fchdir			(__NR_SYSCALL_BASE+133)
> > -#define __NR_bdflush			(__NR_SYSCALL_BASE+134)
> > -#define __NR_sysfs			(__NR_SYSCALL_BASE+135)
> > -#define __NR_personality		(__NR_SYSCALL_BASE+136)
> > -					/* 137 was sys_afs_syscall */
> > -#define __NR_setfsuid			(__NR_SYSCALL_BASE+138)
> > -#define __NR_setfsgid			(__NR_SYSCALL_BASE+139)
> > -#define __NR__llseek			(__NR_SYSCALL_BASE+140)
> > -#define __NR_getdents			(__NR_SYSCALL_BASE+141)
> > -#define __NR__newselect			(__NR_SYSCALL_BASE+142)
> > -#define __NR_flock			(__NR_SYSCALL_BASE+143)
> > -#define __NR_msync			(__NR_SYSCALL_BASE+144)
> > -#define __NR_readv			(__NR_SYSCALL_BASE+145)
> > -#define __NR_writev			(__NR_SYSCALL_BASE+146)
> > -#define __NR_getsid			(__NR_SYSCALL_BASE+147)
> > -#define __NR_fdatasync			(__NR_SYSCALL_BASE+148)
> > -#define __NR__sysctl			(__NR_SYSCALL_BASE+149)
> > -#define __NR_mlock			(__NR_SYSCALL_BASE+150)
> > -#define __NR_munlock			(__NR_SYSCALL_BASE+151)
> > -#define __NR_mlockall			(__NR_SYSCALL_BASE+152)
> > -#define __NR_munlockall			(__NR_SYSCALL_BASE+153)
> > -#define __NR_sched_setparam		(__NR_SYSCALL_BASE+154)
> > -#define __NR_sched_getparam		(__NR_SYSCALL_BASE+155)
> > -#define __NR_sched_setscheduler		(__NR_SYSCALL_BASE+156)
> > -#define __NR_sched_getscheduler		(__NR_SYSCALL_BASE+157)
> > -#define __NR_sched_yield		(__NR_SYSCALL_BASE+158)
> > -#define __NR_sched_get_priority_max	(__NR_SYSCALL_BASE+159)
> > -#define __NR_sched_get_priority_min	(__NR_SYSCALL_BASE+160)
> > -#define __NR_sched_rr_get_interval	(__NR_SYSCALL_BASE+161)
> > -#define __NR_nanosleep			(__NR_SYSCALL_BASE+162)
> > -#define __NR_mremap			(__NR_SYSCALL_BASE+163)
> > -#define __NR_setresuid			(__NR_SYSCALL_BASE+164)
> > -#define __NR_getresuid			(__NR_SYSCALL_BASE+165)
> > -					/* 166 was sys_vm86 */
> > -					/* 167 was sys_query_module */
> > -#define __NR_poll			(__NR_SYSCALL_BASE+168)
> > -#define __NR_nfsservctl			(__NR_SYSCALL_BASE+169)
> > -#define __NR_setresgid			(__NR_SYSCALL_BASE+170)
> > -#define __NR_getresgid			(__NR_SYSCALL_BASE+171)
> > -#define __NR_prctl			(__NR_SYSCALL_BASE+172)
> > -#define __NR_rt_sigreturn		(__NR_SYSCALL_BASE+173)
> > -#define __NR_rt_sigaction		(__NR_SYSCALL_BASE+174)
> > -#define __NR_rt_sigprocmask		(__NR_SYSCALL_BASE+175)
> > -#define __NR_rt_sigpending		(__NR_SYSCALL_BASE+176)
> > -#define __NR_rt_sigtimedwait		(__NR_SYSCALL_BASE+177)
> > -#define __NR_rt_sigqueueinfo		(__NR_SYSCALL_BASE+178)
> > -#define __NR_rt_sigsuspend		(__NR_SYSCALL_BASE+179)
> > -#define __NR_pread64			(__NR_SYSCALL_BASE+180)
> > -#define __NR_pwrite64			(__NR_SYSCALL_BASE+181)
> > -#define __NR_chown			(__NR_SYSCALL_BASE+182)
> > -#define __NR_getcwd			(__NR_SYSCALL_BASE+183)
> > -#define __NR_capget			(__NR_SYSCALL_BASE+184)
> > -#define __NR_capset			(__NR_SYSCALL_BASE+185)
> > -#define __NR_sigaltstack		(__NR_SYSCALL_BASE+186)
> > -#define __NR_sendfile			(__NR_SYSCALL_BASE+187)
> > -					/* 188 reserved */
> > -					/* 189 reserved */
> > -#define __NR_vfork			(__NR_SYSCALL_BASE+190)
> > -#define __NR_ugetrlimit			(__NR_SYSCALL_BASE+191)	/* SuS compliant getrlimit */
> > -#define __NR_mmap2			(__NR_SYSCALL_BASE+192)
> > -#define __NR_truncate64			(__NR_SYSCALL_BASE+193)
> > -#define __NR_ftruncate64		(__NR_SYSCALL_BASE+194)
> > -#define __NR_stat64			(__NR_SYSCALL_BASE+195)
> > -#define __NR_lstat64			(__NR_SYSCALL_BASE+196)
> > -#define __NR_fstat64			(__NR_SYSCALL_BASE+197)
> > -#define __NR_lchown32			(__NR_SYSCALL_BASE+198)
> > -#define __NR_getuid32			(__NR_SYSCALL_BASE+199)
> > -#define __NR_getgid32			(__NR_SYSCALL_BASE+200)
> > -#define __NR_geteuid32			(__NR_SYSCALL_BASE+201)
> > -#define __NR_getegid32			(__NR_SYSCALL_BASE+202)
> > -#define __NR_setreuid32			(__NR_SYSCALL_BASE+203)
> > -#define __NR_setregid32			(__NR_SYSCALL_BASE+204)
> > -#define __NR_getgroups32		(__NR_SYSCALL_BASE+205)
> > -#define __NR_setgroups32		(__NR_SYSCALL_BASE+206)
> > -#define __NR_fchown32			(__NR_SYSCALL_BASE+207)
> > -#define __NR_setresuid32		(__NR_SYSCALL_BASE+208)
> > -#define __NR_getresuid32		(__NR_SYSCALL_BASE+209)
> > -#define __NR_setresgid32		(__NR_SYSCALL_BASE+210)
> > -#define __NR_getresgid32		(__NR_SYSCALL_BASE+211)
> > -#define __NR_chown32			(__NR_SYSCALL_BASE+212)
> > -#define __NR_setuid32			(__NR_SYSCALL_BASE+213)
> > -#define __NR_setgid32			(__NR_SYSCALL_BASE+214)
> > -#define __NR_setfsuid32			(__NR_SYSCALL_BASE+215)
> > -#define __NR_setfsgid32			(__NR_SYSCALL_BASE+216)
> > -#define __NR_getdents64			(__NR_SYSCALL_BASE+217)
> > -#define __NR_pivot_root			(__NR_SYSCALL_BASE+218)
> > -#define __NR_mincore			(__NR_SYSCALL_BASE+219)
> > -#define __NR_madvise			(__NR_SYSCALL_BASE+220)
> > -#define __NR_fcntl64			(__NR_SYSCALL_BASE+221)
> > -					/* 222 for tux */
> > -					/* 223 is unused */
> > -#define __NR_gettid			(__NR_SYSCALL_BASE+224)
> > -#define __NR_readahead			(__NR_SYSCALL_BASE+225)
> > -#define __NR_setxattr			(__NR_SYSCALL_BASE+226)
> > -#define __NR_lsetxattr			(__NR_SYSCALL_BASE+227)
> > -#define __NR_fsetxattr			(__NR_SYSCALL_BASE+228)
> > -#define __NR_getxattr			(__NR_SYSCALL_BASE+229)
> > -#define __NR_lgetxattr			(__NR_SYSCALL_BASE+230)
> > -#define __NR_fgetxattr			(__NR_SYSCALL_BASE+231)
> > -#define __NR_listxattr			(__NR_SYSCALL_BASE+232)
> > -#define __NR_llistxattr			(__NR_SYSCALL_BASE+233)
> > -#define __NR_flistxattr			(__NR_SYSCALL_BASE+234)
> > -#define __NR_removexattr		(__NR_SYSCALL_BASE+235)
> > -#define __NR_lremovexattr		(__NR_SYSCALL_BASE+236)
> > -#define __NR_fremovexattr		(__NR_SYSCALL_BASE+237)
> > -#define __NR_tkill			(__NR_SYSCALL_BASE+238)
> > -#define __NR_sendfile64			(__NR_SYSCALL_BASE+239)
> > -#define __NR_futex			(__NR_SYSCALL_BASE+240)
> > -#define __NR_sched_setaffinity		(__NR_SYSCALL_BASE+241)
> > -#define __NR_sched_getaffinity		(__NR_SYSCALL_BASE+242)
> > -#define __NR_io_setup			(__NR_SYSCALL_BASE+243)
> > -#define __NR_io_destroy			(__NR_SYSCALL_BASE+244)
> > -#define __NR_io_getevents		(__NR_SYSCALL_BASE+245)
> > -#define __NR_io_submit			(__NR_SYSCALL_BASE+246)
> > -#define __NR_io_cancel			(__NR_SYSCALL_BASE+247)
> > -#define __NR_exit_group			(__NR_SYSCALL_BASE+248)
> > -#define __NR_lookup_dcookie		(__NR_SYSCALL_BASE+249)
> > -#define __NR_epoll_create		(__NR_SYSCALL_BASE+250)
> > -#define __NR_epoll_ctl			(__NR_SYSCALL_BASE+251)
> > -#define __NR_epoll_wait			(__NR_SYSCALL_BASE+252)
> > -#define __NR_remap_file_pages		(__NR_SYSCALL_BASE+253)
> > -					/* 254 for set_thread_area */
> > -					/* 255 for get_thread_area */
> > -#define __NR_set_tid_address		(__NR_SYSCALL_BASE+256)
> > -#define __NR_timer_create		(__NR_SYSCALL_BASE+257)
> > -#define __NR_timer_settime		(__NR_SYSCALL_BASE+258)
> > -#define __NR_timer_gettime		(__NR_SYSCALL_BASE+259)
> > -#define __NR_timer_getoverrun		(__NR_SYSCALL_BASE+260)
> > -#define __NR_timer_delete		(__NR_SYSCALL_BASE+261)
> > -#define __NR_clock_settime		(__NR_SYSCALL_BASE+262)
> > -#define __NR_clock_gettime		(__NR_SYSCALL_BASE+263)
> > -#define __NR_clock_getres		(__NR_SYSCALL_BASE+264)
> > -#define __NR_clock_nanosleep		(__NR_SYSCALL_BASE+265)
> > -#define __NR_statfs64			(__NR_SYSCALL_BASE+266)
> > -#define __NR_fstatfs64			(__NR_SYSCALL_BASE+267)
> > -#define __NR_tgkill			(__NR_SYSCALL_BASE+268)
> > -#define __NR_utimes			(__NR_SYSCALL_BASE+269)
> > -#define __NR_arm_fadvise64_64		(__NR_SYSCALL_BASE+270)
> > -#define __NR_pciconfig_iobase		(__NR_SYSCALL_BASE+271)
> > -#define __NR_pciconfig_read		(__NR_SYSCALL_BASE+272)
> > -#define __NR_pciconfig_write		(__NR_SYSCALL_BASE+273)
> > -#define __NR_mq_open			(__NR_SYSCALL_BASE+274)
> > -#define __NR_mq_unlink			(__NR_SYSCALL_BASE+275)
> > -#define __NR_mq_timedsend		(__NR_SYSCALL_BASE+276)
> > -#define __NR_mq_timedreceive		(__NR_SYSCALL_BASE+277)
> > -#define __NR_mq_notify			(__NR_SYSCALL_BASE+278)
> > -#define __NR_mq_getsetattr		(__NR_SYSCALL_BASE+279)
> > -#define __NR_waitid			(__NR_SYSCALL_BASE+280)
> > -#define __NR_socket			(__NR_SYSCALL_BASE+281)
> > -#define __NR_bind			(__NR_SYSCALL_BASE+282)
> > -#define __NR_connect			(__NR_SYSCALL_BASE+283)
> > -#define __NR_listen			(__NR_SYSCALL_BASE+284)
> > -#define __NR_accept			(__NR_SYSCALL_BASE+285)
> > -#define __NR_getsockname		(__NR_SYSCALL_BASE+286)
> > -#define __NR_getpeername		(__NR_SYSCALL_BASE+287)
> > -#define __NR_socketpair			(__NR_SYSCALL_BASE+288)
> > -#define __NR_send			(__NR_SYSCALL_BASE+289)
> > -#define __NR_sendto			(__NR_SYSCALL_BASE+290)
> > -#define __NR_recv			(__NR_SYSCALL_BASE+291)
> > -#define __NR_recvfrom			(__NR_SYSCALL_BASE+292)
> > -#define __NR_shutdown			(__NR_SYSCALL_BASE+293)
> > -#define __NR_setsockopt			(__NR_SYSCALL_BASE+294)
> > -#define __NR_getsockopt			(__NR_SYSCALL_BASE+295)
> > -#define __NR_sendmsg			(__NR_SYSCALL_BASE+296)
> > -#define __NR_recvmsg			(__NR_SYSCALL_BASE+297)
> > -#define __NR_semop			(__NR_SYSCALL_BASE+298)
> > -#define __NR_semget			(__NR_SYSCALL_BASE+299)
> > -#define __NR_semctl			(__NR_SYSCALL_BASE+300)
> > -#define __NR_msgsnd			(__NR_SYSCALL_BASE+301)
> > -#define __NR_msgrcv			(__NR_SYSCALL_BASE+302)
> > -#define __NR_msgget			(__NR_SYSCALL_BASE+303)
> > -#define __NR_msgctl			(__NR_SYSCALL_BASE+304)
> > -#define __NR_shmat			(__NR_SYSCALL_BASE+305)
> > -#define __NR_shmdt			(__NR_SYSCALL_BASE+306)
> > -#define __NR_shmget			(__NR_SYSCALL_BASE+307)
> > -#define __NR_shmctl			(__NR_SYSCALL_BASE+308)
> > -#define __NR_add_key			(__NR_SYSCALL_BASE+309)
> > -#define __NR_request_key		(__NR_SYSCALL_BASE+310)
> > -#define __NR_keyctl			(__NR_SYSCALL_BASE+311)
> > -#define __NR_semtimedop			(__NR_SYSCALL_BASE+312)
> > -#define __NR_vserver			(__NR_SYSCALL_BASE+313)
> > -#define __NR_ioprio_set			(__NR_SYSCALL_BASE+314)
> > -#define __NR_ioprio_get			(__NR_SYSCALL_BASE+315)
> > -#define __NR_inotify_init		(__NR_SYSCALL_BASE+316)
> > -#define __NR_inotify_add_watch		(__NR_SYSCALL_BASE+317)
> > -#define __NR_inotify_rm_watch		(__NR_SYSCALL_BASE+318)
> > -#define __NR_mbind			(__NR_SYSCALL_BASE+319)
> > -#define __NR_get_mempolicy		(__NR_SYSCALL_BASE+320)
> > -#define __NR_set_mempolicy		(__NR_SYSCALL_BASE+321)
> > -#define __NR_openat			(__NR_SYSCALL_BASE+322)
> > -#define __NR_mkdirat			(__NR_SYSCALL_BASE+323)
> > -#define __NR_mknodat			(__NR_SYSCALL_BASE+324)
> > -#define __NR_fchownat			(__NR_SYSCALL_BASE+325)
> > -#define __NR_futimesat			(__NR_SYSCALL_BASE+326)
> > -#define __NR_fstatat64			(__NR_SYSCALL_BASE+327)
> > -#define __NR_unlinkat			(__NR_SYSCALL_BASE+328)
> > -#define __NR_renameat			(__NR_SYSCALL_BASE+329)
> > -#define __NR_linkat			(__NR_SYSCALL_BASE+330)
> > -#define __NR_symlinkat			(__NR_SYSCALL_BASE+331)
> > -#define __NR_readlinkat			(__NR_SYSCALL_BASE+332)
> > -#define __NR_fchmodat			(__NR_SYSCALL_BASE+333)
> > -#define __NR_faccessat			(__NR_SYSCALL_BASE+334)
> > -#define __NR_pselect6			(__NR_SYSCALL_BASE+335)
> > -#define __NR_ppoll			(__NR_SYSCALL_BASE+336)
> > -#define __NR_unshare			(__NR_SYSCALL_BASE+337)
> > -#define __NR_set_robust_list		(__NR_SYSCALL_BASE+338)
> > -#define __NR_get_robust_list		(__NR_SYSCALL_BASE+339)
> > -#define __NR_splice			(__NR_SYSCALL_BASE+340)
> > -#define __NR_arm_sync_file_range	(__NR_SYSCALL_BASE+341)
> > +#include <asm/unistd-common.h>
> >  #define __NR_sync_file_range2		__NR_arm_sync_file_range
> > -#define __NR_tee			(__NR_SYSCALL_BASE+342)
> > -#define __NR_vmsplice			(__NR_SYSCALL_BASE+343)
> > -#define __NR_move_pages			(__NR_SYSCALL_BASE+344)
> > -#define __NR_getcpu			(__NR_SYSCALL_BASE+345)
> > -#define __NR_epoll_pwait		(__NR_SYSCALL_BASE+346)
> > -#define __NR_kexec_load			(__NR_SYSCALL_BASE+347)
> > -#define __NR_utimensat			(__NR_SYSCALL_BASE+348)
> > -#define __NR_signalfd			(__NR_SYSCALL_BASE+349)
> > -#define __NR_timerfd_create		(__NR_SYSCALL_BASE+350)
> > -#define __NR_eventfd			(__NR_SYSCALL_BASE+351)
> > -#define __NR_fallocate			(__NR_SYSCALL_BASE+352)
> > -#define __NR_timerfd_settime		(__NR_SYSCALL_BASE+353)
> > -#define __NR_timerfd_gettime		(__NR_SYSCALL_BASE+354)
> > -#define __NR_signalfd4			(__NR_SYSCALL_BASE+355)
> > -#define __NR_eventfd2			(__NR_SYSCALL_BASE+356)
> > -#define __NR_epoll_create1		(__NR_SYSCALL_BASE+357)
> > -#define __NR_dup3			(__NR_SYSCALL_BASE+358)
> > -#define __NR_pipe2			(__NR_SYSCALL_BASE+359)
> > -#define __NR_inotify_init1		(__NR_SYSCALL_BASE+360)
> > -#define __NR_preadv			(__NR_SYSCALL_BASE+361)
> > -#define __NR_pwritev			(__NR_SYSCALL_BASE+362)
> > -#define __NR_rt_tgsigqueueinfo		(__NR_SYSCALL_BASE+363)
> > -#define __NR_perf_event_open		(__NR_SYSCALL_BASE+364)
> > -#define __NR_recvmmsg			(__NR_SYSCALL_BASE+365)
> > -#define __NR_accept4			(__NR_SYSCALL_BASE+366)
> > -#define __NR_fanotify_init		(__NR_SYSCALL_BASE+367)
> > -#define __NR_fanotify_mark		(__NR_SYSCALL_BASE+368)
> > -#define __NR_prlimit64			(__NR_SYSCALL_BASE+369)
> > -#define __NR_name_to_handle_at		(__NR_SYSCALL_BASE+370)
> > -#define __NR_open_by_handle_at		(__NR_SYSCALL_BASE+371)
> > -#define __NR_clock_adjtime		(__NR_SYSCALL_BASE+372)
> > -#define __NR_syncfs			(__NR_SYSCALL_BASE+373)
> > -#define __NR_sendmmsg			(__NR_SYSCALL_BASE+374)
> > -#define __NR_setns			(__NR_SYSCALL_BASE+375)
> > -#define __NR_process_vm_readv		(__NR_SYSCALL_BASE+376)
> > -#define __NR_process_vm_writev		(__NR_SYSCALL_BASE+377)
> > -#define __NR_kcmp			(__NR_SYSCALL_BASE+378)
> > -#define __NR_finit_module		(__NR_SYSCALL_BASE+379)
> > -#define __NR_sched_setattr		(__NR_SYSCALL_BASE+380)
> > -#define __NR_sched_getattr		(__NR_SYSCALL_BASE+381)
> > -#define __NR_renameat2			(__NR_SYSCALL_BASE+382)
> > -#define __NR_seccomp			(__NR_SYSCALL_BASE+383)
> > -#define __NR_getrandom			(__NR_SYSCALL_BASE+384)
> > -#define __NR_memfd_create		(__NR_SYSCALL_BASE+385)
> > -#define __NR_bpf			(__NR_SYSCALL_BASE+386)
> > -#define __NR_execveat			(__NR_SYSCALL_BASE+387)
> > -#define __NR_userfaultfd		(__NR_SYSCALL_BASE+388)
> > -#define __NR_membarrier			(__NR_SYSCALL_BASE+389)
> > -#define __NR_mlock2			(__NR_SYSCALL_BASE+390)
> > -#define __NR_copy_file_range		(__NR_SYSCALL_BASE+391)
> > -#define __NR_preadv2			(__NR_SYSCALL_BASE+392)
> > -#define __NR_pwritev2			(__NR_SYSCALL_BASE+393)
> >  
> >  /*
> >   * The following SWIs are ARM private.
> > @@ -431,22 +36,4 @@
> >  #define __ARM_NR_usr32			(__ARM_NR_BASE+4)
> >  #define __ARM_NR_set_tls		(__ARM_NR_BASE+5)
> >  
> > -/*
> > - * The following syscalls are obsolete and no longer available for EABI.
> > - */
> > -#if defined(__ARM_EABI__)
> > -#undef __NR_time
> > -#undef __NR_umount
> > -#undef __NR_stime
> > -#undef __NR_alarm
> > -#undef __NR_utime
> > -#undef __NR_getrlimit
> > -#undef __NR_select
> > -#undef __NR_readdir
> > -#undef __NR_mmap
> > -#undef __NR_socketcall
> > -#undef __NR_syscall
> > -#undef __NR_ipc
> > -#endif
> > -
> >  #endif /* __ASM_ARM_UNISTD_H */
> > diff --git a/linux-headers/asm-powerpc/kvm.h b/linux-headers/asm-powerpc/kvm.h
> > index c93cf35ce3..cc0908b6c2 100644
> > --- a/linux-headers/asm-powerpc/kvm.h
> > +++ b/linux-headers/asm-powerpc/kvm.h
> > @@ -413,6 +413,26 @@ struct kvm_get_htab_header {
> >  	__u16	n_invalid;
> >  };
> >  
> > +/* For KVM_PPC_CONFIGURE_V3_MMU */
> > +struct kvm_ppc_mmuv3_cfg {
> > +	__u64	flags;
> > +	__u64	process_table;	/* second doubleword of partition table entry */
> > +};
> > +
> > +/* Flag values for KVM_PPC_CONFIGURE_V3_MMU */
> > +#define KVM_PPC_MMUV3_RADIX	1	/* 1 = radix mode, 0 = HPT */
> > +#define KVM_PPC_MMUV3_GTSE	2	/* global translation shootdown enb. */
> > +
> > +/* For KVM_PPC_GET_RMMU_INFO */
> > +struct kvm_ppc_rmmu_info {
> > +	struct kvm_ppc_radix_geom {
> > +		__u8	page_shift;
> > +		__u8	level_bits[4];
> > +		__u8	pad[3];
> > +	}	geometries[8];
> > +	__u32	ap_encodings[8];
> > +};
> > +
> >  /* Per-vcpu XICS interrupt controller state */
> >  #define KVM_REG_PPC_ICP_STATE	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c)
> >  
> > @@ -573,6 +593,10 @@ struct kvm_get_htab_header {
> >  #define KVM_REG_PPC_SPRG9	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xba)
> >  #define KVM_REG_PPC_DBSR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xbb)
> >  
> > +/* POWER9 registers */
> > +#define KVM_REG_PPC_TIDR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbc)
> > +#define KVM_REG_PPC_PSSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbd)
> > +
> >  /* Transactional Memory checkpointed state:
> >   * This is all GPRs, all VSX regs and a subset of SPRs
> >   */
> > @@ -596,6 +620,7 @@ struct kvm_get_htab_header {
> >  #define KVM_REG_PPC_TM_VSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U32 | 0x67)
> >  #define KVM_REG_PPC_TM_DSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x68)
> >  #define KVM_REG_PPC_TM_TAR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x69)
> > +#define KVM_REG_PPC_TM_XER	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x6a)
> >  
> >  /* PPC64 eXternal Interrupt Controller Specification */
> >  #define KVM_DEV_XICS_GRP_SOURCES	1	/* 64-bit source attributes */
> > diff --git a/linux-headers/asm-powerpc/unistd.h b/linux-headers/asm-powerpc/unistd.h
> > index 1e66eba4c6..598043c7b6 100644
> > --- a/linux-headers/asm-powerpc/unistd.h
> > +++ b/linux-headers/asm-powerpc/unistd.h
> > @@ -392,5 +392,6 @@
> >  #define __NR_copy_file_range	379
> >  #define __NR_preadv2		380
> >  #define __NR_pwritev2		381
> > +#define __NR_kexec_file_load	382
> >  
> >  #endif /* _ASM_POWERPC_UNISTD_H_ */
> > diff --git a/linux-headers/asm-x86/kvm_para.h b/linux-headers/asm-x86/kvm_para.h
> > index e41c5c1a28..0739a74626 100644
> > --- a/linux-headers/asm-x86/kvm_para.h
> > +++ b/linux-headers/asm-x86/kvm_para.h
> > @@ -45,7 +45,9 @@ struct kvm_steal_time {
> >  	__u64 steal;
> >  	__u32 version;
> >  	__u32 flags;
> > -	__u32 pad[12];
> > +	__u8  preempted;
> > +	__u8  u8_pad[3];
> > +	__u32 pad[11];
> >  };
> >  
> >  #define KVM_STEAL_ALIGNMENT_BITS 5
> > diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
> > index bb0ed71223..659039c359 100644
> > --- a/linux-headers/linux/kvm.h
> > +++ b/linux-headers/linux/kvm.h
> > @@ -651,6 +651,9 @@ struct kvm_enable_cap {
> >  };
> >  
> >  /* for KVM_PPC_GET_PVINFO */
> > +
> > +#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
> > +
> >  struct kvm_ppc_pvinfo {
> >  	/* out */
> >  	__u32 flags;
> > @@ -682,8 +685,6 @@ struct kvm_ppc_smmu_info {
> >  	struct kvm_ppc_one_seg_page_size sps[KVM_PPC_PAGE_SIZES_MAX_SZ];
> >  };
> >  
> > -#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0)
> > -
> >  #define KVMIO 0xAE
> >  
> >  /* machine type bits, to be used as argument to KVM_CREATE_VM */
> > @@ -870,6 +871,8 @@ struct kvm_ppc_smmu_info {
> >  #define KVM_CAP_S390_USER_INSTR0 130
> >  #define KVM_CAP_MSI_DEVID 131
> >  #define KVM_CAP_PPC_HTM 132
> > +#define KVM_CAP_PPC_MMU_RADIX 134
> > +#define KVM_CAP_PPC_MMU_HASH_V3 135
> >  
> >  #ifdef KVM_CAP_IRQ_ROUTING
> >  
> > @@ -1186,6 +1189,10 @@ struct kvm_s390_ucas_mapping {
> >  #define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr)
> >  /* Available with KVM_CAP_PPC_RTAS */
> >  #define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO,  0xac, struct kvm_rtas_token_args)
> > +/* Available with KVM_CAP_PPC_RADIX_MMU or KVM_CAP_PPC_HASH_MMU_V3 */
> > +#define KVM_PPC_CONFIGURE_V3_MMU  _IOW(KVMIO,  0xaf, struct kvm_ppc_mmuv3_cfg)
> > +/* Available with KVM_CAP_PPC_RADIX_MMU */
> > +#define KVM_PPC_GET_RMMU_INFO	  _IOW(KVMIO,  0xb0, struct kvm_ppc_rmmu_info)
> >  
> >  /* ioctl for vm fd */
> >  #define KVM_CREATE_DEVICE	  _IOWR(KVMIO,  0xe0, struct kvm_create_device)
> > diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h
> > index 759b850a3e..531cb2eda9 100644
> > --- a/linux-headers/linux/vfio.h
> > +++ b/linux-headers/linux/vfio.h
> > @@ -203,6 +203,16 @@ struct vfio_device_info {
> >  };
> >  #define VFIO_DEVICE_GET_INFO		_IO(VFIO_TYPE, VFIO_BASE + 7)
> >  
> > +/*
> > + * Vendor driver using Mediated device framework should provide device_api
> > + * attribute in supported type attribute groups. Device API string should be one
> > + * of the following corresponding to device flags in vfio_device_info structure.
> > + */
> > +
> > +#define VFIO_DEVICE_API_PCI_STRING		"vfio-pci"
> > +#define VFIO_DEVICE_API_PLATFORM_STRING		"vfio-platform"
> > +#define VFIO_DEVICE_API_AMBA_STRING		"vfio-amba"
> > +
> >  /**
> >   * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8,
> >   *				       struct vfio_region_info)
> 
> -- 
> David Gibson			| I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
> 				| _way_ _around_!
> http://www.ozlabs.org/~dgibson

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

* Re: [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree
  2017-02-09  2:14   ` David Gibson
@ 2017-02-09  5:07     ` Sam Bobroff
  0 siblings, 0 replies; 30+ messages in thread
From: Sam Bobroff @ 2017-02-09  5:07 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-devel, qemu-ppc

On Thu, Feb 09, 2017 at 01:14:08PM +1100, David Gibson wrote:
> On Tue, Feb 07, 2017 at 01:56:46PM +1100, Sam Bobroff wrote:
> > Use the new ioctl, KVM_PPC_GET_RMMU_INFO, to fetch radix MMU
> > information from KVM and present the page encodings in the device tree
> > under ibm,processor-radix-AP-encodings. This provides page size
> > information to the guest which is necessary for it to use radix mode.
> > 
> > Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
> > ---
> >  hw/ppc/spapr.c   |  7 +++++++
> >  target/ppc/cpu.h |  5 +++++
> >  target/ppc/kvm.c | 32 +++++++++++++++++++++++++++++++-
> >  3 files changed, 43 insertions(+), 1 deletion(-)
> > 
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index a642e663d4..d629e2630c 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -496,6 +496,13 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
> >  
> >      _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu,
> >                                  ppc_get_compat_smt_threads(cpu)));
> > +
> > +    if (env->radix_page_info.count) {
> > +        _FDT((fdt_setprop(fdt, offset, "ibm,processor-radix-AP-encodings",
> > +                          env->radix_page_info.entries,
> > +                          env->radix_page_info.count *
> > +                          sizeof(env->radix_page_info.entries[0]))));
> > +    }
> >  }
> >  
> >  static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
> > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> > index afb7ddbdd0..5a96d98b6f 100644
> > --- a/target/ppc/cpu.h
> > +++ b/target/ppc/cpu.h
> > @@ -914,6 +914,10 @@ struct ppc_segment_page_sizes {
> >      struct ppc_one_seg_page_size sps[PPC_PAGE_SIZES_MAX_SZ];
> >  };
> >  
> > +struct ppc_radix_page_info {
> > +    uint32_t count;
> > +    uint32_t entries[PPC_PAGE_SIZES_MAX_SZ];
> 
> IIUC this info is ready for direct inclusion in the device tree:
> i.e. it's big-endian.  That absolutely needs a comment in the
> structure.  I'm also not sure it's a good idea, since I assume the TCG
> POWER9 code will eventually need to access this information directly
> to implement the radix MMU.
> 
> Might be clearer to make this data structure native and do the BE
> conversion when generating the device tree.

Sounds good, I'll try it.

> > +};
> >  
> >  /*****************************************************************************/
> >  /* The whole PowerPC CPU context */
> > @@ -1053,6 +1057,7 @@ struct CPUPPCState {
> >      ppc_slb_t vrma_slb;
> >      target_ulong rmls;
> >      bool ci_large_pages;
> > +    struct ppc_radix_page_info radix_page_info;
> 
> I'm not sure this belongs in CPUPPCState.  New fields should generally
> be added to PowerPCCPU ("cpu") rather than to CPUPPCState ("env")
> unless they need to be directly accessed from TCG generated code.
> 
> But even more, AFAICT this should vary only with the CPU type/model,
> not with the individual CPU instance.  So this information could
> probably go into the CPU class structure instead of the instance.
> 
> Yes, there are a lot of things that don't obey those rules already -
> that's because a lot of stuff hasn't been converted since the new QOM
> stuff was introduced.  But we shouldn't make it any worse with new
> patches.

Agreed, I'll move it.

> >  #endif
> >  
> >  #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
> > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> > index ec92c64159..390d6342cc 100644
> > --- a/target/ppc/kvm.c
> > +++ b/target/ppc/kvm.c
> > @@ -328,6 +328,18 @@ static void kvm_get_smmu_info(PowerPCCPU *cpu, struct kvm_ppc_smmu_info *info)
> >      kvm_get_fallback_smmu_info(cpu, info);
> >  }
> >  
> > +static bool kvm_get_rmmu_info(PowerPCCPU *cpu, struct kvm_ppc_rmmu_info *info)
> > +{
> > +    CPUState *cs = CPU(cpu);
> > +    int ret;
> > +
> > +    if (kvm_check_extension(cs->kvm_state, KVM_CAP_PPC_MMU_RADIX)) {
> > +        ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_GET_RMMU_INFO, info);
> > +        return (ret == 0);
> > +    }
> > +    return false;
> > +}
> > +
> >  static long gethugepagesize(const char *mem_path)
> >  {
> >      struct statfs fs;
> > @@ -441,9 +453,11 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
> >  {
> >      static struct kvm_ppc_smmu_info smmu_info;
> >      static bool has_smmu_info;
> > +    static struct kvm_ppc_rmmu_info rmmu_info;
> > +    static bool has_rmmu_info;
> >      CPUPPCState *env = &cpu->env;
> >      long rampagesize;
> > -    int iq, ik, jq, jk;
> > +    int iq, ik, jq, jk, i;
> >      bool has_64k_pages = false;
> >  
> >      /* We only handle page sizes for 64-bit server guests for now */
> > @@ -508,6 +522,22 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
> >      if (!has_64k_pages) {
> >          env->mmu_model &= ~POWERPC_MMU_64K;
> >      }
> > +
> > +    /* Collect radix page info from kernel if not already */
> > +    if (!has_rmmu_info) {
> 
> Putting the data in the class would avoid this ugly messing with a
> static local, for one thing.

Yeah, that will be nice :-)

> > +        env->radix_page_info.count = 0;
> > +        if (kvm_get_rmmu_info(cpu, &rmmu_info)) {
> > +            for (i = 0; i < 8; i++) {
> 
> s/8/PPC_PAGE_SIZES_MAX_SZ/ ?

Yes!

> > +                if (rmmu_info.ap_encodings[i]) {
> > +                    env->radix_page_info.entries[i] =
> > +                        cpu_to_be32(rmmu_info.ap_encodings[i]);
> > +                    env->radix_page_info.count++;
> > +                }
> > +            }
> > +        }
> > +        has_rmmu_info = true;
> > +    }
> > +
> >  }
> >  #else /* defined (TARGET_PPC64) */
> >  
> 
> -- 
> David Gibson			| I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
> 				| _way_ _around_!
> http://www.ozlabs.org/~dgibson

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

* Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH 2/9] Update headers using update-linux-headers.sh
  2017-02-09  4:53     ` Sam Bobroff
@ 2017-02-09  7:45       ` Thomas Huth
  0 siblings, 0 replies; 30+ messages in thread
From: Thomas Huth @ 2017-02-09  7:45 UTC (permalink / raw)
  To: Sam Bobroff; +Cc: qemu-devel, qemu-ppc, david, qemu-arm

On 09.02.2017 05:53, Sam Bobroff wrote:
> On Tue, Feb 07, 2017 at 01:59:52PM +0100, Thomas Huth wrote:
>> On 07.02.2017 03:56, Sam Bobroff wrote:
>>> This provides some new definitions needed by ISA 3.00 guests.
>>>
>>> It is a large change because this is the first import since
>>> some kernel header files have become autogenerated.
>>>
>>> Note: update-linux-headers.sh currently generates a change that
>>> (incorrectly) removes virtio_mmio.h and the change has been manually
>>> adjusted to prevent that.
>>>
>>> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
>>> ---
>>>  include/standard-headers/linux/input-event-codes.h |   2 +-
>>>  include/standard-headers/linux/pci_regs.h          |   8 +
>>>  include/standard-headers/linux/virtio_ids.h        |   1 +
>>>  linux-headers/asm-arm/kvm.h                        |   2 +
>>>  linux-headers/asm-arm/unistd.h                     | 419 +--------------------
>>>  linux-headers/asm-powerpc/kvm.h                    |  25 ++
>>>  linux-headers/asm-powerpc/unistd.h                 |   1 +
>>>  linux-headers/asm-x86/kvm_para.h                   |   4 +-
>>>  linux-headers/linux/kvm.h                          |  11 +-
>>>  linux-headers/linux/vfio.h                         |  10 +
>>>  10 files changed, 63 insertions(+), 420 deletions(-)
>> [...]
>>> diff --git a/linux-headers/asm-arm/unistd.h b/linux-headers/asm-arm/unistd.h
>>> index ceb5450c81..155571b874 100644
>>> --- a/linux-headers/asm-arm/unistd.h
>>> +++ b/linux-headers/asm-arm/unistd.h
>>> @@ -17,409 +17,14 @@
>>>  
>>>  #if defined(__thumb__) || defined(__ARM_EABI__)
>>>  #define __NR_SYSCALL_BASE	0
>>> +#include <asm/unistd-eabi.h>
>>>  #else
>>>  #define __NR_SYSCALL_BASE	__NR_OABI_SYSCALL_BASE
>>> +#include <asm/unistd-oabi.h>
>>>  #endif
>>>  
>>> -/*
>>> - * This file contains the system call numbers.
>>> - */
>> [...]
>>
>> Looks like the contents of asm-arm/unistd.h has been moved to two new
>> files, unistd-eabi.h and unistd-oabi.h, but they are not part of your
>> patch. I guess update-linux-headers.sh needs a fix for that?
>>
>>  Thomas
> 
> Ah thanks! I'll look at it.
> 
> Should I try to fix the other problem with update-linux-headers.sh at
> the same time? (I'm referring to the issue I noted in the commit
> message, about virtio_mmio.h)

Yes, please!

 Thomas

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

end of thread, other threads:[~2017-02-09  7:45 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-07  2:56 [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support Sam Bobroff
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 1/9] spapr: fix off-by-one error in spapr_ovec_populate_dt() Sam Bobroff
2017-02-07 15:47   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
2017-02-09  1:53     ` David Gibson
2017-02-07 22:12   ` [Qemu-devel] " Michael Roth
2017-02-07 22:53     ` Sam Bobroff
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 2/9] Update headers using update-linux-headers.sh Sam Bobroff
2017-02-07 12:59   ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
2017-02-09  4:53     ` Sam Bobroff
2017-02-09  7:45       ` Thomas Huth
2017-02-09  1:55   ` [Qemu-devel] " David Gibson
2017-02-09  4:54     ` Sam Bobroff
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 3/9] spapr: Add ibm, processor-radix-AP-encodings to the device tree Sam Bobroff
2017-02-09  2:14   ` David Gibson
2017-02-09  5:07     ` Sam Bobroff
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 4/9] target-ppc: support KVM_CAP_PPC_MMU_RADIX, KVM_CAP_PPC_MMU_HASH_V3 Sam Bobroff
2017-02-09  2:16   ` David Gibson
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 5/9] spapr: Only setup HTP if necessary Sam Bobroff
2017-02-09  2:24   ` David Gibson
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 6/9] spapr: Add h_register_process_table() hypercall Sam Bobroff
2017-02-09  2:32   ` David Gibson
2017-02-09  4:16   ` [Qemu-devel] [Qemu-ppc] " Alexey Kardashevskiy
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 7/9] spapr: Set ISA 3.00 radix and hash bits in OV5 Sam Bobroff
2017-02-09  2:34   ` David Gibson
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 8/9] spapr: Advertise ISA 3.0 MMU features in pa_features Sam Bobroff
2017-02-09  2:42   ` David Gibson
2017-02-07  2:56 ` [Qemu-devel] [RFC PATCH 9/9] spapr: Small cleanup of PPC MMU enums Sam Bobroff
2017-02-09  2:49   ` David Gibson
2017-02-09  2:51 ` [Qemu-devel] [RFC PATCH 0/9] ISA 3.00 KVM guest support David Gibson
2017-02-09  3:21 ` Alexey Kardashevskiy

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.