xref: /kvm-unit-tests/lib/s390x/snippet.h (revision da96771e2ccaf9dfcb01e8c6340f9724cad649ea)
1*da96771eSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */
2*da96771eSJanosch Frank /*
3*da96771eSJanosch Frank  * Snippet definitions
4*da96771eSJanosch Frank  *
5*da96771eSJanosch Frank  * Copyright IBM Corp. 2021
6*da96771eSJanosch Frank  * Author: Janosch Frank <frankja@linux.ibm.com>
7*da96771eSJanosch Frank  */
8*da96771eSJanosch Frank 
9*da96771eSJanosch Frank #ifndef _S390X_SNIPPET_H_
10*da96771eSJanosch Frank #define _S390X_SNIPPET_H_
11*da96771eSJanosch Frank 
12*da96771eSJanosch Frank /* This macro cuts down the length of the pointers to snippets */
13*da96771eSJanosch Frank #define SNIPPET_NAME_START(type, file) \
14*da96771eSJanosch Frank 	_binary_s390x_snippets_##type##_##file##_gbin_start
15*da96771eSJanosch Frank #define SNIPPET_NAME_END(type, file) \
16*da96771eSJanosch Frank 	_binary_s390x_snippets_##type##_##file##_gbin_end
17*da96771eSJanosch Frank 
18*da96771eSJanosch Frank /* Returns the length of the snippet */
19*da96771eSJanosch Frank #define SNIPPET_LEN(type, file) \
20*da96771eSJanosch Frank 	((uintptr_t)SNIPPET_NAME_END(type, file) - (uintptr_t)SNIPPET_NAME_START(type, file))
21*da96771eSJanosch Frank 
22*da96771eSJanosch Frank /*
23*da96771eSJanosch Frank  * C snippet instructions start at 0x4000 due to the prefix and the
24*da96771eSJanosch Frank  * stack being before that. ASM snippets don't strictly need a stack
25*da96771eSJanosch Frank  * but keeping the starting address the same means less code.
26*da96771eSJanosch Frank  */
27*da96771eSJanosch Frank #define SNIPPET_ENTRY_ADDR 0x4000
28*da96771eSJanosch Frank 
29*da96771eSJanosch Frank /* Standard entry PSWs for snippets which can simply be copied into the guest PSW */
30*da96771eSJanosch Frank static const struct psw snippet_psw = {
31*da96771eSJanosch Frank 	.mask = PSW_MASK_64,
32*da96771eSJanosch Frank 	.addr = SNIPPET_ENTRY_ADDR,
33*da96771eSJanosch Frank };
34*da96771eSJanosch Frank #endif
35