Re: [kvm-unit-tests PATCH 2/2] lib: s390x: snippet.h: Add a few constants that will make our life easier

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/13/21 12:35, Claudio Imbrenda wrote:
On Wed, 13 Oct 2021 10:27:22 +0000
Janosch Frank <frankja@xxxxxxxxxxxxx> wrote:

The variable names for the snippet objects are of gigantic length so
let's define a few macros to make them easier to read.

Also add a standard PSW which should be used to start the snippet.

Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx>
---
  lib/s390x/snippet.h | 40 ++++++++++++++++++++++++++++++++++++++++
  s390x/mvpg-sie.c    | 13 ++++++-------
  2 files changed, 46 insertions(+), 7 deletions(-)
  create mode 100644 lib/s390x/snippet.h

diff --git a/lib/s390x/snippet.h b/lib/s390x/snippet.h
new file mode 100644
index 00000000..9ead4fe3
--- /dev/null
+++ b/lib/s390x/snippet.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Snippet definitions
+ *
+ * Copyright IBM, Corp. 2021
+ * Author: Janosch Frank <frankja@xxxxxxxxxxxxx>
+ */
+
+#ifndef _S390X_SNIPPET_H_
+#define _S390X_SNIPPET_H_
+
+/* This macro cuts down the length of the pointers to snippets */
+#define SNIPPET_NAME_START(type, file) \
+	_binary_s390x_snippets_##type##_##file##_gbin_start
+#define SNIPPET_NAME_END(type, file) \
+	_binary_s390x_snippets_##type##_##file##_gbin_end
+
+/* Returns the length of the snippet */
+#define SNIPPET_LEN(type, file) \
+	(uintptr_t)SNIPPET_NAME_END(type, file) - (uintptr_t)SNIPPET_NAME_START(type, file)

parentheses around the expansion:
	((uintptr_t)SNIPPET_NAME_END(type, file) - (uintptr_t)SNIPPET_NAME_START(type, file))


Will do

+
+/*
+ * C snippet instructions start at 0x4000 due to the prefix and the
+ * stack being before that.
+ */
+#define SNIPPET_C_ENTRY_ADDR 0x4000
+/* ASM snippets only have the prefix and hence start at 0x2000 */

wouldn't it be possible to make both start at the same address?
would make everything easier.

Sure, for the ASM snippets the entry address only depends on where you copy them if I'm not mistaken.


ASM snippets would have a couple of unused pages, but who cares?

+#define SNIPPET_ASM_ENTRY_ADDR 0x2000
+
+/* Standard entry PSWs for snippets which can simply be copied into the guest PSW */
+static const struct psw snippet_c_psw = {
+	.mask = PSW_MASK_64,
+	.addr = SNIPPET_C_ENTRY_ADDR,
+};
+
+static const struct psw snippet_asm_psw = {
+	.mask = PSW_MASK_64,
+	.addr = SNIPPET_ASM_ENTRY_ADDR,
+};
+#endif
diff --git a/s390x/mvpg-sie.c b/s390x/mvpg-sie.c
index 5adcec1e..46170d02 100644
--- a/s390x/mvpg-sie.c
+++ b/s390x/mvpg-sie.c
@@ -19,6 +19,7 @@
  #include <vm.h>
  #include <sclp.h>
  #include <sie.h>
+#include <snippet.h>
static u8 *guest;
  static struct vm vm;
@@ -27,8 +28,8 @@ static uint8_t *src;
  static uint8_t *dst;
  static uint8_t *cmp;
-extern const char _binary_s390x_snippets_c_mvpg_snippet_gbin_start[];
-extern const char _binary_s390x_snippets_c_mvpg_snippet_gbin_end[];
+extern const char SNIPPET_NAME_START(c, mvpg_snippet)[];
+extern const char SNIPPET_NAME_END(c, mvpg_snippet)[];
  int binary_size;
static void test_mvpg_pei(void)
@@ -77,10 +78,9 @@ static void test_mvpg_pei(void)
static void test_mvpg(void)
  {
-	int binary_size = ((uintptr_t)_binary_s390x_snippets_c_mvpg_snippet_gbin_end -
-			   (uintptr_t)_binary_s390x_snippets_c_mvpg_snippet_gbin_start);
+	int binary_size = SNIPPET_LEN(c, mvpg_snippet);
- memcpy(guest, _binary_s390x_snippets_c_mvpg_snippet_gbin_start, binary_size);
+	memcpy(guest, SNIPPET_NAME_START(c, mvpg_snippet), binary_size);
  	memset(src, 0x42, PAGE_SIZE);
  	memset(dst, 0x43, PAGE_SIZE);
  	sie(&vm);
@@ -96,8 +96,7 @@ static void setup_guest(void)
sie_guest_create(&vm, (uint64_t)guest, HPAGE_SIZE); - vm.sblk->gpsw.addr = PAGE_SIZE * 4;
-	vm.sblk->gpsw.mask = PSW_MASK_64;
+	vm.sblk->gpsw = snippet_c_psw;
  	vm.sblk->ictl = ICTL_OPEREXC | ICTL_PINT;
  	/* Enable MVPG interpretation as we want to test KVM and not ourselves */
  	vm.sblk->eca = ECA_MVPGI;





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux