c578a620d925d87eca46a3709d5df296c5570654
[mono.git] / mono / utils / mono-hwcap-s390x.c
1 /*
2  * mono-hwcap-s390x.c: S/390x hardware feature detection
3  *
4  * Authors:
5  *    Alex Rønne Petersen (alexrp@xamarin.com)
6  *    Elijah Taylor (elijahtaylor@google.com)
7  *    Miguel de Icaza (miguel@xamarin.com)
8  *    Neale Ferguson (Neale.Ferguson@SoftwareAG-usa.com)
9  *    Paolo Molaro (lupus@xamarin.com)
10  *    Rodrigo Kumpera (kumpera@gmail.com)
11  *    Sebastien Pouliot (sebastien@xamarin.com)
12  *    Zoltan Varga (vargaz@xamarin.com)
13  *
14  * Copyright 2003 Ximian, Inc.
15  * Copyright 2003-2011 Novell, Inc
16  * Copyright 2006 Broadcom
17  * Copyright 2007-2008 Andreas Faerber
18  * Copyright 2011-2013 Xamarin Inc
19  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
20  */
21
22 #include "mono/utils/mono-hwcap.h"
23
24 #include <signal.h>
25
26 typedef struct {
27         uint8_t n3:1;           // 000 - N3 instructions
28         uint8_t zi:1;           // 001 - z/Arch installed
29         uint8_t za:1;           // 002 - z/Arch active
30         uint8_t date:1;         // 003 - DAT-enhancement
31         uint8_t idtes:1;        // 004 - IDTE-segment tables
32         uint8_t idter:1;        // 005 - IDTE-region tables
33         uint8_t asnlx:1;        // 006 - ASN-LX reuse
34         uint8_t stfle:1;        // 007 - STFLE
35         uint8_t edat1:1;        // 008 - EDAT 1
36         uint8_t srs:1;          // 009 - Sense-Running-Status
37         uint8_t csske:1;        // 010 - Conditional SSKE
38         uint8_t ctf:1;          // 011 - Configuration-topology
39         uint8_t ibm01:1;        // 012 - Assigned to IBM
40         uint8_t ipter:1;        // 013 - IPTE-range
41         uint8_t nqks:1;         // 014 - Nonquiescing key-setting
42         uint8_t ibm02:1;        // 015 - Assigned to IBM
43         uint8_t etf2:1;         // 016 - Extended translation 2
44         uint8_t msa:1;          // 017 - Message security assist 1
45         uint8_t ld:1;           // 018 - Long displacement
46         uint8_t ldh:1;          // 019 - Long displacement high perf
47         uint8_t mas:1;          // 020 - HFP multiply-add-subtract
48         uint8_t eif:1;          // 021 - Extended immediate
49         uint8_t etf3:1;         // 022 - Extended translation 3
50         uint8_t hux:1;          // 023 - HFP unnormalized extension
51         uint8_t etf2e:1;        // 024 - Extended translation enhanced 2
52         uint8_t stckf:1;        // 025 - Store clock fast
53         uint8_t pe:1;           // 026 - Parsing enhancement
54         uint8_t mvcos:1;        // 027 - Move with optional specs
55         uint8_t tods:1;         // 028 - TOD steering
56         uint8_t x000:1;         // 029 - Undefined
57         uint8_t etf3e:1;        // 030 - ETF3 enhancement
58         uint8_t ecput:1;        // 031 - Extract CPU time
59         uint8_t csst:1;         // 032 - Compare swap and store
60         uint8_t csst2:1;        // 033 - Compare swap and store 2
61         uint8_t gie:1;          // 034 - General instructions extension
62         uint8_t ee:1;           // 035 - Execute extensions
63         uint8_t em:1;           // 036 - Enhanced monitor
64         uint8_t fpe:1;          // 037 - Floating point extension
65         uint8_t x001:1;         // 038 - Undefined
66         uint8_t ibm03:1;        // 039 - Assigned to IBM
67         uint8_t spp:1;          // 040 - Set program parameters
68         uint8_t fpse:1;         // 041 - FP support enhancement
69         uint8_t dfp:1;          // 042 - DFP
70         uint8_t dfph:1;         // 043 - DFP high performance
71         uint8_t pfpo:1;         // 044 - PFPO instruction
72         uint8_t multi:1;        // 045 - Multiple inc load/store on CC 1
73         uint8_t ibm04:1;        // 046 - Assigned to IBM
74         uint8_t cmpsce:1;       // 047 - CMPSC enhancement
75         uint8_t dfpzc:1;        // 048 - DFP zoned conversion
76         uint8_t misc:1;         // 049 - Multiple inc load and trap
77         uint8_t ctx:1;          // 050 - Constrained transactional-execution
78         uint8_t ltlb:1;         // 051 - Local TLB clearing
79         uint8_t ia:1;           // 052 - Interlocked access
80         uint8_t lsoc2:1;        // 053 - Load/store on CC 2
81         uint8_t x002:1;         // 054 - Undefined
82         uint8_t ibm05:1;        // 055 - Assigned to IBM
83         uint8_t x003:1;         // 056 - Undefined
84         uint8_t msa5:1;         // 057 - Message security assist 5
85         uint8_t x004:1;         // 058 - Undefined
86         uint8_t x005:1;         // 059 - Undefined
87         uint8_t x006:1;         // 060 - Undefined
88         uint8_t x007:1;         // 061 - Undefined
89         uint8_t ibm06:1;        // 062 - Assigned to IBM
90         uint8_t x008:1;         // 063 - Undefined
91         uint8_t x009:1;         // 064 - Undefined
92         uint8_t ibm07:1;        // 065 - Assigned to IBM
93         uint8_t rrbm:1;         // 066 - Reset reference bits multiple
94         uint8_t cmc:1;          // 067 - CPU measurement counter
95         uint8_t cms:1;          // 068 - CPU Measurement sampling
96         uint8_t ibm08:1;        // 069 - Assigned to IBM
97         uint8_t ibm09:1;        // 070 - Assigned to IBM
98         uint8_t ibm10:1;        // 071 - Assigned to IBM
99         uint8_t ibm11:1;        // 072 - Assigned to IBM
100         uint8_t txe:1;          // 073 - Transactional execution
101         uint8_t sthy:1;         // 074 - Store hypervisor information
102         uint8_t aefsi:1;        // 075 - Access exception fetch/store indication
103         uint8_t msa3:1;         // 076 - Message security assist 3
104         uint8_t msa4:1;         // 077 - Message security assist 4
105         uint8_t edat2:1;        // 078 - Enhanced DAT 2
106         uint8_t x010:1;         // 079 - Undefined
107         uint8_t dfppc:1;        // 080 - DFP packed conversion
108         uint8_t x011:7;         // 081-87 - Undefined
109         uint8_t x012[5];        // 088-127 - Undefined
110         uint8_t ibm12:1;        // 128 - Assigned to IBM
111         uint8_t vec:1;          // 129 - Vector facility
112         uint8_t x013:6;         // 130-135 - Undefined
113         uint8_t x014:6;         // 136-141 - Undefined
114         uint8_t sccm:1;         // 142 - Store CPU counter multiple
115         uint8_t ibm13:1;        // 143 - Assigned to IBM
116         uint8_t x015[14];       // 144-256 Undefined
117 } __attribute__ ((packed)) __attribute__ ((aligned(8))) facilityList_t;
118
119 void
120 mono_hwcap_arch_init (void)
121 {
122         facilityList_t facs;
123         int lFacs = sizeof (facs) / 8;
124
125         __asm__ __volatile__ (
126                 "lgfr\t0,%1\n\t"
127                 ".insn\ts,0xb2b00000,%0\n\t"
128                 : "=m" (facs)
129                 : "r" (lFacs)
130                 : "0", "cc"
131         );
132
133         mono_hwcap_s390x_has_fpe = facs.fpe;
134         mono_hwcap_s390x_has_vec = facs.vec;
135 }