2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-20 19:23:57 +08:00

s390: move sys_call_table and last_break from thread_info to thread_struct

Move the last two architecture specific fields from the thread_info
structure to the thread_struct. All that is left in thread_info is
the flags field.

Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Martin Schwidefsky 2016-11-08 12:33:38 +01:00
parent 90c53e6580
commit ef280c859f
8 changed files with 33 additions and 21 deletions

View File

@ -193,7 +193,7 @@ extern char elf_platform[];
do { \ do { \
set_personality(PER_LINUX | \ set_personality(PER_LINUX | \
(current->personality & (~PER_MASK))); \ (current->personality & (~PER_MASK))); \
current_thread_info()->sys_call_table = \ current->thread.sys_call_table = \
(unsigned long) &sys_call_table; \ (unsigned long) &sys_call_table; \
} while (0) } while (0)
#else /* CONFIG_COMPAT */ #else /* CONFIG_COMPAT */
@ -204,11 +204,11 @@ do { \
(current->personality & ~PER_MASK)); \ (current->personality & ~PER_MASK)); \
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) { \ if ((ex).e_ident[EI_CLASS] == ELFCLASS32) { \
set_thread_flag(TIF_31BIT); \ set_thread_flag(TIF_31BIT); \
current_thread_info()->sys_call_table = \ current->thread.sys_call_table = \
(unsigned long) &sys_call_table_emu; \ (unsigned long) &sys_call_table_emu; \
} else { \ } else { \
clear_thread_flag(TIF_31BIT); \ clear_thread_flag(TIF_31BIT); \
current_thread_info()->sys_call_table = \ current->thread.sys_call_table = \
(unsigned long) &sys_call_table; \ (unsigned long) &sys_call_table; \
} \ } \
} while (0) } while (0)

View File

@ -112,6 +112,7 @@ struct thread_struct {
unsigned long ksp; /* kernel stack pointer */ unsigned long ksp; /* kernel stack pointer */
unsigned long user_timer; /* task cputime in user space */ unsigned long user_timer; /* task cputime in user space */
unsigned long system_timer; /* task cputime in kernel space */ unsigned long system_timer; /* task cputime in kernel space */
unsigned long sys_call_table; /* system call table address */
mm_segment_t mm_segment; mm_segment_t mm_segment;
unsigned long gmap_addr; /* address of last gmap fault. */ unsigned long gmap_addr; /* address of last gmap fault. */
unsigned int gmap_write_flag; /* gmap fault write indication */ unsigned int gmap_write_flag; /* gmap fault write indication */
@ -122,6 +123,7 @@ struct thread_struct {
struct per_event per_event; /* Cause of the last PER trap */ struct per_event per_event; /* Cause of the last PER trap */
unsigned long per_flags; /* Flags to control debug behavior */ unsigned long per_flags; /* Flags to control debug behavior */
unsigned int system_call; /* system call number in signal */ unsigned int system_call; /* system call number in signal */
unsigned long last_break; /* last breaking-event-address. */
/* pfault_wait is used to block the process on a pfault event */ /* pfault_wait is used to block the process on a pfault event */
unsigned long pfault_wait; unsigned long pfault_wait;
struct list_head list; struct list_head list;

View File

@ -31,8 +31,6 @@
*/ */
struct thread_info { struct thread_info {
unsigned long flags; /* low level flags */ unsigned long flags; /* low level flags */
unsigned long sys_call_table; /* System call table address */
unsigned long last_break; /* last breaking-event-address. */
}; };
/* /*

View File

@ -31,6 +31,8 @@ int main(void)
BLANK(); BLANK();
/* thread struct offsets */ /* thread struct offsets */
OFFSET(__THREAD_ksp, thread_struct, ksp); OFFSET(__THREAD_ksp, thread_struct, ksp);
OFFSET(__THREAD_sysc_table, thread_struct, sys_call_table);
OFFSET(__THREAD_last_break, thread_struct, last_break);
OFFSET(__THREAD_FPU_fpc, thread_struct, fpu.fpc); OFFSET(__THREAD_FPU_fpc, thread_struct, fpu.fpc);
OFFSET(__THREAD_FPU_regs, thread_struct, fpu.regs); OFFSET(__THREAD_FPU_regs, thread_struct, fpu.regs);
OFFSET(__THREAD_per_cause, thread_struct, per_event.cause); OFFSET(__THREAD_per_cause, thread_struct, per_event.cause);
@ -40,8 +42,6 @@ int main(void)
BLANK(); BLANK();
/* thread info offsets */ /* thread info offsets */
OFFSET(__TI_flags, task_struct, thread_info.flags); OFFSET(__TI_flags, task_struct, thread_info.flags);
OFFSET(__TI_sysc_table, task_struct, thread_info.sys_call_table);
OFFSET(__TI_last_break, task_struct, thread_info.last_break);
BLANK(); BLANK();
/* pt_regs offsets */ /* pt_regs offsets */
OFFSET(__PT_ARGS, pt_regs, args); OFFSET(__PT_ARGS, pt_regs, args);

View File

@ -446,7 +446,7 @@ static int setup_frame32(struct ksignal *ksig, sigset_t *set,
/* set extra registers only for synchronous signals */ /* set extra registers only for synchronous signals */
regs->gprs[4] = regs->int_code & 127; regs->gprs[4] = regs->int_code & 127;
regs->gprs[5] = regs->int_parm_long; regs->gprs[5] = regs->int_parm_long;
regs->gprs[6] = task_thread_info(current)->last_break; regs->gprs[6] = current->thread.last_break;
} }
return 0; return 0;
@ -523,7 +523,7 @@ static int setup_rt_frame32(struct ksignal *ksig, sigset_t *set,
regs->gprs[2] = ksig->sig; regs->gprs[2] = ksig->sig;
regs->gprs[3] = (__force __u64) &frame->info; regs->gprs[3] = (__force __u64) &frame->info;
regs->gprs[4] = (__force __u64) &frame->uc; regs->gprs[4] = (__force __u64) &frame->uc;
regs->gprs[5] = task_thread_info(current)->last_break; regs->gprs[5] = current->thread.last_break;
return 0; return 0;
} }

View File

@ -124,7 +124,12 @@ _PIF_WORK = (_PIF_PER_TRAP)
.macro LAST_BREAK scratch .macro LAST_BREAK scratch
srag \scratch,%r10,23 srag \scratch,%r10,23
jz .+10 jz .+10
stg %r10,__TI_last_break(%r12) #ifdef CONFIG_HAVE_MARCH_Z990_FEATURES
stg %r10,__TASK_thread+__THREAD_last_break(%r12)
#else
lghi \scratch,__TASK_thread
stg %r10,__THREAD_last_break(\scratch,%r12)
#endif
.endm .endm
.macro REENABLE_IRQS .macro REENABLE_IRQS
@ -287,7 +292,13 @@ ENTRY(system_call)
mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC
stg %r14,__PT_FLAGS(%r11) stg %r14,__PT_FLAGS(%r11)
.Lsysc_do_svc: .Lsysc_do_svc:
lg %r10,__TI_sysc_table(%r12) # address of system call table # load address of system call table
#ifdef CONFIG_HAVE_MARCH_Z990_FEATURES
lg %r10,__TASK_thread+__THREAD_sysc_table(%r12)
#else
lghi %r13,__TASK_thread
lg %r10,__THREAD_sysc_table(%r13,%r12)
#endif
llgh %r8,__PT_INT_CODE+2(%r11) llgh %r8,__PT_INT_CODE+2(%r11)
slag %r8,%r8,2 # shift and test for svc 0 slag %r8,%r8,2 # shift and test for svc 0
jnz .Lsysc_nr_ok jnz .Lsysc_nr_ok
@ -388,7 +399,6 @@ ENTRY(system_call)
TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL TSTMSK __PT_FLAGS(%r11),_PIF_SYSCALL
jno .Lsysc_return jno .Lsysc_return
lmg %r2,%r7,__PT_R2(%r11) # load svc arguments lmg %r2,%r7,__PT_R2(%r11) # load svc arguments
lg %r10,__TI_sysc_table(%r12) # address of system call table
lghi %r8,0 # svc 0 returns -ENOSYS lghi %r8,0 # svc 0 returns -ENOSYS
llgh %r1,__PT_INT_CODE+2(%r11) # load new svc number llgh %r1,__PT_INT_CODE+2(%r11) # load new svc number
cghi %r1,NR_syscalls cghi %r1,NR_syscalls
@ -1084,7 +1094,7 @@ cleanup_critical:
jhe 0f jhe 0f
# set up saved registers r10 and r12 # set up saved registers r10 and r12
stg %r10,16(%r11) # r10 last break stg %r10,16(%r11) # r10 last break
stg %r12,32(%r11) # r12 thread-info pointer stg %r12,32(%r11) # r12 task struct pointer
0: # check if the user time update has been done 0: # check if the user time update has been done
clg %r9,BASED(.Lcleanup_system_call_insn+24) clg %r9,BASED(.Lcleanup_system_call_insn+24)
jh 0f jh 0f
@ -1105,7 +1115,9 @@ cleanup_critical:
lg %r9,16(%r11) lg %r9,16(%r11)
srag %r9,%r9,23 srag %r9,%r9,23
jz 0f jz 0f
mvc __TI_last_break(8,%r12),16(%r11) lgr %r9,%r12
aghi %r9,__TASK_thread
mvc __THREAD_last_break(8,%r9),16(%r11)
0: # set up saved register r11 0: # set up saved register r11
lg %r15,__LC_KERNEL_STACK lg %r15,__LC_KERNEL_STACK
la %r9,STACK_FRAME_OVERHEAD(%r15) la %r9,STACK_FRAME_OVERHEAD(%r15)

View File

@ -461,7 +461,7 @@ long arch_ptrace(struct task_struct *child, long request,
} }
return 0; return 0;
case PTRACE_GET_LAST_BREAK: case PTRACE_GET_LAST_BREAK:
put_user(task_thread_info(child)->last_break, put_user(child->thread.last_break,
(unsigned long __user *) data); (unsigned long __user *) data);
return 0; return 0;
case PTRACE_ENABLE_TE: case PTRACE_ENABLE_TE:
@ -811,7 +811,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
} }
return 0; return 0;
case PTRACE_GET_LAST_BREAK: case PTRACE_GET_LAST_BREAK:
put_user(task_thread_info(child)->last_break, put_user(child->thread.last_break,
(unsigned int __user *) data); (unsigned int __user *) data);
return 0; return 0;
} }
@ -997,10 +997,10 @@ static int s390_last_break_get(struct task_struct *target,
if (count > 0) { if (count > 0) {
if (kbuf) { if (kbuf) {
unsigned long *k = kbuf; unsigned long *k = kbuf;
*k = task_thread_info(target)->last_break; *k = target->thread.last_break;
} else { } else {
unsigned long __user *u = ubuf; unsigned long __user *u = ubuf;
if (__put_user(task_thread_info(target)->last_break, u)) if (__put_user(target->thread.last_break, u))
return -EFAULT; return -EFAULT;
} }
} }
@ -1327,7 +1327,7 @@ static int s390_compat_last_break_get(struct task_struct *target,
compat_ulong_t last_break; compat_ulong_t last_break;
if (count > 0) { if (count > 0) {
last_break = task_thread_info(target)->last_break; last_break = target->thread.last_break;
if (kbuf) { if (kbuf) {
unsigned long *k = kbuf; unsigned long *k = kbuf;
*k = last_break; *k = last_break;

View File

@ -359,7 +359,7 @@ static int setup_frame(int sig, struct k_sigaction *ka,
/* set extra registers only for synchronous signals */ /* set extra registers only for synchronous signals */
regs->gprs[4] = regs->int_code & 127; regs->gprs[4] = regs->int_code & 127;
regs->gprs[5] = regs->int_parm_long; regs->gprs[5] = regs->int_parm_long;
regs->gprs[6] = task_thread_info(current)->last_break; regs->gprs[6] = current->thread.last_break;
} }
return 0; return 0;
} }
@ -430,7 +430,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
regs->gprs[2] = ksig->sig; regs->gprs[2] = ksig->sig;
regs->gprs[3] = (unsigned long) &frame->info; regs->gprs[3] = (unsigned long) &frame->info;
regs->gprs[4] = (unsigned long) &frame->uc; regs->gprs[4] = (unsigned long) &frame->uc;
regs->gprs[5] = task_thread_info(current)->last_break; regs->gprs[5] = current->thread.last_break;
return 0; return 0;
} }