11 #ifndef __ASM_S390_PROCESSOR_H
12 #define __ASM_S390_PROCESSOR_H
16 #include <linux/linkage.h>
20 #include <asm/ptrace.h>
21 #include <asm/setup.h>
28 #define current_text_addr() ({ void *pc; asm("basr %0,0" : "=a" (pc)); pc; })
30 static inline void get_cpu_id(
struct cpuid *
ptr)
32 asm volatile(
"stidp %0" :
"=Q" (*ptr));
45 #define TASK_SIZE (1UL << 31)
46 #define TASK_UNMAPPED_BASE (1UL << 30)
50 #define TASK_SIZE_OF(tsk) ((tsk)->mm->context.asce_limit)
51 #define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \
52 (1UL << 30) : (1UL << 41))
53 #define TASK_SIZE TASK_SIZE_OF(current)
58 #define STACK_TOP (1UL << 31)
59 #define STACK_TOP_MAX (1UL << 31)
61 #define STACK_TOP (1UL << (test_thread_flag(TIF_31BIT) ? 31:42))
62 #define STACK_TOP_MAX (1UL << 42)
65 #define HAVE_ARCH_PICK_MMAP_LAYOUT
90 unsigned char trap_tdb[256];
94 #define PER_FLAG_NO_TE 1UL
112 unsigned long gprs[10];
117 #define ARCH_MIN_TASKALIGN 8
119 #define INIT_THREAD { \
120 .ksp = sizeof(init_stack) + (unsigned long) &init_stack, \
126 #define start_thread(regs, new_psw, new_stackp) do { \
127 regs->psw.mask = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA; \
128 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \
129 regs->gprs[15] = new_stackp; \
133 #define start_thread31(regs, new_psw, new_stackp) do { \
134 regs->psw.mask = psw_user_bits | PSW_MASK_BA; \
135 regs->psw.addr = new_psw | PSW_ADDR_AMODE; \
136 regs->gprs[15] = new_stackp; \
137 __tlb_flush_mm(current->mm); \
138 crst_table_downgrade(current->mm, 1UL << 31); \
139 update_mm(current->mm, current); \
167 #define task_pt_regs(tsk) ((struct pt_regs *) \
168 (task_stack_page(tsk) + THREAD_SIZE) - 1)
169 #define KSTK_EIP(tsk) (task_pt_regs(tsk)->psw.addr)
170 #define KSTK_ESP(tsk) (task_pt_regs(tsk)->gprs[15])
172 static inline unsigned short stap(
void)
174 unsigned short cpu_address;
176 asm volatile(
"stap %0" :
"=m" (cpu_address));
186 asm volatile(
"diag 0,0,68");
190 static inline void psw_set_key(
unsigned int key)
192 asm volatile(
"spka 0(%0)" : :
"d" (
key));
198 static inline void __load_psw(psw_t psw)
201 asm volatile(
"lpsw %0" : :
"Q" (psw) :
"cc");
203 asm volatile(
"lpswe %0" : :
"Q" (psw) :
"cc");
211 static inline void __load_psw_mask (
unsigned long mask)
222 " st %0,%O1+4(%R1)\n"
225 :
"=&d" (
addr),
"=Q" (psw) :
"Q" (psw) :
"memory",
"cc");
229 " stg %0,%O1+8(%R1)\n"
232 :
"=&d" (
addr),
"=Q" (psw) :
"Q" (psw) :
"memory",
"cc");
239 static inline unsigned long __rewind_psw(psw_t psw,
unsigned long ilc)
246 return (psw.addr - ilc) & ((1
UL << 24) - 1);
253 return (psw.addr - ilc) &
mask;
262 unsigned long ctl_buf;
285 " stctl 0,15,0x1c0\n"
289 :
"a" (&dw_psw),
"a" (&ctl_buf),
"m" (dw_psw) :
"cc");
299 " stam 0,15,0x340(1)\n"
317 " stmg 0,15,0x280(1)\n"
318 " stctg 0,15,0x380(1)\n"
319 " oi 0x384(1),0x10\n"
322 :
"a" (&dw_psw),
"a" (&ctl_buf),
"m" (dw_psw) :
"cc",
"0",
"1");
332 __set_psw_mask(
unsigned long mask)
337 #define local_mcck_enable() \
338 __set_psw_mask(psw_kernel_bits | PSW_MASK_DAT | PSW_MASK_MCHECK)
339 #define local_mcck_disable() \
340 __set_psw_mask(psw_kernel_bits | PSW_MASK_DAT)
350 extern void (*s390_base_mcck_handler_fn)(
void);
351 extern void (*s390_base_pgm_handler_fn)(
void);
352 extern void (*s390_base_ext_handler_fn)(
void);
354 #define ARCH_LOW_ADDRESS_LIMIT 0x7fffffffUL
359 #define mem_assign_absolute(dest, val) { \
360 __typeof__(dest) __tmp = (val); \
362 BUILD_BUG_ON(sizeof(__tmp) != sizeof(val)); \
363 memcpy_absolute(&(dest), &__tmp, sizeof(__tmp)); \
369 #define EX_TABLE(_fault, _target) \
370 ".section __ex_table,\"a\"\n" \
372 ".long (" #_fault ") - .\n" \
373 ".long (" #_target ") - .\n" \
378 #define EX_TABLE(_fault, _target) \
379 .section __ex_table,"a" ; \
381 .long (_fault) - . ; \
382 .long (_target) - . ; \