From: Alexander Graf <agraf@suse.de>
To: qemu-devel qemu-devel <qemu-devel@nongnu.org>
Cc: Blue Swirl <blauwirbel@gmail.com>,
qemu-ppc Mailing List <qemu-ppc@nongnu.org>,
Aurelien Jarno <aurelien@aurel32.net>
Subject: [Qemu-devel] [PATCH 29/72] spapr: Add "memop" hypercall
Date: Sun, 24 Jun 2012 01:06:53 +0200 [thread overview]
Message-ID: <1340492856-21126-30-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1340492856-21126-1-git-send-email-agraf@suse.de>
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This adds a qemu-specific hypervisor call to the pseries machine
which allows to do what amounts to memmove, memcpy and xor over
regions of physical memory such as the framebuffer.
This is the simplest way to get usable framebuffer speed from
SLOF since the framebuffer isn't mapped in the VRMA and so would
otherwise require an hcall per 8 bytes access.
The performance is still not great but usable, and can be improved
with a more complex implementation of the hcall itself if needed.
This also adds some documentation for the qemu-specific hypercalls
that we add to PAPR along with a new qemu,hypertas-functions property
that mirrors ibm,hypertas-functions and provides some discoverability
for the new calls.
Note: I chose note to advertise H_RTAS to the guest via that mechanism.
This is done on purpose, the guest uses the normal RTAS interfaces
provided by qemu (including SLOF) which internally calls H_RTAS.
We might in the future implement part (or even all) of RTAS inside the
guest like IBM's firmware does and replace H_RTAS with some finer grained
set of private hypercalls.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
docs/specs/ppc-spapr-hcalls.txt | 78 +++++++++++++++++++++++++++++++++++++++
hw/spapr.c | 3 +
hw/spapr.h | 3 +-
hw/spapr_hcall.c | 68 ++++++++++++++++++++++++++++++++++
4 files changed, 151 insertions(+), 1 deletions(-)
create mode 100644 docs/specs/ppc-spapr-hcalls.txt
diff --git a/docs/specs/ppc-spapr-hcalls.txt b/docs/specs/ppc-spapr-hcalls.txt
new file mode 100644
index 0000000..52ba8d4
--- /dev/null
+++ b/docs/specs/ppc-spapr-hcalls.txt
@@ -0,0 +1,78 @@
+When used with the "pseries" machine type, QEMU-system-ppc64 implements
+a set of hypervisor calls using a subset of the server "PAPR" specification
+(IBM internal at this point), which is also what IBM's proprietary hypervisor
+adheres too.
+
+The subset is selected based on the requirements of Linux as a guest.
+
+In addition to those calls, we have added our own private hypervisor
+calls which are mostly used as a private interface between the firmware
+running in the guest and QEMU.
+
+All those hypercalls start at hcall number 0xf000 which correspond
+to a implementation specific range in PAPR.
+
+- H_RTAS (0xf000)
+
+RTAS is a set of runtime services generally provided by the firmware
+inside the guest to the operating system. It predates the existence
+of hypervisors (it was originally an extension to Open Firmware) and
+is still used by PAPR to provide various services that aren't performance
+sensitive.
+
+We currently implement the RTAS services in QEMU itself. The actual RTAS
+"firmware" blob in the guest is a small stub of a few instructions which
+calls our private H_RTAS hypervisor call to pass the RTAS calls to QEMU.
+
+Arguments:
+
+ r3 : H_RTAS (0xf000)
+ r4 : Guest physical address of RTAS parameter block
+
+Returns:
+
+ H_SUCCESS : Successully called the RTAS function (RTAS result
+ will have been stored in the parameter block)
+ H_PARAMETER : Unknown token
+
+- H_LOGICAL_MEMOP (0xf001)
+
+When the guest runs in "real mode" (in powerpc lingua this means
+with MMU disabled, ie guest effective == guest physical), it only
+has access to a subset of memory and no IOs.
+
+PAPR provides a set of hypervisor calls to perform cachable or
+non-cachable accesses to any guest physical addresses that the
+guest can use in order to access IO devices while in real mode.
+
+This is typically used by the firmware running in the guest.
+
+However, doing a hypercall for each access is extremely inefficient
+(even more so when running KVM) when accessing the frame buffer. In
+that case, things like scrolling become unusably slow.
+
+This hypercall allows the guest to request a "memory op" to be applied
+to memory. The supported memory ops at this point are to copy a range
+of memory (supports overlap of source and destination) and XOR which
+is used by our SLOF firmware to invert the screen.
+
+Arguments:
+
+ r3: H_LOGICAL_MEMOP (0xf001)
+ r4: Guest physical address of destination
+ r5: Guest physical address of source
+ r6: Individual element size
+ 0 = 1 byte
+ 1 = 2 bytes
+ 2 = 4 bytes
+ 3 = 8 bytes
+ r7: Number of elements
+ r8: Operation
+ 0 = copy
+ 1 = xor
+
+Returns:
+
+ H_SUCCESS : Success
+ H_PARAMETER : Invalid argument
+
diff --git a/hw/spapr.c b/hw/spapr.c
index 1b01d64..09a23ff 100644
--- a/hw/spapr.c
+++ b/hw/spapr.c
@@ -197,6 +197,7 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
uint32_t pft_size_prop[] = {0, cpu_to_be32(hash_shift)};
char hypertas_prop[] = "hcall-pft\0hcall-term\0hcall-dabr\0hcall-interrupt"
"\0hcall-tce\0hcall-vio\0hcall-splpar\0hcall-bulk";
+ char qemu_hypertas_prop[] = "hcall-memop1";
uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(smp_cpus)};
int i;
char *modelname;
@@ -417,6 +418,8 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
_FDT((fdt_property(fdt, "ibm,hypertas-functions", hypertas_prop,
sizeof(hypertas_prop))));
+ _FDT((fdt_property(fdt, "qemu,hypertas-functions", qemu_hypertas_prop,
+ sizeof(qemu_hypertas_prop))));
_FDT((fdt_property(fdt, "ibm,associativity-reference-points",
refpoints, sizeof(refpoints))));
diff --git a/hw/spapr.h b/hw/spapr.h
index 654a7a8..c75172e 100644
--- a/hw/spapr.h
+++ b/hw/spapr.h
@@ -264,7 +264,8 @@ typedef struct sPAPREnvironment {
*/
#define KVMPPC_HCALL_BASE 0xf000
#define KVMPPC_H_RTAS (KVMPPC_HCALL_BASE + 0x0)
-#define KVMPPC_HCALL_MAX KVMPPC_H_RTAS
+#define KVMPPC_H_LOGICAL_MEMOP (KVMPPC_HCALL_BASE + 0x1)
+#define KVMPPC_HCALL_MAX KVMPPC_H_LOGICAL_MEMOP
extern sPAPREnvironment *spapr;
diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
index 94bb504..a5990a9 100644
--- a/hw/spapr_hcall.c
+++ b/hw/spapr_hcall.c
@@ -608,6 +608,73 @@ static target_ulong h_logical_store(CPUPPCState *env, sPAPREnvironment *spapr,
return H_PARAMETER;
}
+static target_ulong h_logical_memop(CPUPPCState *env, sPAPREnvironment *spapr,
+ target_ulong opcode, target_ulong *args)
+{
+ target_ulong dst = args[0]; /* Destination address */
+ target_ulong src = args[1]; /* Source address */
+ target_ulong esize = args[2]; /* Element size (0=1,1=2,2=4,3=8) */
+ target_ulong count = args[3]; /* Element count */
+ target_ulong op = args[4]; /* 0 = copy, 1 = invert */
+ uint64_t tmp;
+ unsigned int mask = (1 << esize) - 1;
+ int step = 1 << esize;
+
+ if (count > 0x80000000) {
+ return H_PARAMETER;
+ }
+
+ if ((dst & mask) || (src & mask) || (op > 1)) {
+ return H_PARAMETER;
+ }
+
+ if (dst >= src && dst < (src + (count << esize))) {
+ dst = dst + ((count - 1) << esize);
+ src = src + ((count - 1) << esize);
+ step = -step;
+ }
+
+ while (count--) {
+ switch (esize) {
+ case 0:
+ tmp = ldub_phys(src);
+ break;
+ case 1:
+ tmp = lduw_phys(src);
+ break;
+ case 2:
+ tmp = ldl_phys(src);
+ break;
+ case 3:
+ tmp = ldq_phys(src);
+ break;
+ default:
+ return H_PARAMETER;
+ }
+ if (op == 1) {
+ tmp = ~tmp;
+ }
+ switch (esize) {
+ case 0:
+ stb_phys(dst, tmp);
+ break;
+ case 1:
+ stw_phys(dst, tmp);
+ break;
+ case 2:
+ stl_phys(dst, tmp);
+ break;
+ case 3:
+ stq_phys(dst, tmp);
+ break;
+ }
+ dst = dst + step;
+ src = src + step;
+ }
+
+ return H_SUCCESS;
+}
+
static target_ulong h_logical_icbi(CPUPPCState *env, sPAPREnvironment *spapr,
target_ulong opcode, target_ulong *args)
{
@@ -700,6 +767,7 @@ static void hypercall_register_types(void)
spapr_register_hypercall(H_LOGICAL_CACHE_STORE, h_logical_store);
spapr_register_hypercall(H_LOGICAL_ICBI, h_logical_icbi);
spapr_register_hypercall(H_LOGICAL_DCBF, h_logical_dcbf);
+ spapr_register_hypercall(KVMPPC_H_LOGICAL_MEMOP, h_logical_memop);
/* qemu/KVM-PPC specific hcalls */
spapr_register_hypercall(KVMPPC_H_RTAS, h_rtas);
--
1.6.0.2
next prev parent reply other threads:[~2012-06-23 23:08 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-23 23:06 [Qemu-devel] [PULL 00/72] ppc patch queue 2012-06-24 Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 01/72] ppc: Fix coding style in op_helper.c Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 02/72] ppc: Split exception helpers Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 03/72] ppc: Avoid AREG0 for " Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 04/72] ppc: Fix coding style in helper.c Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 05/72] ppc: Move exception helpers from helper.c to excp_helper.c Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 06/72] ppc: Split FPU and SPE ops Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 07/72] ppc: Avoid AREG0 for FPU and SPE helpers Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 08/72] ppc: Split integer and vector ops Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 09/72] ppc: Avoid AREG0 for integer and vector helpers Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 10/72] ppc: Split MMU etc. helpers from op_helper.c Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 11/72] ppc: Avoid AREG0 for MMU etc. helpers Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 12/72] ppc: Avoid a warning with the next patch Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 13/72] ppc: Move MMU helpers from helper.c to mmu_helper.c Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 14/72] ppc: Cleanup MMU merge Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 15/72] ppc: Split off timebase helpers Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 16/72] ppc: Avoid AREG0 for " Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 17/72] ppc: Split off misc helpers Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 18/72] ppc: Avoid AREG0 for " Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 19/72] ppc: Move misc helpers from helper.c to misc_helper.c Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 20/72] ppc: Move load and store helpers, switch to AREG0 free mode Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 21/72] ppc: Add missing break Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 22/72] ppc: Make hbrev table const Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 23/72] PPC: mpc8544ds: Span initial TLB entry over as much RAM as we need Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 24/72] Avoid segfault in cpu_dump_state Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 25/72] booke_206_tlbwe: Discard invalid bits in MAS2 Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 26/72] ppc64: Rudimentary Support for extra page sizes on server CPUs Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 27/72] pseries: Correctly create ibm, segment-page-sizes property Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 28/72] spapr_vscsi: Error handling fixes Alexander Graf
2012-06-23 23:06 ` Alexander Graf [this message]
2012-06-23 23:06 ` [Qemu-devel] [PATCH 30/72] raw-posix: Fix build without is_allocated support Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 31/72] dt: allow add_subnode to create root subnodes Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 32/72] dt: add helpers for multi-cell adds Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 33/72] dt: add helper for phandle references Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 34/72] dt: temporarily disable subtree creation failure check Alexander Graf
2012-06-23 23:06 ` [Qemu-devel] [PATCH 35/72] dt: add helper for phandle enumeration Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 36/72] dt: add helper for empty dt creation Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 37/72] dt: add helper for phandle allocation Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 38/72] dt: add helper for 64bit cell adds Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 39/72] PPC: e500: require libfdt Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 40/72] PPC: e500: dt: create memory node dynamically Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 41/72] PPC: e500: dt: create /cpus " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 42/72] PPC: e500: dt: create /hypervisor " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 43/72] PPC: e500: dt: create / " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 44/72] PPC: e500: dt: create /chosen " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 45/72] PPC: e500: dt: create /soc8544 " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 46/72] PPC: e500: dt: create serial nodes dynamically Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 47/72] PPC: e500: dt: create mpic node dynamically Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 48/72] PPC: e500: dt: create global-utils " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 49/72] PPC: e500: dt: create pci " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 50/72] PPC: e500: dt: start with empty device tree Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 51/72] dt: Add -machine dumpdtb option to dump the current dtb Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 52/72] PPC: e500: dt: use 64bit cell helper Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 53/72] PPC: e500: dt: use target_phys_addr_t for ramsize Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 54/72] PPC: e500: enable manual loading of dtb blob Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 55/72] Revert "dt: temporarily disable subtree creation failure check" Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 56/72] PPC: e500: Use new MPIC dt format Alexander Graf
2012-08-08 21:16 ` [Qemu-devel] [Qemu-ppc] " Alexander Graf
2012-08-08 22:40 ` Scott Wood
2012-08-09 20:48 ` Alexander Graf
2012-08-09 20:50 ` Scott Wood
2012-08-09 20:52 ` Alexander Graf
2012-08-09 20:58 ` Scott Wood
2012-08-09 21:01 ` Alexander Graf
2012-08-09 21:11 ` Scott Wood
2012-08-09 21:19 ` Alexander Graf
2012-08-09 21:28 ` Scott Wood
2012-08-09 21:36 ` Alexander Graf
2012-08-09 21:45 ` Scott Wood
2012-08-09 21:48 ` Alexander Graf
2012-08-08 22:40 ` [Qemu-devel] " Peter Maydell
2012-08-08 22:43 ` Peter Maydell
2012-06-23 23:07 ` [Qemu-devel] [PATCH 57/72] PPC: e500: Use new SOC " Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 58/72] PPC: e500: Define addresses as always 64bit Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 59/72] PPC: e500: Extend address/size of / to 64bit Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 60/72] dt: Add global option to set phandle start offset Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 61/72] PPC: e500: Refactor serial dt generation Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 62/72] dt: make setprop argument static Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 63/72] PPC: e500: allow users to set the /compatible property via -machine Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 64/72] uImage: increase the gzip load size Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 65/72] PPC: Add some booke SPR defines Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 66/72] PPC: Add support for MSR_CM Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 67/72] PPC: BookE: Implement EPR SPR Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 68/72] PPC: BookE: Make ivpr selectable by CPU type Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 69/72] PPC: Add e5500 CPU target Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 70/72] PPC: Extract SPR dump generation into its own function Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 71/72] PPC: BookE: Support 32 and 64 bit wide MAS2 Alexander Graf
2012-06-23 23:07 ` [Qemu-devel] [PATCH 72/72] PPC: BookE206: Bump MAS2 to 64bit Alexander Graf
2012-06-24 12:27 ` [Qemu-devel] [PULL 00/72] ppc patch queue 2012-06-24 Blue Swirl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1340492856-21126-30-git-send-email-agraf@suse.de \
--to=agraf@suse.de \
--cc=aurelien@aurel32.net \
--cc=blauwirbel@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).