0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _ASM_S390_LOWCORE_H
0010 #define _ASM_S390_LOWCORE_H
0011
0012 #include <linux/types.h>
0013 #include <asm/ptrace.h>
0014 #include <asm/cpu.h>
0015 #include <asm/types.h>
0016
0017 #define LC_ORDER 1
0018 #define LC_PAGES 2
0019
0020 struct pgm_tdb {
0021 u64 data[32];
0022 };
0023
0024 struct lowcore {
0025 __u8 pad_0x0000[0x0014-0x0000];
0026 __u32 ipl_parmblock_ptr;
0027 __u8 pad_0x0018[0x0080-0x0018];
0028 __u32 ext_params;
0029 union {
0030 struct {
0031 __u16 ext_cpu_addr;
0032 __u16 ext_int_code;
0033 };
0034 __u32 ext_int_code_addr;
0035 };
0036 __u32 svc_int_code;
0037 union {
0038 struct {
0039 __u16 pgm_ilc;
0040 __u16 pgm_code;
0041 };
0042 __u32 pgm_int_code;
0043 };
0044 __u32 data_exc_code;
0045 __u16 mon_class_num;
0046 union {
0047 struct {
0048 __u8 per_code;
0049 __u8 per_atmid;
0050 };
0051 __u16 per_code_combined;
0052 };
0053 __u64 per_address;
0054 __u8 exc_access_id;
0055 __u8 per_access_id;
0056 __u8 op_access_id;
0057 __u8 ar_mode_id;
0058 __u8 pad_0x00a4[0x00a8-0x00a4];
0059 __u64 trans_exc_code;
0060 __u64 monitor_code;
0061 union {
0062 struct {
0063 __u16 subchannel_id;
0064 __u16 subchannel_nr;
0065 __u32 io_int_parm;
0066 __u32 io_int_word;
0067 };
0068 struct tpi_info tpi_info;
0069 };
0070 __u8 pad_0x00c4[0x00c8-0x00c4];
0071 __u32 stfl_fac_list;
0072 __u8 pad_0x00cc[0x00e8-0x00cc];
0073 __u64 mcck_interruption_code;
0074 __u8 pad_0x00f0[0x00f4-0x00f0];
0075 __u32 external_damage_code;
0076 __u64 failing_storage_address;
0077 __u8 pad_0x0100[0x0110-0x0100];
0078 __u64 pgm_last_break;
0079 __u8 pad_0x0118[0x0120-0x0118];
0080 psw_t restart_old_psw;
0081 psw_t external_old_psw;
0082 psw_t svc_old_psw;
0083 psw_t program_old_psw;
0084 psw_t mcck_old_psw;
0085 psw_t io_old_psw;
0086 __u8 pad_0x0180[0x01a0-0x0180];
0087 psw_t restart_psw;
0088 psw_t external_new_psw;
0089 psw_t svc_new_psw;
0090 psw_t program_new_psw;
0091 psw_t mcck_new_psw;
0092 psw_t io_new_psw;
0093
0094
0095 __u64 save_area_sync[8];
0096 __u64 save_area_async[8];
0097 __u64 save_area_restart[1];
0098
0099
0100 __u64 cpu_flags;
0101
0102
0103 psw_t return_psw;
0104 psw_t return_mcck_psw;
0105
0106 __u64 last_break;
0107
0108
0109 __u64 sys_enter_timer;
0110 __u64 mcck_enter_timer;
0111 __u64 exit_timer;
0112 __u64 user_timer;
0113 __u64 guest_timer;
0114 __u64 system_timer;
0115 __u64 hardirq_timer;
0116 __u64 softirq_timer;
0117 __u64 steal_timer;
0118 __u64 avg_steal_timer;
0119 __u64 last_update_timer;
0120 __u64 last_update_clock;
0121 __u64 int_clock;
0122 __u64 mcck_clock;
0123 __u64 clock_comparator;
0124 __u64 boot_clock[2];
0125
0126
0127 __u64 current_task;
0128 __u64 kernel_stack;
0129
0130
0131 __u64 async_stack;
0132 __u64 nodat_stack;
0133 __u64 restart_stack;
0134 __u64 mcck_stack;
0135
0136 __u64 restart_fn;
0137 __u64 restart_data;
0138 __u32 restart_source;
0139 __u32 restart_flags;
0140
0141
0142 __u64 kernel_asce;
0143 __u64 user_asce;
0144
0145
0146
0147
0148
0149
0150 __u32 lpp;
0151 __u32 current_pid;
0152
0153
0154 __u32 cpu_nr;
0155 __u32 softirq_pending;
0156 __s32 preempt_count;
0157 __u32 spinlock_lockval;
0158 __u32 spinlock_index;
0159 __u32 fpu_flags;
0160 __u64 percpu_offset;
0161 __u8 pad_0x03c0[0x03c8-0x03c0];
0162 __u64 machine_flags;
0163 __u64 gmap;
0164 __u8 pad_0x03d8[0x0400-0x03d8];
0165
0166 __u32 return_lpswe;
0167 __u32 return_mcck_lpswe;
0168 __u8 pad_0x040a[0x0e00-0x0408];
0169
0170
0171
0172
0173
0174
0175 __u64 ipib;
0176 __u32 ipib_checksum;
0177 __u64 vmcore_info;
0178 __u8 pad_0x0e14[0x0e18-0x0e14];
0179 __u64 os_info;
0180 __u8 pad_0x0e20[0x11b0-0x0e20];
0181
0182
0183 __u64 mcesad;
0184
0185
0186 __u64 ext_params2;
0187 __u8 pad_0x11c0[0x1200-0x11C0];
0188
0189
0190 __u64 floating_pt_save_area[16];
0191 __u64 gpregs_save_area[16];
0192 psw_t psw_save_area;
0193 __u8 pad_0x1310[0x1318-0x1310];
0194 __u32 prefixreg_save_area;
0195 __u32 fpt_creg_save_area;
0196 __u8 pad_0x1320[0x1324-0x1320];
0197 __u32 tod_progreg_save_area;
0198 __u32 cpu_timer_save_area[2];
0199 __u32 clock_comp_save_area[2];
0200 __u64 last_break_save_area;
0201 __u32 access_regs_save_area[16];
0202 __u64 cregs_save_area[16];
0203 __u8 pad_0x1400[0x1500-0x1400];
0204
0205 __u64 ccd;
0206 __u8 pad_0x1508[0x1800-0x1508];
0207
0208
0209 struct pgm_tdb pgm_tdb;
0210 __u8 pad_0x1900[0x2000-0x1900];
0211 } __packed __aligned(8192);
0212
0213 #define S390_lowcore (*((struct lowcore *) 0))
0214
0215 extern struct lowcore *lowcore_ptr[];
0216
0217 static inline void set_prefix(__u32 address)
0218 {
0219 asm volatile("spx %0" : : "Q" (address) : "memory");
0220 }
0221
0222 static inline __u32 store_prefix(void)
0223 {
0224 __u32 address;
0225
0226 asm volatile("stpx %0" : "=Q" (address));
0227 return address;
0228 }
0229
0230 #endif