summaryrefslogtreecommitdiffstats
path: root/include/asm-ppc/processor.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-ppc/processor.h')
-rw-r--r--include/asm-ppc/processor.h91
1 files changed, 65 insertions, 26 deletions
diff --git a/include/asm-ppc/processor.h b/include/asm-ppc/processor.h
index e14f2b270..ef797b4a7 100644
--- a/include/asm-ppc/processor.h
+++ b/include/asm-ppc/processor.h
@@ -5,8 +5,8 @@
* PowerPC machine specifics
*/
-#ifndef _PPC_MACHINE_H_
-#define _PPC_MACHINE_H_
+#define KERNEL_STACK_SIZE (4096) /* usable stack -- not buffers at either end */
+#define KERNEL_STACK_MASK (~(KERNEL_STACK_SIZE-1))
/* Bit encodings for Machine State Register (MSR) */
#define MSR_POW (1<<18) /* Enable Power Management */
@@ -26,8 +26,8 @@
#define MSR_RI (1<<1) /* Recoverable Exception */
#define MSR_LE (1<<0) /* Little-Endian enable */
-#define MSR_ MSR_FP|MSR_FE0|MSR_FE1|MSR_ME
-#define MSR_USER MSR_|MSR_PR|MSR_EE|MSR_IR|MSR_DR
+#define MSR_ MSR_FE0|MSR_FE1|MSR_ME|MSR_FP
+#define MSR_USER MSR_FE0|MSR_FE1|MSR_ME|MSR_PR|MSR_EE|MSR_IR|MSR_DR
/* Bit encodings for Hardware Implementation Register (HID0) */
#define HID0_EMCP (1<<31) /* Enable Machine Check pin */
@@ -47,15 +47,20 @@
#define HID0_DLOCK (1<<12) /* Data Cache Lock */
#define HID0_ICFI (1<<11) /* Instruction Cache Flash Invalidate */
#define HID0_DCI (1<<10) /* Data Cache Invalidate */
-
-#endif
+#define HID0_SIED (1<<7) /* Serial Instruction Execution [Disable] */
+#define HID0_BHTE (1<<2) /* Branch History Table Enable */
+
+/* fpscr settings */
+#define FPSCR_FX (1<<31)
+#define FPSCR_FEX (1<<30)
-static inline void start_thread(struct pt_regs * regs, unsigned long eip, unsigned long esp)
-{
- regs->nip = eip;
- regs->gpr[1] = esp;
- regs->msr = MSR_USER;
-}
+
+
+#ifndef __ASSEMBLY__
+/*
+ * PowerPC machine specifics
+ */
+extern inline void start_thread(struct pt_regs *, unsigned long, unsigned long );
/*
@@ -69,7 +74,6 @@ static inline void start_thread(struct pt_regs * regs, unsigned long eip, unsign
/*
* Write Protection works right in supervisor mode on the PowerPC
*/
-
#define wp_works_ok 1
#define wp_works_ok__is_a_macro /* for versions in ksyms.c */
@@ -81,28 +85,41 @@ static inline void start_thread(struct pt_regs * regs, unsigned long eip, unsign
*/
#define TASK_SIZE (0x80000000UL)
+/* This decides where the kernel will search for a free chunk of vm
+ * space during mmap's.
+ */
+#define TASK_UNMAPPED_BASE (TASK_SIZE / 3)
+
struct thread_struct
- {
- unsigned long ksp; /* Kernel stack pointer */
- unsigned long *pg_tables; /* MMU information */
- unsigned long segs[16]; /* MMU Segment registers */
- unsigned long last_pc; /* PC when last entered system */
- unsigned long user_stack; /* [User] Stack when entered kernel */
- double fpr[32]; /* Complete floating point set */
- unsigned long wchan; /* Event task is sleeping on */
- unsigned long *regs; /* Pointer to saved register state */
- };
+{
+ unsigned long ksp; /* Kernel stack pointer */
+ unsigned long *pg_tables; /* MMU information */
+ unsigned long segs[16]; /* MMU Segment registers */
+ unsigned long last_pc; /* PC when last entered system */
+ unsigned long user_stack; /* [User] Stack when entered kernel */
+ double fpr[32]; /* Complete floating point set */
+ unsigned long wchan; /* Event task is sleeping on */
+ unsigned long *regs; /* Pointer to saved register state */
+ unsigned long fp_used; /* number of quantums fp was used */
+ unsigned long fs; /* for get_fs() validation */
+ unsigned long expc; /* exception handler addr (see fault.c) */
+ unsigned long excount; /* exception handler count */
+};
+
#define INIT_TSS { \
+ sizeof(init_kernel_stack) + (long) &init_kernel_stack,\
+ (long *)swapper_pg_dir, {0}, \
0, 0, {0}, \
- 0, 0, {0}, \
+ 0, 0, 0, \
+ KERNEL_DS, 0, 0 \
}
#define INIT_MMAP { &init_mm, 0, 0x40000000, \
PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC }
-#define alloc_kernel_stack() get_free_page(GFP_KERNEL)
-#define free_kernel_stack(page) free_page((page))
+/* Free all resources held by a thread. */
+extern void release_thread(struct task_struct *);
/*
* Return saved PC of a blocked thread. For now, this is the "user" PC
@@ -112,6 +129,28 @@ static inline unsigned long thread_saved_pc(struct thread_struct *t)
return (t->last_pc);
}
+#define _PROC_Motorola 0
+#define _PROC_IBM 1
+#define _PROC_Be 2
+
+int _Processor;
+
+/* Allocation and freeing of basic task resources. */
+#define alloc_task_struct() kmalloc(sizeof(struct task_struct), GFP_KERNEL)
+#define free_task_struct(p) kfree(p)
+
+#ifdef KERNEL_STACK_BUFFER
+/* give a 1 page buffer below the stack - if change then change ppc_machine.h */
+#define alloc_kernel_stack() \
+ (memset((void *)__get_free_pages(GFP_KERNEL,1,0),0,KERNEL_STACK_SIZE+PAGE_SIZE)+PAGE_SIZE)
+#define free_kernel_stack(page) free_pages((page)-PAGE_SIZE,1)
+#else
+#define alloc_kernel_stack() get_free_page(GFP_KERNEL)
+#define free_kernel_stack(page) free_page((page))
+#endif
+
+#endif /* ASSEMBLY*/
+
/*
* Return_address is a replacement for __builtin_return_address(count)
* which on certain architectures cannot reasonably be implemented in GCC