|
1 #ifndef __SPARC_ARCH_H__ |
|
2 #define __SPARC_ARCH_H__ |
|
3 |
|
4 #define SPARCV9_TICK_PRIVILEGED (1<<0) |
|
5 #define SPARCV9_PREFER_FPU (1<<1) |
|
6 #define SPARCV9_VIS1 (1<<2) |
|
7 #define SPARCV9_VIS2 (1<<3) /* reserved */ |
|
8 #define SPARCV9_FMADD (1<<4) /* reserved for SPARC64 V */ |
|
9 #define SPARCV9_BLK (1<<5) /* VIS1 block copy */ |
|
10 #define SPARCV9_VIS3 (1<<6) |
|
11 #define SPARCV9_RANDOM (1<<7) |
|
12 |
|
13 /* |
|
14 * OPENSSL_sparcv9cap_P[1] is copy of Compatibility Feature Register, |
|
15 * %asr26, SPARC-T4 and later. There is no SPARCV9_CFR bit in |
|
16 * OPENSSL_sparcv9cap_P[0], as %cfr copy is sufficient... |
|
17 */ |
|
18 #define CFR_AES 0x00000001 /* Supports AES opcodes */ |
|
19 #define CFR_DES 0x00000002 /* Supports DES opcodes */ |
|
20 #define CFR_KASUMI 0x00000004 /* Supports KASUMI opcodes */ |
|
21 #define CFR_CAMELLIA 0x00000008 /* Supports CAMELLIA opcodes*/ |
|
22 #define CFR_MD5 0x00000010 /* Supports MD5 opcodes */ |
|
23 #define CFR_SHA1 0x00000020 /* Supports SHA1 opcodes */ |
|
24 #define CFR_SHA256 0x00000040 /* Supports SHA256 opcodes */ |
|
25 #define CFR_SHA512 0x00000080 /* Supports SHA512 opcodes */ |
|
26 #define CFR_MPMUL 0x00000100 /* Supports MPMUL opcodes */ |
|
27 #define CFR_MONTMUL 0x00000200 /* Supports MONTMUL opcodes */ |
|
28 #define CFR_MONTSQR 0x00000400 /* Supports MONTSQR opcodes */ |
|
29 #define CFR_CRC32C 0x00000800 /* Supports CRC32C opcodes */ |
|
30 |
|
31 #if defined(OPENSSL_PIC) && !defined(__PIC__) |
|
32 # define __PIC__ |
|
33 #endif |
|
34 |
|
35 #define SPARC_PIC_THUNK(reg) \ |
|
36 .align 32; \ |
|
37 .Lpic_thunk: \ |
|
38 jmp %o7 + 8; \ |
|
39 add %o7, reg, reg; |
|
40 |
|
41 #define SPARC_PIC_THUNK_CALL(reg) \ |
|
42 sethi %hi(_GLOBAL_OFFSET_TABLE_-4), reg; \ |
|
43 call .Lpic_thunk; \ |
|
44 or reg, %lo(_GLOBAL_OFFSET_TABLE_+4), reg; |
|
45 |
|
46 #if 1 |
|
47 # define SPARC_SETUP_GOT_REG(reg) SPARC_PIC_THUNK_CALL(reg) |
|
48 #else |
|
49 # define SPARC_SETUP_GOT_REG(reg) \ |
|
50 sethi %hi(_GLOBAL_OFFSET_TABLE_-4), reg; \ |
|
51 call .+8; \ |
|
52 or reg,%lo(_GLOBAL_OFFSET_TABLE_+4), reg; \ |
|
53 add %o7, reg, reg |
|
54 #endif |
|
55 |
|
56 #if (defined(__GNUC__) && defined(__arch64__)) || \ |
|
57 (defined(__SUNPRO_C) && defined(__sparcv9)) |
|
58 |
|
59 # define SPARC_LOAD_ADDRESS(SYM, reg) \ |
|
60 setx SYM, %o7, reg; |
|
61 # define LDPTR ldx |
|
62 |
|
63 #else |
|
64 |
|
65 # define SPARC_LOAD_ADDRESS(SYM, reg) \ |
|
66 set SYM, reg; |
|
67 # define LDPTR ld |
|
68 # define SPARC_LOAD_ADDRESS_LEAF(SYM,reg,tmp) SPARC_LOAD_ADDRESS(SYM,reg) |
|
69 |
|
70 #endif |
|
71 |
|
72 #ifdef __PIC__ |
|
73 # undef SPARC_LOAD_ADDRESS |
|
74 # undef SPARC_LOAD_ADDRESS_LEAF |
|
75 # define SPARC_LOAD_ADDRESS(SYM, reg) \ |
|
76 SPARC_SETUP_GOT_REG(reg); \ |
|
77 sethi %hi(SYM), %o7; \ |
|
78 or %o7, %lo(SYM), %o7; \ |
|
79 LDPTR [reg + %o7], reg; |
|
80 #endif |
|
81 |
|
82 #ifndef SPARC_LOAD_ADDRESS_LEAF |
|
83 # define SPARC_LOAD_ADDRESS_LEAF(SYM, reg, tmp) \ |
|
84 mov %o7, tmp; \ |
|
85 SPARC_LOAD_ADDRESS(SYM, reg) \ |
|
86 mov tmp, %o7; |
|
87 #endif |
|
88 |
|
89 #endif /* __SPARC_ARCH_H__ */ |