Commit d5c352cd authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390: move thread_info into task_struct

This is the s390 variant of commit 15f4eae7 ("x86: Move
thread_info into task_struct").
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent c360192b
...@@ -169,6 +169,7 @@ config S390 ...@@ -169,6 +169,7 @@ config S390
select OLD_SIGSUSPEND3 select OLD_SIGSUSPEND3
select SPARSE_IRQ select SPARSE_IRQ
select SYSCTL_EXCEPTION_TRACE select SYSCTL_EXCEPTION_TRACE
select THREAD_INFO_IN_TASK
select TTY select TTY
select VIRT_CPU_ACCOUNTING select VIRT_CPU_ACCOUNTING
select VIRT_TO_BUS select VIRT_TO_BUS
......
...@@ -95,7 +95,7 @@ struct lowcore { ...@@ -95,7 +95,7 @@ struct lowcore {
/* Current process. */ /* Current process. */
__u64 current_task; /* 0x0310 */ __u64 current_task; /* 0x0310 */
__u64 thread_info; /* 0x0318 */ __u8 pad_0x318[0x320-0x318]; /* 0x0318 */
__u64 kernel_stack; /* 0x0320 */ __u64 kernel_stack; /* 0x0320 */
/* Interrupt, panic and restart stack. */ /* Interrupt, panic and restart stack. */
......
...@@ -30,10 +30,8 @@ ...@@ -30,10 +30,8 @@
* - if the contents of this structure are changed, the assembly constants must also be changed * - if the contents of this structure are changed, the assembly constants must also be changed
*/ */
struct thread_info { struct thread_info {
struct task_struct *task; /* main task structure */
unsigned long flags; /* low level flags */ unsigned long flags; /* low level flags */
unsigned long sys_call_table; /* System call table address */ unsigned long sys_call_table; /* System call table address */
unsigned int cpu; /* current CPU */
unsigned int system_call; unsigned int system_call;
__u64 user_timer; __u64 user_timer;
__u64 system_timer; __u64 system_timer;
...@@ -45,20 +43,11 @@ struct thread_info { ...@@ -45,20 +43,11 @@ struct thread_info {
*/ */
#define INIT_THREAD_INFO(tsk) \ #define INIT_THREAD_INFO(tsk) \
{ \ { \
.task = &tsk, \
.flags = 0, \ .flags = 0, \
.cpu = 0, \
} }
#define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack) #define init_stack (init_thread_union.stack)
/* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void)
{
return (struct thread_info *) S390_lowcore.thread_info;
}
void arch_release_task_struct(struct task_struct *tsk); void arch_release_task_struct(struct task_struct *tsk);
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
int main(void) int main(void)
{ {
/* task struct offsets */ /* task struct offsets */
OFFSET(__TASK_thread_info, task_struct, stack); OFFSET(__TASK_stack, task_struct, stack);
OFFSET(__TASK_thread, task_struct, thread); OFFSET(__TASK_thread, task_struct, thread);
OFFSET(__TASK_pid, task_struct, pid); OFFSET(__TASK_pid, task_struct, pid);
BLANK(); BLANK();
...@@ -39,13 +39,11 @@ int main(void) ...@@ -39,13 +39,11 @@ int main(void)
OFFSET(__THREAD_trap_tdb, thread_struct, trap_tdb); OFFSET(__THREAD_trap_tdb, thread_struct, trap_tdb);
BLANK(); BLANK();
/* thread info offsets */ /* thread info offsets */
OFFSET(__TI_task, thread_info, task); OFFSET(__TI_flags, task_struct, thread_info.flags);
OFFSET(__TI_flags, thread_info, flags); OFFSET(__TI_sysc_table, task_struct, thread_info.sys_call_table);
OFFSET(__TI_sysc_table, thread_info, sys_call_table); OFFSET(__TI_user_timer, task_struct, thread_info.user_timer);
OFFSET(__TI_cpu, thread_info, cpu); OFFSET(__TI_system_timer, task_struct, thread_info.system_timer);
OFFSET(__TI_user_timer, thread_info, user_timer); OFFSET(__TI_last_break, task_struct, thread_info.last_break);
OFFSET(__TI_system_timer, thread_info, system_timer);
OFFSET(__TI_last_break, thread_info, last_break);
BLANK(); BLANK();
/* pt_regs offsets */ /* pt_regs offsets */
OFFSET(__PT_ARGS, pt_regs, args); OFFSET(__PT_ARGS, pt_regs, args);
...@@ -160,7 +158,6 @@ int main(void) ...@@ -160,7 +158,6 @@ int main(void)
OFFSET(__LC_INT_CLOCK, lowcore, int_clock); OFFSET(__LC_INT_CLOCK, lowcore, int_clock);
OFFSET(__LC_MCCK_CLOCK, lowcore, mcck_clock); OFFSET(__LC_MCCK_CLOCK, lowcore, mcck_clock);
OFFSET(__LC_CURRENT, lowcore, current_task); OFFSET(__LC_CURRENT, lowcore, current_task);
OFFSET(__LC_THREAD_INFO, lowcore, thread_info);
OFFSET(__LC_KERNEL_STACK, lowcore, kernel_stack); OFFSET(__LC_KERNEL_STACK, lowcore, kernel_stack);
OFFSET(__LC_ASYNC_STACK, lowcore, async_stack); OFFSET(__LC_ASYNC_STACK, lowcore, async_stack);
OFFSET(__LC_PANIC_STACK, lowcore, panic_stack); OFFSET(__LC_PANIC_STACK, lowcore, panic_stack);
......
...@@ -186,14 +186,13 @@ ENTRY(__switch_to) ...@@ -186,14 +186,13 @@ ENTRY(__switch_to)
stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
lgr %r1,%r2 lgr %r1,%r2
aghi %r1,__TASK_thread # thread_struct of prev task aghi %r1,__TASK_thread # thread_struct of prev task
lg %r5,__TASK_thread_info(%r3) # get thread_info of next lg %r5,__TASK_stack(%r3) # start of kernel stack of next
stg %r15,__THREAD_ksp(%r1) # store kernel stack of prev stg %r15,__THREAD_ksp(%r1) # store kernel stack of prev
lgr %r1,%r3 lgr %r1,%r3
aghi %r1,__TASK_thread # thread_struct of next task aghi %r1,__TASK_thread # thread_struct of next task
lgr %r15,%r5 lgr %r15,%r5
aghi %r15,STACK_INIT # end of kernel stack of next aghi %r15,STACK_INIT # end of kernel stack of next
stg %r3,__LC_CURRENT # store task struct of next stg %r3,__LC_CURRENT # store task struct of next
stg %r5,__LC_THREAD_INFO # store thread info of next
stg %r15,__LC_KERNEL_STACK # store end of kernel stack stg %r15,__LC_KERNEL_STACK # store end of kernel stack
lg %r15,__THREAD_ksp(%r1) # load kernel stack of next lg %r15,__THREAD_ksp(%r1) # load kernel stack of next
/* c4 is used in guest detection: arch/s390/kernel/perf_cpum_sf.c */ /* c4 is used in guest detection: arch/s390/kernel/perf_cpum_sf.c */
...@@ -274,7 +273,7 @@ ENTRY(system_call) ...@@ -274,7 +273,7 @@ ENTRY(system_call)
.Lsysc_stmg: .Lsysc_stmg:
stmg %r8,%r15,__LC_SAVE_AREA_SYNC stmg %r8,%r15,__LC_SAVE_AREA_SYNC
lg %r10,__LC_LAST_BREAK lg %r10,__LC_LAST_BREAK
lg %r12,__LC_THREAD_INFO lg %r12,__LC_CURRENT
lghi %r14,_PIF_SYSCALL lghi %r14,_PIF_SYSCALL
.Lsysc_per: .Lsysc_per:
lg %r15,__LC_KERNEL_STACK lg %r15,__LC_KERNEL_STACK
...@@ -457,7 +456,7 @@ ENTRY(system_call) ...@@ -457,7 +456,7 @@ ENTRY(system_call)
# #
ENTRY(ret_from_fork) ENTRY(ret_from_fork)
la %r11,STACK_FRAME_OVERHEAD(%r15) la %r11,STACK_FRAME_OVERHEAD(%r15)
lg %r12,__LC_THREAD_INFO lg %r12,__LC_CURRENT
brasl %r14,schedule_tail brasl %r14,schedule_tail
TRACE_IRQS_ON TRACE_IRQS_ON
ssm __LC_SVC_NEW_PSW # reenable interrupts ssm __LC_SVC_NEW_PSW # reenable interrupts
...@@ -478,7 +477,7 @@ ENTRY(pgm_check_handler) ...@@ -478,7 +477,7 @@ ENTRY(pgm_check_handler)
stpt __LC_SYNC_ENTER_TIMER stpt __LC_SYNC_ENTER_TIMER
stmg %r8,%r15,__LC_SAVE_AREA_SYNC stmg %r8,%r15,__LC_SAVE_AREA_SYNC
lg %r10,__LC_LAST_BREAK lg %r10,__LC_LAST_BREAK
lg %r12,__LC_THREAD_INFO lg %r12,__LC_CURRENT
larl %r13,cleanup_critical larl %r13,cleanup_critical
lmg %r8,%r9,__LC_PGM_OLD_PSW lmg %r8,%r9,__LC_PGM_OLD_PSW
tmhh %r8,0x0001 # test problem state bit tmhh %r8,0x0001 # test problem state bit
...@@ -501,7 +500,7 @@ ENTRY(pgm_check_handler) ...@@ -501,7 +500,7 @@ ENTRY(pgm_check_handler)
2: LAST_BREAK %r14 2: LAST_BREAK %r14
UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER UPDATE_VTIME %r14,%r15,__LC_SYNC_ENTER_TIMER
lg %r15,__LC_KERNEL_STACK lg %r15,__LC_KERNEL_STACK
lg %r14,__TI_task(%r12) lgr %r14,%r12
aghi %r14,__TASK_thread # pointer to thread_struct aghi %r14,__TASK_thread # pointer to thread_struct
lghi %r13,__LC_PGM_TDB lghi %r13,__LC_PGM_TDB
tm __LC_PGM_ILC+2,0x02 # check for transaction abort tm __LC_PGM_ILC+2,0x02 # check for transaction abort
...@@ -567,7 +566,7 @@ ENTRY(io_int_handler) ...@@ -567,7 +566,7 @@ ENTRY(io_int_handler)
stpt __LC_ASYNC_ENTER_TIMER stpt __LC_ASYNC_ENTER_TIMER
stmg %r8,%r15,__LC_SAVE_AREA_ASYNC stmg %r8,%r15,__LC_SAVE_AREA_ASYNC
lg %r10,__LC_LAST_BREAK lg %r10,__LC_LAST_BREAK
lg %r12,__LC_THREAD_INFO lg %r12,__LC_CURRENT
larl %r13,cleanup_critical larl %r13,cleanup_critical
lmg %r8,%r9,__LC_IO_OLD_PSW lmg %r8,%r9,__LC_IO_OLD_PSW
SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER
...@@ -741,7 +740,7 @@ ENTRY(ext_int_handler) ...@@ -741,7 +740,7 @@ ENTRY(ext_int_handler)
stpt __LC_ASYNC_ENTER_TIMER stpt __LC_ASYNC_ENTER_TIMER
stmg %r8,%r15,__LC_SAVE_AREA_ASYNC stmg %r8,%r15,__LC_SAVE_AREA_ASYNC
lg %r10,__LC_LAST_BREAK lg %r10,__LC_LAST_BREAK
lg %r12,__LC_THREAD_INFO lg %r12,__LC_CURRENT
larl %r13,cleanup_critical larl %r13,cleanup_critical
lmg %r8,%r9,__LC_EXT_OLD_PSW lmg %r8,%r9,__LC_EXT_OLD_PSW
SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_ENTER_TIMER
...@@ -889,7 +888,7 @@ ENTRY(mcck_int_handler) ...@@ -889,7 +888,7 @@ ENTRY(mcck_int_handler)
spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer spt __LC_CPU_TIMER_SAVE_AREA-4095(%r1) # revalidate cpu timer
lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)# revalidate gprs
lg %r10,__LC_LAST_BREAK lg %r10,__LC_LAST_BREAK
lg %r12,__LC_THREAD_INFO lg %r12,__LC_CURRENT
larl %r13,cleanup_critical larl %r13,cleanup_critical
lmg %r8,%r9,__LC_MCK_OLD_PSW lmg %r8,%r9,__LC_MCK_OLD_PSW
TSTMSK __LC_MCCK_CODE,MCCK_CODE_SYSTEM_DAMAGE TSTMSK __LC_MCCK_CODE,MCCK_CODE_SYSTEM_DAMAGE
......
...@@ -32,10 +32,9 @@ ENTRY(startup_continue) ...@@ -32,10 +32,9 @@ ENTRY(startup_continue)
# #
# Setup stack # Setup stack
# #
larl %r15,init_thread_union larl %r14,init_task
stg %r15,__LC_THREAD_INFO # cache thread info in lowcore
lg %r14,__TI_task(%r15) # cache current in lowcore
stg %r14,__LC_CURRENT stg %r14,__LC_CURRENT
larl %r15,init_thread_union
aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE
stg %r15,__LC_KERNEL_STACK # set end of kernel stack stg %r15,__LC_KERNEL_STACK # set end of kernel stack
aghi %r15,-160 aghi %r15,-160
......
...@@ -329,8 +329,7 @@ static void __init setup_lowcore(void) ...@@ -329,8 +329,7 @@ static void __init setup_lowcore(void)
lc->panic_stack = (unsigned long) lc->panic_stack = (unsigned long)
__alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0)
+ PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); + PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
lc->current_task = (unsigned long) init_thread_union.thread_info.task; lc->current_task = (unsigned long)&init_task;
lc->thread_info = (unsigned long) &init_thread_union;
lc->lpp = LPP_MAGIC; lc->lpp = LPP_MAGIC;
lc->machine_flags = S390_lowcore.machine_flags; lc->machine_flags = S390_lowcore.machine_flags;
lc->preempt_count = S390_lowcore.preempt_count; lc->preempt_count = S390_lowcore.preempt_count;
......
...@@ -263,7 +263,6 @@ static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk) ...@@ -263,7 +263,6 @@ static void pcpu_attach_task(struct pcpu *pcpu, struct task_struct *tsk)
lc->kernel_stack = (unsigned long) task_stack_page(tsk) lc->kernel_stack = (unsigned long) task_stack_page(tsk)
+ THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); + THREAD_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs);
lc->thread_info = (unsigned long) task_thread_info(tsk);
lc->current_task = (unsigned long) tsk; lc->current_task = (unsigned long) tsk;
lc->lpp = LPP_MAGIC; lc->lpp = LPP_MAGIC;
lc->current_pid = tsk->pid; lc->current_pid = tsk->pid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment