home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-arm / processor.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.8 KB  |  127 lines

  1. /*
  2.  *  linux/include/asm-arm/processor.h
  3.  *
  4.  *  Copyright (C) 1995-1999 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10.  
  11. #ifndef __ASM_ARM_PROCESSOR_H
  12. #define __ASM_ARM_PROCESSOR_H
  13.  
  14. /*
  15.  * Default implementation of macro that returns current
  16.  * instruction pointer ("program counter").
  17.  */
  18. #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  19.  
  20. #ifdef __KERNEL__
  21.  
  22. #include <asm/ptrace.h>
  23. #include <asm/procinfo.h>
  24. #include <asm/types.h>
  25.  
  26. union debug_insn {
  27.     u32    arm;
  28.     u16    thumb;
  29. };
  30.  
  31. struct debug_entry {
  32.     u32            address;
  33.     union debug_insn    insn;
  34. };
  35.  
  36. struct debug_info {
  37.     int            nsaved;
  38.     struct debug_entry    bp[2];
  39. };
  40.  
  41. struct thread_struct {
  42.                             /* fault info      */
  43.     unsigned long        address;
  44.     unsigned long        trap_no;
  45.     unsigned long        error_code;
  46.                             /* debugging      */
  47.     struct debug_info    debug;
  48. };
  49.  
  50. #define INIT_THREAD  {    }
  51.  
  52. #ifdef CONFIG_MMU
  53. #define nommu_start_thread(regs) do { } while (0)
  54. #else
  55. #define nommu_start_thread(regs) regs->ARM_r10 = current->mm->start_data
  56. #endif
  57.  
  58. #define start_thread(regs,pc,sp)                    \
  59. ({                                    \
  60.     unsigned long *stack = (unsigned long *)sp;            \
  61.     set_fs(USER_DS);                        \
  62.     memzero(regs->uregs, sizeof(regs->uregs));            \
  63.     if (current->personality & ADDR_LIMIT_32BIT)            \
  64.         regs->ARM_cpsr = USR_MODE;                \
  65.     else                                \
  66.         regs->ARM_cpsr = USR26_MODE;                \
  67.     if (elf_hwcap & HWCAP_THUMB && pc & 1)                \
  68.         regs->ARM_cpsr |= PSR_T_BIT;                \
  69.     regs->ARM_pc = pc & ~1;        /* pc */            \
  70.     regs->ARM_sp = sp;        /* sp */            \
  71.     regs->ARM_r2 = stack[2];    /* r2 (envp) */            \
  72.     regs->ARM_r1 = stack[1];    /* r1 (argv) */            \
  73.     regs->ARM_r0 = stack[0];    /* r0 (argc) */            \
  74.     nommu_start_thread(regs);                    \
  75. })
  76.  
  77. /* Forward declaration, a strange C thing */
  78. struct task_struct;
  79.  
  80. /* Free all resources held by a thread. */
  81. extern void release_thread(struct task_struct *);
  82.  
  83. /* Prepare to copy thread state - unlazy all lazy status */
  84. #define prepare_to_copy(tsk)    do { } while (0)
  85.  
  86. unsigned long get_wchan(struct task_struct *p);
  87.  
  88. #define cpu_relax()            barrier()
  89.  
  90. /*
  91.  * Create a new kernel thread
  92.  */
  93. extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
  94.  
  95. #define task_pt_regs(p) \
  96.     ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
  97.  
  98. #define KSTK_EIP(tsk)    task_pt_regs(tsk)->ARM_pc
  99. #define KSTK_ESP(tsk)    task_pt_regs(tsk)->ARM_sp
  100.  
  101. /*
  102.  * Prefetching support - only ARMv5.
  103.  */
  104. #if __LINUX_ARM_ARCH__ >= 5
  105.  
  106. #define ARCH_HAS_PREFETCH
  107. #define prefetch(ptr)                \
  108.     ({                    \
  109.         __asm__ __volatile__(        \
  110.         "pld\t%0"            \
  111.         :                \
  112.         : "o" (*(char *)(ptr))        \
  113.         : "cc");            \
  114.     })
  115.  
  116. #define ARCH_HAS_PREFETCHW
  117. #define prefetchw(ptr)    prefetch(ptr)
  118.  
  119. #define ARCH_HAS_SPINLOCK_PREFETCH
  120. #define spin_lock_prefetch(x) do { } while (0)
  121.  
  122. #endif
  123.  
  124. #endif
  125.  
  126. #endif /* __ASM_ARM_PROCESSOR_H */
  127.