Merge branch 'pr-2024-04-22' into 'master'
s390x: Improvement of CMM test, lot of small bugfixes and two refactorings
See merge request kvm-unit-tests/kvm-unit-tests!58
diff --git a/lib/s390x/asm/sigp.h b/lib/s390x/asm/sigp.h
index 61d2c62..c9af2c4 100644
--- a/lib/s390x/asm/sigp.h
+++ b/lib/s390x/asm/sigp.h
@@ -49,13 +49,17 @@
uint32_t *status)
{
register unsigned long reg1 asm ("1") = parm;
+ uint64_t bogus_cc = SIGP_CC_NOT_OPERATIONAL;
int cc;
asm volatile(
- " sigp %1,%2,0(%3)\n"
- " ipm %0\n"
- " srl %0,28\n"
- : "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc");
+ " tmll %[bogus_cc],3\n"
+ " sigp %[reg1],%[addr],0(%[order])\n"
+ " ipm %[cc]\n"
+ " srl %[cc],28\n"
+ : [cc] "=d" (cc), [reg1] "+d" (reg1)
+ : [addr] "d" (addr), [order] "a" (order), [bogus_cc] "d" (bogus_cc)
+ : "cc");
if (status)
*status = reg1;
return cc;
diff --git a/lib/s390x/asm/uv.h b/lib/s390x/asm/uv.h
index e9fb19a..611dcd3 100644
--- a/lib/s390x/asm/uv.h
+++ b/lib/s390x/asm/uv.h
@@ -216,14 +216,16 @@
static inline int uv_call_once(unsigned long r1, unsigned long r2)
{
+ uint64_t bogus_cc = 1;
int cc;
asm volatile(
+ " tmll %[bogus_cc],3\n"
"0: .insn rrf,0xB9A40000,%[r1],%[r2],0,0\n"
" ipm %[cc]\n"
" srl %[cc],28\n"
: [cc] "=d" (cc)
- : [r1] "a" (r1), [r2] "a" (r2)
+ : [r1] "a" (r1), [r2] "a" (r2), [bogus_cc] "d" (bogus_cc)
: "memory", "cc");
if (UVC_ERR_DEBUG && cc == 1)
diff --git a/lib/s390x/css.h b/lib/s390x/css.h
index 0a19324..504b3f1 100644
--- a/lib/s390x/css.h
+++ b/lib/s390x/css.h
@@ -147,14 +147,16 @@
static inline int stsch(unsigned long schid, struct schib *addr)
{
register unsigned long reg1 asm ("1") = schid;
+ uint64_t bogus_cc = 1;
int cc;
asm volatile(
+ " tmll %[bogus_cc],3\n"
" stsch 0(%3)\n"
" ipm %0\n"
" srl %0,28"
: "=d" (cc), "=m" (*addr)
- : "d" (reg1), "a" (addr)
+ : "d" (reg1), "a" (addr), [bogus_cc] "d" (bogus_cc)
: "cc");
return cc;
}
@@ -177,14 +179,16 @@
static inline int tsch(unsigned long schid, struct irb *addr)
{
register unsigned long reg1 asm ("1") = schid;
+ uint64_t bogus_cc = 2;
int cc;
asm volatile(
+ " tmll %[bogus_cc],3\n"
" tsch 0(%3)\n"
" ipm %0\n"
" srl %0,28"
: "=d" (cc), "=m" (*addr)
- : "d" (reg1), "a" (addr)
+ : "d" (reg1), "a" (addr), [bogus_cc] "d" (bogus_cc)
: "cc");
return cc;
}
@@ -252,28 +256,32 @@
static inline int rchp(unsigned long chpid)
{
register unsigned long reg1 asm("1") = chpid;
+ uint64_t bogus_cc = 1;
int cc;
asm volatile(
+ " tmll %[bogus_cc],3\n"
" rchp\n"
" ipm %0\n"
" srl %0,28"
: "=d" (cc)
- : "d" (reg1)
+ : "d" (reg1), [bogus_cc] "d" (bogus_cc)
: "cc");
return cc;
}
static inline int stcrw(uint32_t *crw)
{
+ uint64_t bogus_cc = 1;
int cc;
asm volatile(
+ " tmll %[bogus_cc],3\n"
" stcrw %[crw]\n"
" ipm %[cc]\n"
" srl %[cc],28"
: [cc] "=d" (cc)
- : [crw] "Q" (*crw)
+ : [crw] "Q" (*crw), [bogus_cc] "d" (bogus_cc)
: "cc", "memory");
return cc;
}
diff --git a/lib/s390x/uv.c b/lib/s390x/uv.c
index 23a8617..723bb4f 100644
--- a/lib/s390x/uv.c
+++ b/lib/s390x/uv.c
@@ -146,7 +146,7 @@
int cc;
uvcb_cgc.guest_stor_origin = vm->sblk->mso;
- uvcb_cgc.guest_stor_len = vm->sblk->msl;
+ uvcb_cgc.guest_stor_len = vm->sblk->msl - vm->sblk->mso + SZ_1M;
/* Config allocation */
vsize = uvcb_qui.conf_base_virt_stor_len +
diff --git a/s390x/Makefile b/s390x/Makefile
index ddc0969..8603a52 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -197,33 +197,27 @@
%.bin: %.elf
$(OBJCOPY) -O binary $< $@
-# Will only be filled when dump has been enabled
-GENPROTIMG_COMM_KEY =
-# allow PCKMO
-genprotimg_pcf = 0x000000e0
-
-ifeq ($(CONFIG_DUMP),yes)
- # The genprotimg arguments for the cck changed over time so we need to
- # figure out which argument to use in order to set the cck
- GENPROTIMG_HAS_COMM_KEY = $(shell $(GENPROTIMG) --help | grep -q -- --comm-key && echo yes)
- ifeq ($(GENPROTIMG_HAS_COMM_KEY),yes)
- GENPROTIMG_COMM_KEY = --comm-key $(comm-key)
- else
- GENPROTIMG_COMM_KEY = --x-comm-key $(comm-key)
- endif
-
- # allow dumping + PCKMO
- genprotimg_pcf = 0x200000e0
+# The genprotimg arguments for the cck changed over time so we need to
+# figure out which argument to use in order to set the cck
+GENPROTIMG_HAS_COMM_KEY = $(shell $(GENPROTIMG) --help | grep -q -- --comm-key && echo yes)
+ifeq ($(GENPROTIMG_HAS_COMM_KEY),yes)
+ GENPROTIMG_COMM_OPTION := --comm-key
+else
+ GENPROTIMG_COMM_OPTION := --x-comm-key
endif
-# use x-pcf to be compatible with old genprotimg versions
-genprotimg_args = --host-key-document $(HOST_KEY_DOCUMENT) --no-verify $(GENPROTIMG_COMM_KEY) --x-pcf $(genprotimg_pcf)
+ifeq ($(CONFIG_DUMP),yes)
+ # allow dumping + PCKMO
+ GENPROTIMG_PCF := 0x200000e0
+else
+ # allow PCKMO
+ GENPROTIMG_PCF := 0x000000e0
+endif
-%selftest.pv.bin: %selftest.bin $(HOST_KEY_DOCUMENT) $(patsubst %.pv.bin,%.parmfile,$@) $(comm-key)
- $(GENPROTIMG) $(genprotimg_args) --parmfile $(patsubst %.pv.bin,%.parmfile,$@) --image $< -o $@
-
+$(patsubst %.parmfile,%.pv.bin,$(wildcard s390x/*.parmfile)): %.pv.bin: %.parmfile
%.pv.bin: %.bin $(HOST_KEY_DOCUMENT) $(comm-key)
- $(GENPROTIMG) $(genprotimg_args) --image $< -o $@
+ $(eval parmfile_args = $(if $(filter %.parmfile,$^),--parmfile $(filter %.parmfile,$^),))
+ $(GENPROTIMG) --host-key-document $(HOST_KEY_DOCUMENT) --no-verify $(GENPROTIMG_COMM_OPTION) $(comm-key) --x-pcf $(GENPROTIMG_PCF) $(parmfile_args) --image $(filter %.bin,$^) -o $@
$(snippet_asmlib): $$(patsubst %.o,%.S,$$@) $(asm-offsets)
$(CC) $(CFLAGS) -c -nostdlib -o $@ $<
diff --git a/s390x/cmm.c b/s390x/cmm.c
index af85283..536f2bf 100644
--- a/s390x/cmm.c
+++ b/s390x/cmm.c
@@ -9,13 +9,17 @@
*/
#include <libcflat.h>
+#include <bitops.h>
#include <asm/asm-offsets.h>
#include <asm/interrupt.h>
#include <asm/page.h>
#include <asm/cmm.h>
+#include <asm/facility.h>
static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
+extern int diag308_load_reset(u64);
+
static void test_params(void)
{
report_prefix_push("invalid ORC 8");
@@ -35,6 +39,35 @@
report_prefix_pop();
}
+static void test_reset_no_translate(void)
+{
+ const uint64_t mask_no_translate = BIT(63 - 58);
+ unsigned long state;
+
+ if (!test_facility(147)) {
+ report_prefix_push("no-translate unavailable");
+ expect_pgm_int();
+ essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf);
+ check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
+ report_prefix_pop();
+ return;
+ }
+
+ report_prefix_push("reset no-translate");
+ essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf);
+
+ state = essa(ESSA_GET_STATE, (unsigned long)pagebuf);
+ report(state & mask_no_translate, "no-translate bit set before reset");
+
+ /* Load normal reset - includes subsystem reset */
+ diag308_load_reset(1);
+
+ state = essa(ESSA_GET_STATE, (unsigned long)pagebuf);
+ report(!(state & mask_no_translate), "no-translate bit unset after reset");
+
+ report_prefix_pop();
+}
+
int main(void)
{
bool has_essa = check_essa_available();
@@ -47,6 +80,7 @@
test_priv();
test_params();
+ test_reset_no_translate();
done:
report_prefix_pop();
return report_summary();
diff --git a/s390x/emulator.c b/s390x/emulator.c
index 2c42f96..5a5a3ed 100644
--- a/s390x/emulator.c
+++ b/s390x/emulator.c
@@ -130,8 +130,8 @@
report_skip("127 not invalid");
} else {
__test_cpacf(opcode, 127, 2, 4, 6);
+ check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
}
- check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
report_prefix_pop();
}
diff --git a/s390x/mvpg.c b/s390x/mvpg.c
index 296338d..62d42e3 100644
--- a/s390x/mvpg.c
+++ b/s390x/mvpg.c
@@ -40,12 +40,14 @@
static inline int mvpg(unsigned long r0, void *dest, void *src)
{
register unsigned long reg0 asm ("0") = r0;
+ uint64_t bogus_cc = 3;
int cc;
- asm volatile(" mvpg %1,%2\n"
+ asm volatile(" tmll %[bogus_cc],3\n"
+ " mvpg %1,%2\n"
" ipm %0\n"
" srl %0,28"
- : "=&d" (cc) : "a" (dest), "a" (src), "d" (reg0)
+ : "=&d" (cc) : "a" (dest), "a" (src), "d" (reg0), [bogus_cc] "d" (bogus_cc)
: "memory", "cc");
return cc;
}
diff --git a/s390x/run b/s390x/run
index e58fa4a..34552c2 100755
--- a/s390x/run
+++ b/s390x/run
@@ -21,12 +21,12 @@
return 1
}
-if is_pv && [ "$ACCEL" = "tcg" ]; then
+if is_pv "$@" && [ "$ACCEL" = "tcg" ]; then
echo "Protected Virtualization isn't supported under TCG"
exit 2
fi
-if is_pv && [ "$MIGRATION" = "yes" ]; then
+if is_pv "$@" && [ "$MIGRATION" = "yes" ]; then
echo "Migration isn't supported under Protected Virtualization"
exit 2
fi
@@ -34,12 +34,12 @@
M='-machine s390-ccw-virtio'
M+=",accel=$ACCEL$ACCEL_PROPS"
-if is_pv; then
+if is_pv "$@"; then
M+=",confidential-guest-support=pv0"
fi
command="$qemu -nodefaults -nographic $M"
-if is_pv; then
+if is_pv "$@"; then
command+=" -object s390-pv-guest,id=pv0"
fi
command+=" -chardev stdio,id=con0 -device sclpconsole,chardev=con0"
diff --git a/s390x/sclp.c b/s390x/sclp.c
index ccbaa91..53fce0c 100644
--- a/s390x/sclp.c
+++ b/s390x/sclp.c
@@ -399,6 +399,7 @@
static void test_instbits(void)
{
SCCBHeader *h = (SCCBHeader *)pagebuf;
+ uint64_t bogus_cc = 1;
int cc;
sclp_mark_busy();
@@ -406,10 +407,12 @@
sclp_setup_int();
asm volatile(
+ " tmll %[bogus_cc],3\n"
" .insn rre,0xb2204200,%1,%2\n" /* servc %1,%2 */
" ipm %0\n"
" srl %0,28"
- : "=&d" (cc) : "d" (valid_code), "a" (__pa(pagebuf))
+ : "=&d" (cc)
+ : "d" (valid_code), "a" (__pa(pagebuf)), [bogus_cc] "d" (bogus_cc)
: "cc", "memory");
/* No exception, but also no command accepted, so no interrupt is
* expected. We need to clear the flag manually otherwise we will
diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg
index 3fb9e87..3a9decc 100644
--- a/s390x/unittests.cfg
+++ b/s390x/unittests.cfg
@@ -389,3 +389,6 @@
[sie-dat]
file = sie-dat.elf
+
+[pv-attest]
+file = pv-attest.elf
diff --git a/scripts/s390x/func.bash b/scripts/s390x/func.bash
index 6c75e89..fa47d01 100644
--- a/scripts/s390x/func.bash
+++ b/scripts/s390x/func.bash
@@ -21,7 +21,7 @@
"$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel" "$timeout"
# run PV test case
- if [ "$ACCEL" = 'tcg' ] || grep -q "migration" <<< "$groups"; then
+ if [ "$accel" = 'tcg' ] || grep -q "migration" <<< "$groups"; then
return
fi
kernel=${kernel%.elf}.pv.bin