-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tests/tcg/s390x: Test MVCRL with a large value in R0
Add a small test to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: David Hildenbrand <david@redhat.com> Message-Id: <20230704081506.276055-13-iii@linux.ibm.com> [thuth: Apply fix for compiling with GCC 11] Signed-off-by: Thomas Huth <thuth@redhat.com>
- Loading branch information
Showing
1 changed file
with
36 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,55 @@ | ||
#include <stdbool.h> | ||
#include <stdint.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
|
||
|
||
static inline void mvcrl_8(const char *dst, const char *src) | ||
static void mvcrl(const char *dst, const char *src, size_t len) | ||
{ | ||
register long r0 asm("r0") = len; | ||
|
||
asm volatile ( | ||
"llill %%r0, 8\n" | ||
".insn sse, 0xE50A00000000, 0(%[dst]), 0(%[src])" | ||
: : [dst] "d" (dst), [src] "d" (src) | ||
: "r0", "memory"); | ||
: : [dst] "d" (dst), [src] "d" (src), "r" (r0) | ||
: "memory"); | ||
} | ||
|
||
|
||
int main(int argc, char *argv[]) | ||
static bool test(void) | ||
{ | ||
const char *alpha = "abcdefghijklmnop"; | ||
|
||
/* array missing 'i' */ | ||
char tstr[17] = "abcdefghjklmnop\0" ; | ||
char tstr[17] = "abcdefghjklmnop\0"; | ||
|
||
/* mvcrl reference use: 'open a hole in an array' */ | ||
mvcrl_8(tstr + 9, tstr + 8); | ||
mvcrl(tstr + 9, tstr + 8, 8); | ||
|
||
/* place missing 'i' */ | ||
tstr[8] = 'i'; | ||
|
||
return strncmp(alpha, tstr, 16ul); | ||
return strncmp(alpha, tstr, 16ul) == 0; | ||
} | ||
|
||
static bool test_bad_r0(void) | ||
{ | ||
char src[256] = { 0 }; | ||
|
||
/* | ||
* PoP says: Bits 32-55 of general register 0 should contain zeros; | ||
* otherwise, the program may not operate compatibly in the future. | ||
* | ||
* Try it anyway in order to check whether this would crash QEMU itself. | ||
*/ | ||
mvcrl(src, src, (size_t)-1); | ||
|
||
return true; | ||
} | ||
|
||
int main(void) | ||
{ | ||
bool ok = true; | ||
|
||
ok &= test(); | ||
ok &= test_bad_r0(); | ||
|
||
return ok ? EXIT_SUCCESS : EXIT_FAILURE; | ||
} |