patch-1.3.4 linux/include/asm-sparc/head.h

Next file: linux/include/asm-sparc/idprom.h
Previous file: linux/include/asm-sparc/eeprom.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v1.3.3/linux/include/asm-sparc/head.h linux/include/asm-sparc/head.h
@@ -1,61 +1,75 @@
 #ifndef __SPARC_HEAD_H
 #define __SPARC_HEAD_H
 
-#define KERNSIZE	134217728   /* this is how much of a mapping the prom promises */
-#define PAGESIZE	4096        /* luckily this is the same on sun4c's and sun4m's */
-#define PAGESHIFT       12
-#define PROM_BASE	-1568768    /* casa 'de PROM */
-#define LOAD_ADDR       0x4000      /* prom jumps to us here */
+#define KERNBASE        0xf0000000  /* First address the kernel will eventually be */
+#define LOAD_ADDR       0x4000      /* prom jumps to us here unless this is elf /boot */
 #define C_STACK         96
 #define SUN4C_SEGSZ     (1 << 18)
-#define USRSTACK        0x0         /* no joke, this is temporary, trust me */
-#define INT_ENABLE_REG_PHYSADR      0xf5000000
-#define INTS_ENAB   0x01
+#define SRMMU_L1_KBASE_OFFSET ((KERNBASE>>24)<<2)  /* Used in boot remapping. */
+#define INTS_ENAB   0x01            /* entry.S uses this. */
 
-#define BOOT_MSG_LEN    61
-#define BOOT_MSG2_LEN   50
+#define NCPUS           4            /* Architectual limit of sun4m. */
 
+#define  SUN4_PROM_VECTOR   0xFFE81000    /* To safely die on a SUN4 */
+#define  SUN4_PRINTF   0x84               /* Offset into SUN4_PROM_VECTOR */
 
 #define WRITE_PAUSE     nop; nop; nop;
 
-#define PAGE_SIZE       4096
+#define NOP_INSN        0x01000000        /* Used to patch sparc_save_state */
 
 /* Here are some trap goodies */
 
-
 /* Generic trap entry. */
-
 #define TRAP_ENTRY(type, label) \
 	mov (type), %l3; b label; rd %psr, %l0; nop;
 
+/* Notice that for the system calls we pull a trick.  We load up a
+ * different pointer to the system call vector table in %l7, but call
+ * the same generic system call low-level entry point.  The trap table
+ * entry sequences are also HyperSparc pipeline friendly ;-)
+ */
+
+/* Software trap for Linux system calls. */
+#define LINUX_SYSCALL_TRAP \
+        sethi %hi(C_LABEL(sys_call_table)), %l7; or %l7, %lo(C_LABEL(sys_call_table)), %l7; b linux_sparc_syscall; mov %psr, %l0;
+
+/* Software trap for SunOS4.1.x system calls. */
+#define SUNOS_SYSCALL_TRAP \
+        sethi %hi(C_LABEL(sys_call_table)), %l7; or %l7, %lo(C_LABEL(sys_call_table)), %l7; b linux_sparc_syscall; mov %psr, %l0;
+
+/* Software trap for Slowaris system calls. */
+#define SOLARIS_SYSCALL_TRAP \
+        sethi %hi(C_LABEL(sys_call_table)), %l7; or %l7, %lo(C_LABEL(sys_call_table)), %l7; b linux_sparc_syscall; mov %psr, %l0;
+
+/* Software trap for Sparc-netbsd system calls. */
+#define NETBSD_SYSCALL_TRAP \
+        sethi %hi(C_LABEL(sys_call_table)), %l7; or %l7, %lo(C_LABEL(sys_call_table)), %l7; b linux_sparc_syscall; mov %psr, %l0;
+
+/* The Get Condition Codes software trap for userland. */
+#define GETCC_TRAP \
+        b getcc_trap_handler; mov %psr, %l0; nop; nop
+
+/* The Set Condition Codes software trap for userland. */
+#define SETCC_TRAP \
+        b setcc_trap_handler; mov %psr, %l0; nop; nop
+
 /* This is for hard interrupts from level 1-14, 15 is non-maskable (nmi) and
  * gets handled with another macro.
  */
-
 #define TRAP_ENTRY_INTERRUPT(int_level) \
-        mov int_level, %l3; b stray_irq_entry; rd %psr, %l0; nop;
+        mov int_level, %l3; b real_irq_entry; rd %psr, %l0; nop;
 
-/* Here is the macro for soft interrupts (ie. not as urgent as hard ones)
- * which need to jump to a different handler.
+/* NMI's (Non Maskable Interrupts) are special, you can't keep them
+ * from coming in, and basically if you get one, the shows over. ;(
  */
-
-#define TRAP_ENTRY_INTERRUPT_SOFT(int_level, ident) \
-        mov int_level, %l3; rd %psr, %l0; b stray_irq_entry; mov ident, %l4;
+#define NMI_TRAP \
+        b linux_trap_nmi; mov %psr, %l0; nop; nop
 
 /* The above two macros are for generic traps. The following is made
  * especially for timer interrupts at IRQ level 14.
  */
-
 #define TRAP_ENTRY_TIMER \
-        mov 10, %l3; rd %psr, %l0; b sparc_timer; nop;
-
-/* Non-maskable interrupt entry macro. You have to turn off all interrupts
- * to not receive this. This is usually due to a asynchronous memory error.
- * All we can really do is stop the show. :-(
- */
-
-#define TRAP_ENTRY_INTERRUPT_NMI(t_type, jmp_to) \
-        mov t_type, %l3; b jmp_to; rd %psr, %l0; nop;
+        rd %psr, %l0; b sparc_timer; nop; nop;
 
 /* Trap entry code in entry.S needs the offsets into task_struct
  * to get at the thread_struct goodies during window craziness.
@@ -65,11 +79,43 @@
  *       See TRAP_WIN_CLEAN in entry.S for details.
  */
 
-#define THREAD_UWINDOWS 0x3bc
-#define THREAD_WIM 0x3c0
-#define THREAD_W_SAVED 0x3c4
-#define THREAD_KSP 0x3c8
-#define THREAD_USP 0x3cc
-#define THREAD_REG_WINDOW 0x3d4
+/* First generic task_struct offsets */
+#define TASK_STATE        0x000
+#define TASK_PRI          0x008
+#define TASK_KSTACK_PG    0x250
+
+#define THREAD_UWINDOWS   0x3b8
+#define THREAD_WIM        0x3bc
+#define THREAD_W_SAVED    0x3c0
+#define THREAD_KSP        0x3c4
+#define THREAD_USP        0x3c8
+#define THREAD_PSR        0x3cc
+#define THREAD_PC         0x3d0
+#define THREAD_NPC        0x3d4
+#define THREAD_Y          0x3d8
+#define THREAD_REG_WINDOW 0x3e0
+
+/* More fun offset macros. These are for pt_regs. */
+
+#define PT_PSR    0x0
+#define PT_PC     0x4
+#define PT_NPC    0x8
+#define PT_Y      0xc
+#define PT_G0     0x10
+#define PT_G1     0x14
+#define PT_G2     0x18
+#define PT_G3     0x1c
+#define PT_G4     0x20
+#define PT_G5     0x24
+#define PT_G6     0x28
+#define PT_G7     0x2c
+#define PT_I0     0x30
+#define PT_I1     0x34
+#define PT_I2     0x38
+#define PT_I3     0x3c
+#define PT_I4     0x40
+#define PT_I5     0x44
+#define PT_I6     0x48
+#define PT_I7     0x4c
 
 #endif __SPARC_HEAD_H

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov with Sam's (original) version
of this