patch-2.1.19 linux/include/asm-sparc64/processor.h
Next file: linux/include/asm-sparc64/psrcompat.h
Previous file: linux/include/asm-sparc64/posix_types.h
Back to the patch index
Back to the overall index
- Lines: 203
- Date:
Mon Dec 30 12:00:03 1996
- Orig file:
v2.1.18/linux/include/asm-sparc64/processor.h
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v2.1.18/linux/include/asm-sparc64/processor.h linux/include/asm-sparc64/processor.h
@@ -0,0 +1,202 @@
+/* $Id: processor.h,v 1.6 1996/12/28 20:05:14 davem Exp $
+ * include/asm-sparc64/processor.h
+ *
+ * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
+ */
+
+#ifndef __ASM_SPARC64_PROCESSOR_H
+#define __ASM_SPARC64_PROCESSOR_H
+
+#include <asm/a.out.h>
+#include <asm/pstate.h>
+#include <asm/ptrace.h>
+#include <asm/head.h>
+#include <asm/signal.h>
+#include <asm/segment.h>
+
+/* Bus types */
+#define EISA_bus 0
+#define EISA_bus__is_a_macro /* for versions in ksyms.c */
+#define MCA_bus 0
+#define MCA_bus__is_a_macro /* for versions in ksyms.c */
+
+/* The sparc has no problems with write protection */
+#define wp_works_ok 1
+#define wp_works_ok__is_a_macro /* for versions in ksyms.c */
+
+/* Whee, this is STACK_TOP + PAGE_SIZE and the lowest kernel address too...
+ * That one page is used to protect kernel from intruders, so that
+ * we can make our access_ok test faster
+ */
+#define TASK_SIZE (0xFFFFF80000000000UL)
+
+#ifndef __ASSEMBLY__
+
+/* Ok this is hot. Sparc exception save area. */
+struct exception_struct {
+ unsigned long count; /* Exception count */
+ unsigned long pc; /* Callers PC for copy/clear user */
+ unsigned long expc; /* Where to jump when exception signaled */
+ unsigned long address; /* Saved user base address for transfer */
+};
+
+#define NSWINS 8
+
+/* The Sparc processor specific thread struct. */
+struct thread_struct {
+ /* Context switch saved kernel state. */
+ unsigned long user_globals[8]; /* performance hack */
+ unsigned long ksp, kpc;
+
+ /* Floating point regs */
+ unsigned long float_regs[64] __attribute__ ((aligned (64)));
+ unsigned long fsr;
+ unsigned long fpqdepth;
+ struct fpq {
+ unsigned long *insn_addr;
+ unsigned long insn;
+ } fpqueue[16];
+
+ /* Storage for windows when user stack is bogus. */
+ struct reg_window reg_window[NSWINS] __attribute__ ((aligned (16)));
+ unsigned long rwbuf_stkptrs[NSWINS] __attribute__ ((aligned (8)));
+ unsigned long w_saved;
+
+ /* Arch-specific task state flags, see below. */
+ unsigned long flags;
+
+ /* For signal handling */
+ unsigned long sig_address __attribute__ ((aligned (8)));
+ unsigned long sig_desc;
+
+ struct exception_struct;
+ struct sigstack sstk_info;
+ int current_ds, new_signal;
+ struct exec core_exec; /* just what it says. */
+};
+
+#endif /* !(__ASSEMBLY__) */
+
+#define SPARC_FLAG_KTHREAD 0x1 /* task is a kernel thread */
+#define SPARC_FLAG_UNALIGNED 0x2 /* is allowed to do unaligned accesses */
+#define SPARC_FLAG_NEWSIGNALS 0x4 /* task wants new-style signals */
+#define SPARC_FLAG_32BIT 0x8 /* task is older 32-bit binary */
+
+#define INIT_MMAP { &init_mm, 0xfffff80000000000, 0xfffffe00000, \
+ PAGE_SHARED , VM_READ | VM_WRITE | VM_EXEC }
+
+#define INIT_TSS { \
+/* user_globals */ \
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \
+/* ksp, kpc */ \
+ 0, 0, \
+/* FPU regs */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
+/* FPU status, FPU qdepth, FPU queue */ \
+ 0, 0, { { 0, 0, }, }, \
+/* reg_window */ \
+{ { { 0, }, { 0, } }, }, \
+/* rwbuf_stkptrs */ \
+{ 0, 0, 0, 0, 0, 0, 0, 0, }, \
+/* w_saved */ \
+ 0, \
+/* flags */ \
+ SPARC_FLAG_KTHREAD, \
+/* sig_address, sig_desc */ \
+ 0, 0, \
+/* ex, sstk_info, current_ds, */ \
+ { 0, }, { 0, 0, }, USER_DS, \
+/* new_signal */ \
+ 0, \
+/* core_exec */ \
+{ 0, }, \
+}
+
+#ifndef __ASSEMBLY__
+
+/* Return saved PC of a blocked thread. */
+extern __inline__ unsigned long thread_saved_pc(struct thread_struct *t)
+{
+ return t->kpc;
+}
+
+/* Do necessary setup to start up a newly executed thread. */
+extern __inline__ void start_thread(struct pt_regs *regs, unsigned long pc,
+ unsigned long sp)
+{
+ regs->tstate = (regs->tstate & (TSTATE_CWP)) | TSTATE_IE;
+ regs->tpc = ((pc & (~3)) - 4);
+ regs->tnpc = regs->tpc + 4;
+ regs->y = 0;
+ __asm__ __volatile__("
+ stx %%g0, [%0 + %2 + 0x00]
+ stx %%g0, [%0 + %2 + 0x08]
+ stx %%g0, [%0 + %2 + 0x10]
+ stx %%g0, [%0 + %2 + 0x18]
+ stx %%g0, [%0 + %2 + 0x20]
+ stx %%g0, [%0 + %2 + 0x28]
+ stx %%g0, [%0 + %2 + 0x30]
+ stx %%g0, [%0 + %2 + 0x38]
+ stx %%g0, [%0 + %2 + 0x40]
+ stx %%g0, [%0 + %2 + 0x48]
+ stx %%g0, [%0 + %2 + 0x50]
+ stx %%g0, [%0 + %2 + 0x58]
+ stx %%g0, [%0 + %2 + 0x60]
+ stx %%g0, [%0 + %2 + 0x68]
+ stx %1, [%0 + %2 + 0x70]
+ stx %%g0, [%0 + %2 + 0x78]
+ " : : "r" (regs), "r" (sp - REGWIN_SZ),
+ "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0])));
+}
+
+extern __inline__ void start_thread32(struct pt_regs *regs, unsigned long pc,
+ unsigned long sp)
+{
+ register unsigned int zero asm("g1");
+
+ pc &= 0x00000000ffffffffUL;
+ sp &= 0x00000000ffffffffUL;
+
+ regs->tstate = (regs->tstate & (TSTATE_CWP)) | (TSTATE_IE | TSTATE_AM);
+ regs->tpc = ((pc & (~3)) - 4);
+ regs->tnpc = regs->tpc + 4;
+ regs->y = 0;
+ zero = 0;
+ __asm__ __volatile__("
+ stx %%g0, [%0 + %2 + 0x00]
+ stx %%g0, [%0 + %2 + 0x08]
+ stx %%g0, [%0 + %2 + 0x10]
+ stx %%g0, [%0 + %2 + 0x18]
+ stx %%g0, [%0 + %2 + 0x20]
+ stx %%g0, [%0 + %2 + 0x28]
+ stx %%g0, [%0 + %2 + 0x30]
+ stx %%g0, [%0 + %2 + 0x38]
+ stx %%g0, [%0 + %2 + 0x40]
+ stx %%g0, [%0 + %2 + 0x48]
+ stx %%g0, [%0 + %2 + 0x50]
+ stx %%g0, [%0 + %2 + 0x58]
+ stx %%g0, [%0 + %2 + 0x60]
+ stx %%g0, [%0 + %2 + 0x68]
+ stx %1, [%0 + %2 + 0x70]
+ stx %%g0, [%0 + %2 + 0x78]
+ " : : "r" (regs), "r" (sp - REGWIN32_SZ),
+ "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0])),
+ "r" (zero));
+}
+
+/* Free all resources held by a thread. */
+#define release_thread(tsk) do { } while(0)
+
+#ifdef __KERNEL__
+/* Allocation and freeing of basic task resources. */
+#define alloc_kernel_stack(tsk) __get_free_page(GFP_KERNEL)
+#define free_kernel_stack(stack) free_page(stack)
+#define alloc_task_struct() kmalloc(sizeof(struct task_struct), GFP_KERNEL)
+#define free_task_struct(tsk) kfree(tsk)
+#endif
+
+#endif /* !(__ASSEMBLY__) */
+
+#endif /* !(__ASM_SPARC64_PROCESSOR_H) */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov