diff options
Diffstat (limited to 'arch/s390/kernel')
-rw-r--r-- | arch/s390/kernel/process.c | 14 | ||||
-rw-r--r-- | arch/s390/kernel/setup.c | 11 | ||||
-rw-r--r-- | arch/s390/kernel/time.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 27 |
4 files changed, 46 insertions, 8 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 2ff90a1a1056..008c74526fd3 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -58,10 +58,18 @@ asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); | |||
58 | */ | 58 | */ |
59 | unsigned long thread_saved_pc(struct task_struct *tsk) | 59 | unsigned long thread_saved_pc(struct task_struct *tsk) |
60 | { | 60 | { |
61 | struct stack_frame *sf; | 61 | struct stack_frame *sf, *low, *high; |
62 | 62 | ||
63 | sf = (struct stack_frame *) tsk->thread.ksp; | 63 | if (!tsk || !task_stack_page(tsk)) |
64 | sf = (struct stack_frame *) sf->back_chain; | 64 | return 0; |
65 | low = task_stack_page(tsk); | ||
66 | high = (struct stack_frame *) task_pt_regs(tsk); | ||
67 | sf = (struct stack_frame *) (tsk->thread.ksp & PSW_ADDR_INSN); | ||
68 | if (sf <= low || sf > high) | ||
69 | return 0; | ||
70 | sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN); | ||
71 | if (sf <= low || sf > high) | ||
72 | return 0; | ||
65 | return sf->gprs[8]; | 73 | return sf->gprs[8]; |
66 | } | 74 | } |
67 | 75 | ||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index b03847d100d9..de8784267473 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -268,7 +268,7 @@ static void do_machine_restart_nonsmp(char * __unused) | |||
268 | reipl_diag(); | 268 | reipl_diag(); |
269 | 269 | ||
270 | if (MACHINE_IS_VM) | 270 | if (MACHINE_IS_VM) |
271 | cpcmd ("IPL", NULL, 0); | 271 | cpcmd ("IPL", NULL, 0, NULL); |
272 | else | 272 | else |
273 | reipl (0x10000 | S390_lowcore.ipl_device); | 273 | reipl (0x10000 | S390_lowcore.ipl_device); |
274 | } | 274 | } |
@@ -276,14 +276,14 @@ static void do_machine_restart_nonsmp(char * __unused) | |||
276 | static void do_machine_halt_nonsmp(void) | 276 | static void do_machine_halt_nonsmp(void) |
277 | { | 277 | { |
278 | if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0) | 278 | if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0) |
279 | cpcmd(vmhalt_cmd, NULL, 0); | 279 | cpcmd(vmhalt_cmd, NULL, 0, NULL); |
280 | signal_processor(smp_processor_id(), sigp_stop_and_store_status); | 280 | signal_processor(smp_processor_id(), sigp_stop_and_store_status); |
281 | } | 281 | } |
282 | 282 | ||
283 | static void do_machine_power_off_nonsmp(void) | 283 | static void do_machine_power_off_nonsmp(void) |
284 | { | 284 | { |
285 | if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0) | 285 | if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0) |
286 | cpcmd(vmpoff_cmd, NULL, 0); | 286 | cpcmd(vmpoff_cmd, NULL, 0, NULL); |
287 | signal_processor(smp_processor_id(), sigp_stop_and_store_status); | 287 | signal_processor(smp_processor_id(), sigp_stop_and_store_status); |
288 | } | 288 | } |
289 | 289 | ||
@@ -315,6 +315,11 @@ void machine_power_off(void) | |||
315 | _machine_power_off(); | 315 | _machine_power_off(); |
316 | } | 316 | } |
317 | 317 | ||
318 | /* | ||
319 | * Dummy power off function. | ||
320 | */ | ||
321 | void (*pm_power_off)(void) = machine_power_off; | ||
322 | |||
318 | static void __init | 323 | static void __init |
319 | add_memory_hole(unsigned long start, unsigned long end) | 324 | add_memory_hole(unsigned long start, unsigned long end) |
320 | { | 325 | { |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index b0d8ca8e5eeb..7c0fe152a111 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -214,7 +214,7 @@ void account_ticks(struct pt_regs *regs) | |||
214 | #endif | 214 | #endif |
215 | 215 | ||
216 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 216 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
217 | account_user_vtime(current); | 217 | account_tick_vtime(current); |
218 | #else | 218 | #else |
219 | while (ticks--) | 219 | while (ticks--) |
220 | update_process_times(user_mode(regs)); | 220 | update_process_times(user_mode(regs)); |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 22a895ecb7a4..dfe6f0856617 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -32,7 +32,7 @@ DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer); | |||
32 | * Update process times based on virtual cpu times stored by entry.S | 32 | * Update process times based on virtual cpu times stored by entry.S |
33 | * to the lowcore fields user_timer, system_timer & steal_clock. | 33 | * to the lowcore fields user_timer, system_timer & steal_clock. |
34 | */ | 34 | */ |
35 | void account_user_vtime(struct task_struct *tsk) | 35 | void account_tick_vtime(struct task_struct *tsk) |
36 | { | 36 | { |
37 | cputime_t cputime; | 37 | cputime_t cputime; |
38 | __u64 timer, clock; | 38 | __u64 timer, clock; |
@@ -76,6 +76,31 @@ void account_user_vtime(struct task_struct *tsk) | |||
76 | * Update process times based on virtual cpu times stored by entry.S | 76 | * Update process times based on virtual cpu times stored by entry.S |
77 | * to the lowcore fields user_timer, system_timer & steal_clock. | 77 | * to the lowcore fields user_timer, system_timer & steal_clock. |
78 | */ | 78 | */ |
79 | void account_vtime(struct task_struct *tsk) | ||
80 | { | ||
81 | cputime_t cputime; | ||
82 | __u64 timer; | ||
83 | |||
84 | timer = S390_lowcore.last_update_timer; | ||
85 | asm volatile (" STPT %0" /* Store current cpu timer value */ | ||
86 | : "=m" (S390_lowcore.last_update_timer) ); | ||
87 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; | ||
88 | |||
89 | cputime = S390_lowcore.user_timer >> 12; | ||
90 | S390_lowcore.user_timer -= cputime << 12; | ||
91 | S390_lowcore.steal_clock -= cputime << 12; | ||
92 | account_user_time(tsk, cputime); | ||
93 | |||
94 | cputime = S390_lowcore.system_timer >> 12; | ||
95 | S390_lowcore.system_timer -= cputime << 12; | ||
96 | S390_lowcore.steal_clock -= cputime << 12; | ||
97 | account_system_time(tsk, 0, cputime); | ||
98 | } | ||
99 | |||
100 | /* | ||
101 | * Update process times based on virtual cpu times stored by entry.S | ||
102 | * to the lowcore fields user_timer, system_timer & steal_clock. | ||
103 | */ | ||
79 | void account_system_vtime(struct task_struct *tsk) | 104 | void account_system_vtime(struct task_struct *tsk) |
80 | { | 105 | { |
81 | cputime_t cputime; | 106 | cputime_t cputime; |