1
2
3
4
5
6
7
8
9
10
11
12#include <linux/cpu.h>
13#include <linux/pm.h>
14#include <linux/elf.h>
15#include <linux/errno.h>
16#include <linux/kernel.h>
17#include <linux/mm.h>
18#include <linux/slab.h>
19#include <linux/module.h>
20#include <linux/notifier.h>
21#include <linux/personality.h>
22#include <linux/sched.h>
23#include <linux/sched/debug.h>
24#include <linux/sched/hotplug.h>
25#include <linux/sched/task.h>
26#include <linux/sched/task_stack.h>
27#include <linux/stddef.h>
28#include <linux/thread_info.h>
29#include <linux/unistd.h>
30#include <linux/efi.h>
31#include <linux/interrupt.h>
32#include <linux/delay.h>
33#include <linux/kdebug.h>
34#include <linux/utsname.h>
35#include <linux/tracehook.h>
36#include <linux/rcupdate.h>
37
38#include <asm/cpu.h>
39#include <asm/delay.h>
40#include <asm/elf.h>
41#include <asm/irq.h>
42#include <asm/kexec.h>
43#include <asm/processor.h>
44#include <asm/sal.h>
45#include <asm/switch_to.h>
46#include <asm/tlbflush.h>
47#include <linux/uaccess.h>
48#include <asm/unwind.h>
49#include <asm/user.h>
50#include <asm/xtp.h>
51
52#include "entry.h"
53
54#include "sigframe.h"
55
56void (*ia64_mark_idle)(int);
57
58unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
59EXPORT_SYMBOL(boot_option_idle_override);
60void (*pm_power_off) (void);
61EXPORT_SYMBOL(pm_power_off);
62
63static void
64ia64_do_show_stack (struct unw_frame_info *info, void *arg)
65{
66 unsigned long ip, sp, bsp;
67 const char *loglvl = arg;
68
69 printk("%s\nCall Trace:\n", loglvl);
70 do {
71 unw_get_ip(info, &ip);
72 if (ip == 0)
73 break;
74
75 unw_get_sp(info, &sp);
76 unw_get_bsp(info, &bsp);
77 printk("%s [<%016lx>] %pS\n"
78 " sp=%016lx bsp=%016lx\n",
79 loglvl, ip, (void *)ip, sp, bsp);
80 } while (unw_unwind(info) >= 0);
81}
82
83void
84show_stack (struct task_struct *task, unsigned long *sp, const char *loglvl)
85{
86 if (!task)
87 unw_init_running(ia64_do_show_stack, (void *)loglvl);
88 else {
89 struct unw_frame_info info;
90
91 unw_init_from_blocked_task(&info, task);
92 ia64_do_show_stack(&info, (void *)loglvl);
93 }
94}
95
96void
97show_regs (struct pt_regs *regs)
98{
99 unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
100
101 print_modules();
102 printk("\n");
103 show_regs_print_info(KERN_DEFAULT);
104 printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s (%s)\n",
105 regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),
106 init_utsname()->release);
107 printk("ip is at %pS\n", (void *)ip);
108 printk("unat: %016lx pfs : %016lx rsc : %016lx\n",
109 regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
110 printk("rnat: %016lx bsps: %016lx pr : %016lx\n",
111 regs->ar_rnat, regs->ar_bspstore, regs->pr);
112 printk("ldrs: %016lx ccv : %016lx fpsr: %016lx\n",
113 regs->loadrs, regs->ar_ccv, regs->ar_fpsr);
114 printk("csd : %016lx ssd : %016lx\n", regs->ar_csd, regs->ar_ssd);
115 printk("b0 : %016lx b6 : %016lx b7 : %016lx\n", regs->b0, regs->b6, regs->b7);
116 printk("f6 : %05lx%016lx f7 : %05lx%016lx\n",
117 regs->f6.u.bits[1], regs->f6.u.bits[0],
118 regs->f7.u.bits[1], regs->f7.u.bits[0]);
119 printk("f8 : %05lx%016lx f9 : %05lx%016lx\n",
120 regs->f8.u.bits[1], regs->f8.u.bits[0],
121 regs->f9.u.bits[1], regs->f9.u.bits[0]);
122 printk("f10 : %05lx%016lx f11 : %05lx%016lx\n",
123 regs->f10.u.bits[1], regs->f10.u.bits[0],
124 regs->f11.u.bits[1], regs->f11.u.bits[0]);
125
126 printk("r1 : %016lx r2 : %016lx r3 : %016lx\n", regs->r1, regs->r2, regs->r3);
127 printk("r8 : %016lx r9 : %016lx r10 : %016lx\n", regs->r8, regs->r9, regs->r10);
128 printk("r11 : %016lx r12 : %016lx r13 : %016lx\n", regs->r11, regs->r12, regs->r13);
129 printk("r14 : %016lx r15 : %016lx r16 : %016lx\n", regs->r14, regs->r15, regs->r16);
130 printk("r17 : %016lx r18 : %016lx r19 : %016lx\n", regs->r17, regs->r18, regs->r19);
131 printk("r20 : %016lx r21 : %016lx r22 : %016lx\n", regs->r20, regs->r21, regs->r22);
132 printk("r23 : %016lx r24 : %016lx r25 : %016lx\n", regs->r23, regs->r24, regs->r25);
133 printk("r26 : %016lx r27 : %016lx r28 : %016lx\n", regs->r26, regs->r27, regs->r28);
134 printk("r29 : %016lx r30 : %016lx r31 : %016lx\n", regs->r29, regs->r30, regs->r31);
135
136 if (user_mode(regs)) {
137
138 unsigned long val, *bsp, ndirty;
139 int i, sof, is_nat = 0;
140
141 sof = regs->cr_ifs & 0x7f;
142 ndirty = (regs->loadrs >> 19);
143 bsp = ia64_rse_skip_regs((unsigned long *) regs->ar_bspstore, ndirty);
144 for (i = 0; i < sof; ++i) {
145 get_user(val, (unsigned long __user *) ia64_rse_skip_regs(bsp, i));
146 printk("r%-3u:%c%016lx%s", 32 + i, is_nat ? '*' : ' ', val,
147 ((i == sof - 1) || (i % 3) == 2) ? "\n" : " ");
148 }
149 } else
150 show_stack(NULL, NULL, KERN_DEFAULT);
151}
152
153
154void
155console_print(const char *s)
156{
157 printk(KERN_EMERG "%s", s);
158}
159
160void
161do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)
162{
163 if (fsys_mode(current, &scr->pt)) {
164
165
166
167
168 if (!ia64_psr(&scr->pt)->lp)
169 ia64_psr(&scr->pt)->lp = 1;
170 return;
171 }
172
173
174 if (test_thread_flag(TIF_SIGPENDING)) {
175 local_irq_enable();
176 ia64_do_signal(scr, in_syscall);
177 }
178
179 if (test_thread_flag(TIF_NOTIFY_RESUME)) {
180 local_irq_enable();
181 tracehook_notify_resume(&scr->pt);
182 }
183
184
185 if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) {
186 local_irq_enable();
187 ia64_sync_krbs();
188 }
189
190 local_irq_disable();
191}
192
193static int __init nohalt_setup(char * str)
194{
195 cpu_idle_poll_ctrl(true);
196 return 1;
197}
198__setup("nohalt", nohalt_setup);
199
200#ifdef CONFIG_HOTPLUG_CPU
201
202static inline void play_dead(void)
203{
204 unsigned int this_cpu = smp_processor_id();
205
206
207 __this_cpu_write(cpu_state, CPU_DEAD);
208
209 max_xtp();
210 local_irq_disable();
211 idle_task_exit();
212 ia64_jump_to_sal(&sal_boot_rendez_state[this_cpu]);
213
214
215
216
217 BUG();
218}
219#else
220static inline void play_dead(void)
221{
222 BUG();
223}
224#endif
225
226void arch_cpu_idle_dead(void)
227{
228 play_dead();
229}
230
231void arch_cpu_idle(void)
232{
233 void (*mark_idle)(int) = ia64_mark_idle;
234
235#ifdef CONFIG_SMP
236 min_xtp();
237#endif
238 rmb();
239 if (mark_idle)
240 (*mark_idle)(1);
241
242 raw_safe_halt();
243
244 if (mark_idle)
245 (*mark_idle)(0);
246#ifdef CONFIG_SMP
247 normal_xtp();
248#endif
249}
250
251void
252ia64_save_extra (struct task_struct *task)
253{
254 if ((task->thread.flags & IA64_THREAD_DBG_VALID) != 0)
255 ia64_save_debug_regs(&task->thread.dbr[0]);
256}
257
258void
259ia64_load_extra (struct task_struct *task)
260{
261 if ((task->thread.flags & IA64_THREAD_DBG_VALID) != 0)
262 ia64_load_debug_regs(&task->thread.dbr[0]);
263}
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296int
297copy_thread(unsigned long clone_flags, unsigned long user_stack_base,
298 unsigned long user_stack_size, struct task_struct *p, unsigned long tls)
299{
300 extern char ia64_ret_from_clone;
301 struct switch_stack *child_stack, *stack;
302 unsigned long rbs, child_rbs, rbs_size;
303 struct pt_regs *child_ptregs;
304 struct pt_regs *regs = current_pt_regs();
305 int retval = 0;
306
307 child_ptregs = (struct pt_regs *) ((unsigned long) p + IA64_STK_OFFSET) - 1;
308 child_stack = (struct switch_stack *) child_ptregs - 1;
309
310 rbs = (unsigned long) current + IA64_RBS_OFFSET;
311 child_rbs = (unsigned long) p + IA64_RBS_OFFSET;
312
313
314 p->thread.ksp = (unsigned long) child_stack - 16;
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332# define THREAD_FLAGS_TO_CLEAR (IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID \
333 | IA64_THREAD_PM_VALID)
334# define THREAD_FLAGS_TO_SET 0
335 p->thread.flags = ((current->thread.flags & ~THREAD_FLAGS_TO_CLEAR)
336 | THREAD_FLAGS_TO_SET);
337
338 ia64_drop_fpu(p);
339
340 if (unlikely(p->flags & PF_KTHREAD)) {
341 if (unlikely(!user_stack_base)) {
342
343 return 0;
344 }
345 memset(child_stack, 0, sizeof(*child_ptregs) + sizeof(*child_stack));
346 child_stack->r4 = user_stack_base;
347 child_stack->r5 = user_stack_size;
348
349
350
351
352 child_ptregs->cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN;
353
354 child_ptregs->cr_ifs = 1UL << 63;
355 child_stack->ar_fpsr = child_ptregs->ar_fpsr
356 = ia64_getreg(_IA64_REG_AR_FPSR);
357 child_stack->pr = (1 << PRED_KERNEL_STACK);
358 child_stack->ar_bspstore = child_rbs;
359 child_stack->b0 = (unsigned long) &ia64_ret_from_clone;
360
361
362
363
364
365
366 child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET)
367 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP));
368
369 return 0;
370 }
371 stack = ((struct switch_stack *) regs) - 1;
372
373 memcpy(child_stack, stack, sizeof(*child_ptregs) + sizeof(*child_stack));
374
375
376 rbs_size = stack->ar_bspstore - rbs;
377 memcpy((void *) child_rbs, (void *) rbs, rbs_size);
378 if (clone_flags & CLONE_SETTLS)
379 child_ptregs->r13 = tls;
380 if (user_stack_base) {
381 child_ptregs->r12 = user_stack_base + user_stack_size - 16;
382 child_ptregs->ar_bspstore = user_stack_base;
383 child_ptregs->ar_rnat = 0;
384 child_ptregs->loadrs = 0;
385 }
386 child_stack->ar_bspstore = child_rbs + rbs_size;
387 child_stack->b0 = (unsigned long) &ia64_ret_from_clone;
388
389
390
391
392
393
394 child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET)
395 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP));
396 return retval;
397}
398
399asmlinkage long ia64_clone(unsigned long clone_flags, unsigned long stack_start,
400 unsigned long stack_size, unsigned long parent_tidptr,
401 unsigned long child_tidptr, unsigned long tls)
402{
403 struct kernel_clone_args args = {
404 .flags = (lower_32_bits(clone_flags) & ~CSIGNAL),
405 .pidfd = (int __user *)parent_tidptr,
406 .child_tid = (int __user *)child_tidptr,
407 .parent_tid = (int __user *)parent_tidptr,
408 .exit_signal = (lower_32_bits(clone_flags) & CSIGNAL),
409 .stack = stack_start,
410 .stack_size = stack_size,
411 .tls = tls,
412 };
413
414 return kernel_clone(&args);
415}
416
417static void
418do_copy_task_regs (struct task_struct *task, struct unw_frame_info *info, void *arg)
419{
420 unsigned long mask, sp, nat_bits = 0, ar_rnat, urbs_end, cfm;
421 unsigned long ip;
422 elf_greg_t *dst = arg;
423 struct pt_regs *pt;
424 char nat;
425 int i;
426
427 memset(dst, 0, sizeof(elf_gregset_t));
428
429 if (unw_unwind_to_user(info) < 0)
430 return;
431
432 unw_get_sp(info, &sp);
433 pt = (struct pt_regs *) (sp + 16);
434
435 urbs_end = ia64_get_user_rbs_end(task, pt, &cfm);
436
437 if (ia64_sync_user_rbs(task, info->sw, pt->ar_bspstore, urbs_end) < 0)
438 return;
439
440 ia64_peek(task, info->sw, urbs_end, (long) ia64_rse_rnat_addr((long *) urbs_end),
441 &ar_rnat);
442
443
444
445
446
447
448
449
450
451
452
453
454
455 for (i = 1, mask = (1UL << i); i < 32; ++i) {
456 unw_get_gr(info, i, &dst[i], &nat);
457 if (nat)
458 nat_bits |= mask;
459 mask <<= 1;
460 }
461 dst[32] = nat_bits;
462 unw_get_pr(info, &dst[33]);
463
464 for (i = 0; i < 8; ++i)
465 unw_get_br(info, i, &dst[34 + i]);
466
467 unw_get_rp(info, &ip);
468 dst[42] = ip + ia64_psr(pt)->ri;
469 dst[43] = cfm;
470 dst[44] = pt->cr_ipsr & IA64_PSR_UM;
471
472 unw_get_ar(info, UNW_AR_RSC, &dst[45]);
473
474
475
476
477 dst[46] = urbs_end;
478 dst[47] = pt->ar_bspstore;
479 dst[48] = ar_rnat;
480 unw_get_ar(info, UNW_AR_CCV, &dst[49]);
481 unw_get_ar(info, UNW_AR_UNAT, &dst[50]);
482 unw_get_ar(info, UNW_AR_FPSR, &dst[51]);
483 dst[52] = pt->ar_pfs;
484 unw_get_ar(info, UNW_AR_LC, &dst[53]);
485 unw_get_ar(info, UNW_AR_EC, &dst[54]);
486 unw_get_ar(info, UNW_AR_CSD, &dst[55]);
487 unw_get_ar(info, UNW_AR_SSD, &dst[56]);
488}
489
490void
491do_copy_regs (struct unw_frame_info *info, void *arg)
492{
493 do_copy_task_regs(current, info, arg);
494}
495
496void
497ia64_elf_core_copy_regs (struct pt_regs *pt, elf_gregset_t dst)
498{
499 unw_init_running(do_copy_regs, dst);
500}
501
502
503
504
505void
506flush_thread (void)
507{
508
509 current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
510 ia64_drop_fpu(current);
511}
512
513
514
515
516
517void
518exit_thread (struct task_struct *tsk)
519{
520
521 ia64_drop_fpu(tsk);
522}
523
524unsigned long
525get_wchan (struct task_struct *p)
526{
527 struct unw_frame_info info;
528 unsigned long ip;
529 int count = 0;
530
531 if (!p || p == current || p->state == TASK_RUNNING)
532 return 0;
533
534
535
536
537
538
539
540
541
542 unw_init_from_blocked_task(&info, p);
543 do {
544 if (p->state == TASK_RUNNING)
545 return 0;
546 if (unw_unwind(&info) < 0)
547 return 0;
548 unw_get_ip(&info, &ip);
549 if (!in_sched_functions(ip))
550 return ip;
551 } while (count++ < 16);
552 return 0;
553}
554
555void
556cpu_halt (void)
557{
558 pal_power_mgmt_info_u_t power_info[8];
559 unsigned long min_power;
560 int i, min_power_state;
561
562 if (ia64_pal_halt_info(power_info) != 0)
563 return;
564
565 min_power_state = 0;
566 min_power = power_info[0].pal_power_mgmt_info_s.power_consumption;
567 for (i = 1; i < 8; ++i)
568 if (power_info[i].pal_power_mgmt_info_s.im
569 && power_info[i].pal_power_mgmt_info_s.power_consumption < min_power) {
570 min_power = power_info[i].pal_power_mgmt_info_s.power_consumption;
571 min_power_state = i;
572 }
573
574 while (1)
575 ia64_pal_halt(min_power_state);
576}
577
578void machine_shutdown(void)
579{
580 smp_shutdown_nonboot_cpus(reboot_cpu);
581
582#ifdef CONFIG_KEXEC
583 kexec_disable_iosapic();
584#endif
585}
586
587void
588machine_restart (char *restart_cmd)
589{
590 (void) notify_die(DIE_MACHINE_RESTART, restart_cmd, NULL, 0, 0, 0);
591 efi_reboot(REBOOT_WARM, NULL);
592}
593
594void
595machine_halt (void)
596{
597 (void) notify_die(DIE_MACHINE_HALT, "", NULL, 0, 0, 0);
598 cpu_halt();
599}
600
601void
602machine_power_off (void)
603{
604 if (pm_power_off)
605 pm_power_off();
606 machine_halt();
607}
608
609EXPORT_SYMBOL(ia64_delay_loop);
610