process.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:16k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Architecture-specific setup.
  3.  *
  4.  * Copyright (C) 1998-2001 Hewlett-Packard Co
  5.  * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
  6.  */
  7. #define __KERNEL_SYSCALLS__ /* see <asm/unistd.h> */
  8. #include <linux/config.h>
  9. #include <linux/pm.h>
  10. #include <linux/elf.h>
  11. #include <linux/errno.h>
  12. #include <linux/kernel.h>
  13. #include <linux/mm.h>
  14. #include <linux/sched.h>
  15. #include <linux/slab.h>
  16. #include <linux/smp_lock.h>
  17. #include <linux/stddef.h>
  18. #include <linux/unistd.h>
  19. #include <asm/delay.h>
  20. #include <asm/efi.h>
  21. #include <asm/perfmon.h>
  22. #include <asm/pgtable.h>
  23. #include <asm/processor.h>
  24. #include <asm/sal.h>
  25. #include <asm/uaccess.h>
  26. #include <asm/unwind.h>
  27. #include <asm/user.h>
  28. static void
  29. do_show_stack (struct unw_frame_info *info, void *arg)
  30. {
  31. unsigned long ip, sp, bsp;
  32. printk("nCall Trace: ");
  33. do {
  34. unw_get_ip(info, &ip);
  35. if (ip == 0)
  36. break;
  37. unw_get_sp(info, &sp);
  38. unw_get_bsp(info, &bsp);
  39. printk("[<%016lx>] sp=0x%016lx bsp=0x%016lxn", ip, sp, bsp);
  40. } while (unw_unwind(info) >= 0);
  41. }
  42. void
  43. show_stack (struct task_struct *task)
  44. {
  45. if (!task)
  46. unw_init_running(do_show_stack, 0);
  47. else {
  48. struct unw_frame_info info;
  49. unw_init_from_blocked_task(&info, task);
  50. do_show_stack(&info, 0);
  51. }
  52. }
  53. void
  54. show_regs (struct pt_regs *regs)
  55. {
  56. unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
  57. printk("nPid: %d, comm: %20sn", current->pid, current->comm);
  58. printk("psr : %016lx ifs : %016lx ip  : [<%016lx>]    %sn",
  59.        regs->cr_ipsr, regs->cr_ifs, ip, print_tainted());
  60. printk("unat: %016lx pfs : %016lx rsc : %016lxn",
  61.        regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
  62. printk("rnat: %016lx bsps: %016lx pr  : %016lxn",
  63.        regs->ar_rnat, regs->ar_bspstore, regs->pr);
  64. printk("ldrs: %016lx ccv : %016lx fpsr: %016lxn",
  65.        regs->loadrs, regs->ar_ccv, regs->ar_fpsr);
  66. printk("b0  : %016lx b6  : %016lx b7  : %016lxn", regs->b0, regs->b6, regs->b7);
  67. printk("f6  : %05lx%016lx f7  : %05lx%016lxn",
  68.        regs->f6.u.bits[1], regs->f6.u.bits[0],
  69.        regs->f7.u.bits[1], regs->f7.u.bits[0]);
  70. printk("f8  : %05lx%016lx f9  : %05lx%016lxn",
  71.        regs->f8.u.bits[1], regs->f8.u.bits[0],
  72.        regs->f9.u.bits[1], regs->f9.u.bits[0]);
  73. printk("r1  : %016lx r2  : %016lx r3  : %016lxn", regs->r1, regs->r2, regs->r3);
  74. printk("r8  : %016lx r9  : %016lx r10 : %016lxn", regs->r8, regs->r9, regs->r10);
  75. printk("r11 : %016lx r12 : %016lx r13 : %016lxn", regs->r11, regs->r12, regs->r13);
  76. printk("r14 : %016lx r15 : %016lx r16 : %016lxn", regs->r14, regs->r15, regs->r16);
  77. printk("r17 : %016lx r18 : %016lx r19 : %016lxn", regs->r17, regs->r18, regs->r19);
  78. printk("r20 : %016lx r21 : %016lx r22 : %016lxn", regs->r20, regs->r21, regs->r22);
  79. printk("r23 : %016lx r24 : %016lx r25 : %016lxn", regs->r23, regs->r24, regs->r25);
  80. printk("r26 : %016lx r27 : %016lx r28 : %016lxn", regs->r26, regs->r27, regs->r28);
  81. printk("r29 : %016lx r30 : %016lx r31 : %016lxn", regs->r29, regs->r30, regs->r31);
  82. /* print the stacked registers if cr.ifs is valid: */
  83. if (regs->cr_ifs & 0x8000000000000000) {
  84. unsigned long val, sof, *bsp, ndirty;
  85. int i, is_nat = 0;
  86. sof = regs->cr_ifs & 0x7f; /* size of frame */
  87. ndirty = (regs->loadrs >> 19);
  88. bsp = ia64_rse_skip_regs((unsigned long *) regs->ar_bspstore, ndirty);
  89. for (i = 0; i < sof; ++i) {
  90. get_user(val, ia64_rse_skip_regs(bsp, i));
  91. printk("r%-3u:%c%016lx%s", 32 + i, is_nat ? '*' : ' ', val,
  92.        ((i == sof - 1) || (i % 3) == 2) ? "n" : " ");
  93. }
  94. }
  95. if (!user_mode(regs))
  96. show_stack(0);
  97. }
  98. void __attribute__((noreturn))
  99. cpu_idle (void *unused)
  100. {
  101. /* endless idle loop with no priority at all */
  102. init_idle();
  103. current->nice = 20;
  104. current->counter = -100;
  105. while (1) {
  106. #ifdef CONFIG_SMP
  107. if (!current->need_resched)
  108. min_xtp();
  109. #endif
  110. while (!current->need_resched)
  111. continue;
  112. #ifdef CONFIG_SMP
  113. normal_xtp();
  114. #endif
  115. schedule();
  116. check_pgt_cache();
  117. if (pm_idle)
  118. (*pm_idle)();
  119. }
  120. }
  121. void
  122. ia64_save_extra (struct task_struct *task)
  123. {
  124. if ((task->thread.flags & IA64_THREAD_DBG_VALID) != 0)
  125. ia64_save_debug_regs(&task->thread.dbr[0]);
  126. #ifdef CONFIG_PERFMON
  127. if ((task->thread.flags & IA64_THREAD_PM_VALID) != 0)
  128. pfm_save_regs(task);
  129. #endif
  130. if (IS_IA32_PROCESS(ia64_task_regs(task)))
  131. ia32_save_state(task);
  132. }
  133. void
  134. ia64_load_extra (struct task_struct *task)
  135. {
  136. if ((task->thread.flags & IA64_THREAD_DBG_VALID) != 0)
  137. ia64_load_debug_regs(&task->thread.dbr[0]);
  138. #ifdef CONFIG_PERFMON
  139. if ((task->thread.flags & IA64_THREAD_PM_VALID) != 0)
  140. pfm_load_regs(task);
  141. #endif
  142. if (IS_IA32_PROCESS(ia64_task_regs(task)))
  143. ia32_load_state(task);
  144. }
  145. /*
  146.  * Copy the state of an ia-64 thread.
  147.  *
  148.  * We get here through the following  call chain:
  149.  *
  150.  * <clone syscall>
  151.  * sys_clone
  152.  * do_fork
  153.  * copy_thread
  154.  *
  155.  * This means that the stack layout is as follows:
  156.  *
  157.  * +---------------------+ (highest addr)
  158.  * |   struct pt_regs    |
  159.  * +---------------------+
  160.  * | struct switch_stack |
  161.  * +---------------------+
  162.  * |                     |
  163.  * |    memory stack     |
  164.  * |                     | <-- sp (lowest addr)
  165.  * +---------------------+
  166.  *
  167.  * Note: if we get called through kernel_thread() then the memory
  168.  * above "(highest addr)" is valid kernel stack memory that needs to
  169.  * be copied as well.
  170.  *
  171.  * Observe that we copy the unat values that are in pt_regs and
  172.  * switch_stack.  Spilling an integer to address X causes bit N in
  173.  * ar.unat to be set to the NaT bit of the register, with N=(X &
  174.  * 0x1ff)/8.  Thus, copying the unat value preserves the NaT bits ONLY
  175.  * if the pt_regs structure in the parent is congruent to that of the
  176.  * child, modulo 512.  Since the stack is page aligned and the page
  177.  * size is at least 4KB, this is always the case, so there is nothing
  178.  * to worry about.
  179.  */
  180. int
  181. copy_thread (int nr, unsigned long clone_flags,
  182.      unsigned long user_stack_base, unsigned long user_stack_size,
  183.      struct task_struct *p, struct pt_regs *regs)
  184. {
  185. unsigned long rbs, child_rbs, rbs_size, stack_offset, stack_top, stack_used;
  186. struct switch_stack *child_stack, *stack;
  187. extern char ia64_ret_from_clone, ia32_ret_from_clone;
  188. struct pt_regs *child_ptregs;
  189. int retval = 0;
  190. #ifdef CONFIG_SMP
  191. /*
  192.  * For SMP idle threads, fork_by_hand() calls do_fork with
  193.  * NULL regs.
  194.  */
  195. if (!regs)
  196. return 0;
  197. #endif
  198. stack_top = (unsigned long) current + IA64_STK_OFFSET;
  199. stack = ((struct switch_stack *) regs) - 1;
  200. stack_used = stack_top - (unsigned long) stack;
  201. stack_offset = IA64_STK_OFFSET - stack_used;
  202. child_stack = (struct switch_stack *) ((unsigned long) p + stack_offset);
  203. child_ptregs = (struct pt_regs *) (child_stack + 1);
  204. /* copy parent's switch_stack & pt_regs to child: */
  205. memcpy(child_stack, stack, stack_used);
  206. rbs = (unsigned long) current + IA64_RBS_OFFSET;
  207. child_rbs = (unsigned long) p + IA64_RBS_OFFSET;
  208. rbs_size = stack->ar_bspstore - rbs;
  209. /* copy the parent's register backing store to the child: */
  210. memcpy((void *) child_rbs, (void *) rbs, rbs_size);
  211. if (user_mode(child_ptregs)) {
  212. if (user_stack_base) {
  213. child_ptregs->r12 = user_stack_base + user_stack_size;
  214. child_ptregs->ar_bspstore = user_stack_base;
  215. child_ptregs->ar_rnat = 0;
  216. child_ptregs->loadrs = 0;
  217. }
  218. } else {
  219. /*
  220.  * Note: we simply preserve the relative position of
  221.  * the stack pointer here.  There is no need to
  222.  * allocate a scratch area here, since that will have
  223.  * been taken care of by the caller of sys_clone()
  224.  * already.
  225.  */
  226. child_ptregs->r12 = (unsigned long) (child_ptregs + 1); /* kernel sp */
  227. child_ptregs->r13 = (unsigned long) p; /* set `current' pointer */
  228. }
  229. if (IS_IA32_PROCESS(regs))
  230. child_stack->b0 = (unsigned long) &ia32_ret_from_clone;
  231. else
  232. child_stack->b0 = (unsigned long) &ia64_ret_from_clone;
  233. child_stack->ar_bspstore = child_rbs + rbs_size;
  234. /* copy parts of thread_struct: */
  235. p->thread.ksp = (unsigned long) child_stack - 16;
  236. /*
  237.  * NOTE: The calling convention considers all floating point
  238.  * registers in the high partition (fph) to be scratch.  Since
  239.  * the only way to get to this point is through a system call,
  240.  * we know that the values in fph are all dead.  Hence, there
  241.  * is no need to inherit the fph state from the parent to the
  242.  * child and all we have to do is to make sure that
  243.  * IA64_THREAD_FPH_VALID is cleared in the child.
  244.  *
  245.  * XXX We could push this optimization a bit further by
  246.  * clearing IA64_THREAD_FPH_VALID on ANY system call.
  247.  * However, it's not clear this is worth doing.  Also, it
  248.  * would be a slight deviation from the normal Linux system
  249.  * call behavior where scratch registers are preserved across
  250.  * system calls (unless used by the system call itself).
  251.  */
  252. # define THREAD_FLAGS_TO_CLEAR (IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID 
  253.  | IA64_THREAD_PM_VALID)
  254. # define THREAD_FLAGS_TO_SET 0
  255. p->thread.flags = ((current->thread.flags & ~THREAD_FLAGS_TO_CLEAR)
  256.    | THREAD_FLAGS_TO_SET);
  257. #ifdef CONFIG_IA32_SUPPORT
  258. /*
  259.  * If we're cloning an IA32 task then save the IA32 extra
  260.  * state from the current task to the new task
  261.  */
  262. if (IS_IA32_PROCESS(ia64_task_regs(current)))
  263. ia32_save_state(p);
  264. #endif
  265. #ifdef CONFIG_PERFMON
  266. if (p->thread.pfm_context)
  267. retval = pfm_inherit(p, child_ptregs);
  268. #endif
  269. return retval;
  270. }
  271. void
  272. do_copy_regs (struct unw_frame_info *info, void *arg)
  273. {
  274. unsigned long mask, sp, nat_bits = 0, ip, ar_rnat, urbs_end, cfm;
  275. elf_greg_t *dst = arg;
  276. struct pt_regs *pt;
  277. char nat;
  278. int i;
  279. memset(dst, 0, sizeof(elf_gregset_t)); /* don't leak any kernel bits to user-level */
  280. if (unw_unwind_to_user(info) < 0)
  281. return;
  282. unw_get_sp(info, &sp);
  283. pt = (struct pt_regs *) (sp + 16);
  284. urbs_end = ia64_get_user_rbs_end(current, pt, &cfm);
  285. if (ia64_sync_user_rbs(current, info->sw, pt->ar_bspstore, urbs_end) < 0)
  286. return;
  287. ia64_peek(current, info->sw, urbs_end, (long) ia64_rse_rnat_addr((long *) urbs_end),
  288.   &ar_rnat);
  289. /*
  290.  * coredump format:
  291.  * r0-r31
  292.  * NaT bits (for r0-r31; bit N == 1 iff rN is a NaT)
  293.  * predicate registers (p0-p63)
  294.  * b0-b7
  295.  * ip cfm user-mask
  296.  * ar.rsc ar.bsp ar.bspstore ar.rnat
  297.  * ar.ccv ar.unat ar.fpsr ar.pfs ar.lc ar.ec
  298.  */
  299. /* r0 is zero */
  300. for (i = 1, mask = (1UL << i); i < 32; ++i) {
  301. unw_get_gr(info, i, &dst[i], &nat);
  302. if (nat)
  303. nat_bits |= mask;
  304. mask <<= 1;
  305. }
  306. dst[32] = nat_bits;
  307. unw_get_pr(info, &dst[33]);
  308. for (i = 0; i < 8; ++i)
  309. unw_get_br(info, i, &dst[34 + i]);
  310. unw_get_rp(info, &ip);
  311. dst[42] = ip + ia64_psr(pt)->ri;
  312. dst[43] = cfm;
  313. dst[44] = pt->cr_ipsr & IA64_PSR_UM;
  314. unw_get_ar(info, UNW_AR_RSC, &dst[45]);
  315. /*
  316.  * For bsp and bspstore, unw_get_ar() would return the kernel
  317.  * addresses, but we need the user-level addresses instead:
  318.  */
  319. dst[46] = urbs_end; /* note: by convention PT_AR_BSP points to the end of the urbs! */
  320. dst[47] = pt->ar_bspstore;
  321. dst[48] = ar_rnat;
  322. unw_get_ar(info, UNW_AR_CCV, &dst[49]);
  323. unw_get_ar(info, UNW_AR_UNAT, &dst[50]);
  324. unw_get_ar(info, UNW_AR_FPSR, &dst[51]);
  325. dst[52] = pt->ar_pfs; /* UNW_AR_PFS is == to pt->cr_ifs for interrupt frames */
  326. unw_get_ar(info, UNW_AR_LC, &dst[53]);
  327. unw_get_ar(info, UNW_AR_EC, &dst[54]);
  328. }
  329. void
  330. do_dump_fpu (struct unw_frame_info *info, void *arg)
  331. {
  332. elf_fpreg_t *dst = arg;
  333. int i;
  334. memset(dst, 0, sizeof(elf_fpregset_t)); /* don't leak any "random" bits */
  335. if (unw_unwind_to_user(info) < 0)
  336. return;
  337. /* f0 is 0.0, f1 is 1.0 */
  338. for (i = 2; i < 32; ++i)
  339. unw_get_fr(info, i, dst + i);
  340. ia64_flush_fph(current);
  341. if ((current->thread.flags & IA64_THREAD_FPH_VALID) != 0)
  342. memcpy(dst + 32, current->thread.fph, 96*16);
  343. }
  344. void
  345. ia64_elf_core_copy_regs (struct pt_regs *pt, elf_gregset_t dst)
  346. {
  347. unw_init_running(do_copy_regs, dst);
  348. }
  349. int
  350. dump_fpu (struct pt_regs *pt, elf_fpregset_t dst)
  351. {
  352. unw_init_running(do_dump_fpu, dst);
  353. return 1; /* f0-f31 are always valid so we always return 1 */
  354. }
  355. asmlinkage long
  356. sys_execve (char *filename, char **argv, char **envp, struct pt_regs *regs)
  357. {
  358. int error;
  359. filename = getname(filename);
  360. error = PTR_ERR(filename);
  361. if (IS_ERR(filename))
  362. goto out;
  363. error = do_execve(filename, argv, envp, regs);
  364. putname(filename);
  365. out:
  366. return error;
  367. }
  368. pid_t
  369. kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
  370. {
  371. struct task_struct *parent = current;
  372. int result, tid;
  373. tid = clone(flags | CLONE_VM, 0);
  374. if (parent != current) {
  375. result = (*fn)(arg);
  376. _exit(result);
  377. }
  378. return tid;
  379. }
  380. /*
  381.  * Flush thread state.  This is called when a thread does an execve().
  382.  */
  383. void
  384. flush_thread (void)
  385. {
  386. /* drop floating-point and debug-register state if it exists: */
  387. current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
  388. #ifndef CONFIG_SMP
  389. if (ia64_get_fpu_owner() == current)
  390. ia64_set_fpu_owner(0);
  391. #endif
  392. }
  393. #ifdef CONFIG_PERFMON
  394. /*
  395.  * By the time we get here, the task is detached from the tasklist. This is important
  396.  * because it means that no other tasks can ever find it as a notifiied task, therfore
  397.  * there is no race condition between this code and let's say a pfm_context_create().
  398.  * Conversely, the pfm_cleanup_notifiers() cannot try to access a task's pfm context if
  399.  * this other task is in the middle of its own pfm_context_exit() because it would alreayd
  400.  * be out of the task list. Note that this case is very unlikely between a direct child
  401.  * and its parents (if it is the notified process) because of the way the exit is notified
  402.  * via SIGCHLD.
  403.  */
  404. void
  405. release_thread (struct task_struct *task)
  406. {
  407. if (task->thread.pfm_context)
  408. pfm_context_exit(task);
  409. if (atomic_read(&task->thread.pfm_notifiers_check) > 0)
  410. pfm_cleanup_notifiers(task);
  411. }
  412. #endif
  413. /*
  414.  * Clean up state associated with current thread.  This is called when
  415.  * the thread calls exit().
  416.  */
  417. void
  418. exit_thread (void)
  419. {
  420. #ifndef CONFIG_SMP
  421. if (ia64_get_fpu_owner() == current)
  422. ia64_set_fpu_owner(0);
  423. #endif
  424. #ifdef CONFIG_PERFMON
  425.        /* stop monitoring */
  426. if ((current->thread.flags & IA64_THREAD_PM_VALID) != 0) {
  427. /*
  428.  * we cannot rely on switch_to() to save the PMU
  429.  * context for the last time. There is a possible race
  430.  * condition in SMP mode between the child and the
  431.  * parent.  by explicitly saving the PMU context here
  432.  * we garantee no race.  this call we also stop
  433.  * monitoring
  434.  */
  435. pfm_flush_regs(current);
  436. /*
  437.  * make sure that switch_to() will not save context again
  438.  */
  439. current->thread.flags &= ~IA64_THREAD_PM_VALID;
  440. }
  441. #endif
  442. }
  443. unsigned long
  444. get_wchan (struct task_struct *p)
  445. {
  446. struct unw_frame_info info;
  447. unsigned long ip;
  448. int count = 0;
  449. /*
  450.  * These bracket the sleeping functions..
  451.  */
  452. extern void scheduling_functions_start_here(void);
  453. extern void scheduling_functions_end_here(void);
  454. # define first_sched ((unsigned long) scheduling_functions_start_here)
  455. # define last_sched ((unsigned long) scheduling_functions_end_here)
  456. /*
  457.  * Note: p may not be a blocked task (it could be current or
  458.  * another process running on some other CPU.  Rather than
  459.  * trying to determine if p is really blocked, we just assume
  460.  * it's blocked and rely on the unwind routines to fail
  461.  * gracefully if the process wasn't really blocked after all.
  462.  * --davidm 99/12/15
  463.  */
  464. unw_init_from_blocked_task(&info, p);
  465. do {
  466. if (unw_unwind(&info) < 0)
  467. return 0;
  468. unw_get_ip(&info, &ip);
  469. if (ip < first_sched || ip >= last_sched)
  470. return ip;
  471. } while (count++ < 16);
  472. return 0;
  473. # undef first_sched
  474. # undef last_sched
  475. }
  476. void
  477. cpu_halt (void)
  478. {
  479. pal_power_mgmt_info_u_t power_info[8];
  480. unsigned long min_power;
  481. int i, min_power_state;
  482. if (ia64_pal_halt_info(power_info) != 0)
  483. return;
  484. min_power_state = 0;
  485. min_power = power_info[0].pal_power_mgmt_info_s.power_consumption;
  486. for (i = 1; i < 8; ++i)
  487. if (power_info[i].pal_power_mgmt_info_s.im
  488.     && power_info[i].pal_power_mgmt_info_s.power_consumption < min_power) {
  489. min_power = power_info[i].pal_power_mgmt_info_s.power_consumption;
  490. min_power_state = i;
  491. }
  492. while (1)
  493. ia64_pal_halt(min_power_state);
  494. }
  495. void
  496. machine_restart (char *restart_cmd)
  497. {
  498. (*efi.reset_system)(EFI_RESET_WARM, 0, 0, 0);
  499. }
  500. void
  501. machine_halt (void)
  502. {
  503. cpu_halt();
  504. }
  505. void
  506. machine_power_off (void)
  507. {
  508. if (pm_power_off)
  509. pm_power_off();
  510. machine_halt();
  511. }