xref: /openbmc/qemu/tests/tcg/s390x/sam.S (revision 3db629f03e8caf39526cd0415dac16a6a6484107)
1 /* DAT on, home-space mode, 64-bit mode */
2 #define DAT_PSWM 0x400c00180000000
3 #define VIRTUAL_BASE 0x123456789abcd000
4 
5     .org 0x8e
6 program_interruption_code:
7     .org 0x150
8 program_old_psw:
9     .org 0x1d0                         /* program new PSW */
10     .quad 0,pgm_handler
11     .org 0x200                         /* lowcore padding */
12 
13     .globl _start
14 _start:
15     lctlg %c13,%c13,hasce
16     lpswe dat_psw
17 start_dat:
18     sam24
19 sam24_suppressed:
20     /* sam24 should fail */
21 fail:
22     basr %r12,%r0
23     lpswe failure_psw-.(%r12)
24 pgm_handler:
25     chhsi program_interruption_code,6  /* specification exception? */
26     jne fail
27     clc suppressed_psw(16),program_old_psw  /* correct location? */
28     jne fail
29     lpswe success_psw
30 
31     .align 8
32 dat_psw:
33     .quad DAT_PSWM,VIRTUAL_BASE+start_dat
34 suppressed_psw:
35     .quad DAT_PSWM,VIRTUAL_BASE+sam24_suppressed
36 success_psw:
37     .quad 0x2000000000000,0xfff        /* see is_special_wait_psw() */
38 failure_psw:
39     .quad 0x2000000000000,0            /* disabled wait */
40 hasce:
41     /* DT = 0b11 (region-first-table), TL = 3 (2k entries) */
42     .quad region_first_table + (3 << 2) + 3
43     .align 0x1000
44 region_first_table:
45     .org region_first_table + ((VIRTUAL_BASE >> 53) & 0x7ff) * 8
46     /* TT = 0b11 (region-first-table), TL = 3 (2k entries) */
47     .quad region_second_table + (3 << 2) + 3
48     .org region_first_table + 0x800 * 8
49 region_second_table:
50     .org region_second_table + ((VIRTUAL_BASE >> 42) & 0x7ff) * 8
51     /* TT = 0b10 (region-second-table), TL = 3 (2k entries) */
52     .quad region_third_table + (2 << 2) + 3
53     .org region_second_table + 0x800 * 8
54 region_third_table:
55     .org region_third_table + ((VIRTUAL_BASE >> 31) & 0x7ff) * 8
56     /* TT = 0b01 (region-third-table), TL = 3 (2k entries) */
57     .quad segment_table + (1 << 2) + 3
58     .org region_third_table + 0x800 * 8
59 segment_table:
60     .org segment_table + ((VIRTUAL_BASE >> 20) & 0x7ff) * 8
61     /* TT = 0b00 (segment-table) */
62     .quad page_table
63     .org segment_table + 0x800 * 8
64 page_table:
65     .org page_table + ((VIRTUAL_BASE >> 12) & 0xff) * 8
66     .quad 0
67     .org page_table + 0x100 * 8
68