Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Memory and machine-specific definitions.  Used in C and assembler.
 */

/*
 * Sizes
 */

#define BI2BY           8                       /* bits per byte */
#define BI2WD           32                      /* bits per word */
#define BY2WD           4                       /* bytes per word */
#define BY2V            8                       /* bytes per vlong */

#define MAXBY2PG (16*1024) /* rounding for UTZERO in executables; see mkfile */
#define UTROUND(t)      ROUNDUP((t), MAXBY2PG)

#ifndef BIGPAGES
#define BY2PG           4096                    /* bytes per page */
#define PGSHIFT         12                      /* log2(BY2PG) */
#define PGSZ            PGSZ4K
#define MACHSIZE        (2*BY2PG)
#else
/* 16K pages work very poorly */
#define BY2PG           (16*1024)               /* bytes per page */
#define PGSHIFT         14                      /* log2(BY2PG) */
#define PGSZ            PGSZ16K
#define MACHSIZE        BY2PG
#endif

#define KSTACK          8192                    /* Size of kernel stack */
#define WD2PG           (BY2PG/BY2WD)           /* words per page */

#define MAXMACH         1   /* max # cpus system can run; see active.machs */
#define STACKALIGN(sp)  ((sp) & ~7)             /* bug: assure with alloc */
#define BLOCKALIGN      16
#define CACHELINESZ     32                      /* mips24k */
#define ICACHESIZE      (64*1024)               /* rb450g */
#define DCACHESIZE      (32*1024)               /* rb450g */

#define MASK(w)         FMASK(0, w)

/*
 * Time
 */
#define HZ              100                     /* clock frequency */
#define MS2HZ           (1000/HZ)               /* millisec per clock tick */
#define TK2SEC(t)       ((t)/HZ)                /* ticks to seconds */

/*
 * CP0 registers
 */

#define INDEX           0
#define RANDOM          1
#define TLBPHYS0        2       /* aka ENTRYLO0 */
#define TLBPHYS1        3       /* aka ENTRYLO1 */
#define CONTEXT         4
#define PAGEMASK        5
#define WIRED           6
#define BADVADDR        8
#define COUNT           9
#define TLBVIRT         10      /* aka ENTRYHI */
#define COMPARE         11
#define STATUS          12
#define CAUSE           13
#define EPC             14
#define PRID            15
#define CONFIG          16
#define LLADDR          17
#define WATCHLO         18
#define WATCHHI         19
#define DEBUG           23
#define DEPC            24
#define PERFCOUNT       25
#define CACHEECC        26
#define CACHEERR        27
#define TAGLO           28
#define TAGHI           29
#define ERROREPC        30
#define DESAVE          31

/*
 * M(STATUS) bits
 */
#define KMODEMASK       0x0000001f
#define IE              0x00000001      /* master interrupt enable */
#define EXL             0x00000002      /* exception level */
#define ERL             0x00000004      /* error level */
#define KSUPER          0x00000008
#define KUSER           0x00000010
#define KSU             0x00000018
//#define UX            0x00000020 /* no [USK]X 64-bit extension bits on 24k */
//#define SX            0x00000040
//#define KX            0x00000080
#define INTMASK         0x0000ff00
#define INTR0           0x00000100      /* interrupt enable bits */
#define INTR1           0x00000200
#define INTR2           0x00000400
#define INTR3           0x00000800
#define INTR4           0x00001000
#define INTR5           0x00002000
#define INTR6           0x00004000
#define INTR7           0x00008000
//#define DE            0x00010000      /* not on 24k */
#define TS              0x00200000      /* tlb shutdown; on 24k at least */
#define BEV             0x00400000      /* bootstrap exception vectors */
#define RE              0x02000000      /* reverse-endian in user mode */
#define FR              0x04000000      /* enable 32 FP regs */
#define CU0             0x10000000
#define CU1             0x20000000      /* FPU enable */

/*
 * M(CONFIG) bits
 */

#define CFG_K0          7       /* kseg0 cachability */
#define CFG_MM          (1<<18) /* write-through merging enabled */

/*
 * M(CAUSE) bits
 */

#define BD              (1<<31) /* last excep'n occurred in branch delay slot */

/*
 * Exception codes
 */
#define EXCMASK 0x1f            /* mask of all causes */
#define CINT     0              /* external interrupt */
#define CTLBM    1              /* TLB modification: store to unwritable page */
#define CTLBL    2              /* TLB miss (load or fetch) */
#define CTLBS    3              /* TLB miss (store) */
#define CADREL   4              /* address error (load or fetch) */
#define CADRES   5              /* address error (store) */
#define CBUSI    6              /* bus error (fetch) */
#define CBUSD    7              /* bus error (data load or store) */
#define CSYS     8              /* system call */
#define CBRK     9              /* breakpoint */
#define CRES    10              /* reserved instruction */
#define CCPU    11              /* coprocessor unusable */
#define COVF    12              /* arithmetic overflow */
#define CTRAP   13              /* trap */
#define CVCEI   14              /* virtual coherence exception (instruction) */
#define CFPE    15              /* floating point exception */
#define CTLBRI  19              /* tlb read-inhibit */
#define CTLBXI  20              /* tlb execute-inhibit */
#define CWATCH  23              /* watch exception */
#define CMCHK   24              /* machine checkcore */
#define CCACHERR 30             /* cache error */
#define CVCED   31              /* virtual coherence exception (data) */

/*
 * M(CACHEECC) a.k.a. ErrCtl bits
 */
#define PE      (1<<31)
#define LBE     (1<<25)
#define WABE    (1<<24)

/*
 * Trap vectors
 */

#define UTLBMISS        (KSEG0+0x000)
#define XEXCEPTION      (KSEG0+0x080)
#define CACHETRAP       (KSEG0+0x100)
#define EXCEPTION       (KSEG0+0x180)

/*
 * Magic registers
 */

#define USER            24              /* R24 is up-> */
#define MACH            25              /* R25 is m-> */

/*
 * offsets in ureg.h for l.s
 */
#define Ureg_status     (Uoffset+0)
#define Ureg_pc         (Uoffset+4)
#define Ureg_sp         (Uoffset+8)
#define Ureg_cause      (Uoffset+12)
#define Ureg_badvaddr   (Uoffset+16)
#define Ureg_tlbvirt    (Uoffset+20)

#define Ureg_hi         (Uoffset+24)
#define Ureg_lo         (Uoffset+28)
#define Ureg_r31        (Uoffset+32)
#define Ureg_r30        (Uoffset+36)
#define Ureg_r28        (Uoffset+40)
#define Ureg_r27        (Uoffset+44)
#define Ureg_r26        (Uoffset+48)
#define Ureg_r25        (Uoffset+52)
#define Ureg_r24        (Uoffset+56)
#define Ureg_r23        (Uoffset+60)
#define Ureg_r22        (Uoffset+64)
#define Ureg_r21        (Uoffset+68)
#define Ureg_r20        (Uoffset+72)
#define Ureg_r19        (Uoffset+76)
#define Ureg_r18        (Uoffset+80)
#define Ureg_r17        (Uoffset+84)
#define Ureg_r16        (Uoffset+88)
#define Ureg_r15        (Uoffset+92)
#define Ureg_r14        (Uoffset+96)
#define Ureg_r13        (Uoffset+100)
#define Ureg_r12        (Uoffset+104)
#define Ureg_r11        (Uoffset+108)
#define Ureg_r10        (Uoffset+112)
#define Ureg_r9         (Uoffset+116)
#define Ureg_r8         (Uoffset+120)
#define Ureg_r7         (Uoffset+124)
#define Ureg_r6         (Uoffset+128)
#define Ureg_r5         (Uoffset+132)
#define Ureg_r4         (Uoffset+136)
#define Ureg_r3         (Uoffset+140)
#define Ureg_r2         (Uoffset+144)
#define Ureg_r1         (Uoffset+148)

/* ch and carrera used these defs */
        /* Sizeof(Ureg) + (R5,R6) + 16 bytes slop + retpc + ur */
// #define UREGSIZE ((Ureg_r1+4-Uoffset) + 2*BY2V + 16 + BY2WD + BY2WD)
// #define Uoffset      8

// #define UREGSIZE     (Ureg_r1 + 4 - Uoffset) /* this ought to work */
#define UREGSIZE ((Ureg_r1+4-Uoffset) + 2*BY2V + 16 + BY2WD + BY2WD)
#define Uoffset         0
#define Notuoffset      8

/*
 * MMU
 */
#define PGSZ4K          (0x00<<13)
#define PGSZ16K         (0x03<<13)      /* on 24k */
#define PGSZ64K         (0x0F<<13)
#define PGSZ256K        (0x3F<<13)
#define PGSZ1M          (0xFF<<13)
#define PGSZ4M          (0x3FF<<13)
// #define PGSZ8M       (0x7FF<<13)     /* not on 24k */
#define PGSZ16M         (0xFFF<<13)
#define PGSZ64M         (0x3FFF<<13)    /* on 24k */
#define PGSZ256M        (0xFFFF<<13)    /* on 24k */

/* mips address spaces, tlb-mapped unless marked otherwise */
#define KUSEG   0x00000000      /* user process */
#define KSEG0   0x80000000      /* kernel (direct mapped, cached) */
#define KSEG1   0xA0000000      /* kernel (direct mapped, uncached: i/o) */
#define KSEG2   0xC0000000      /* kernel, used for TSTKTOP */
#define KSEG3   0xE0000000      /* kernel, used by kmap */
#define KSEGM   0xE0000000      /* mask to check which seg */

/*
 * Fundamental addresses
 */

#define REBOOTADDR      KADDR(0x1000)   /* just above vectors */
#define MACHADDR        0x80005000      /* Mach structures */
#define MACHP(n)        ((Mach *)(MACHADDR+(n)*MACHSIZE))
#define ROM             0xbfc00000
#define KMAPADDR        0xE0000000      /* kmap'd addresses */
#define WIREDADDR       0xE2000000      /* address wired kernel space */

#define PHYSCONS        (KSEG1|0x18020000)              /* i8250 uart */

#define PIDXSHFT        12
#ifndef BIGPAGES
#define NCOLOR          8
#define PIDX            ((NCOLOR-1)<<PIDXSHFT)
#define getpgcolor(a)   (((ulong)(a)>>PIDXSHFT) % NCOLOR)
#else
/* no cache aliases are possible with pages of 16K or larger */
#define NCOLOR          1
#define PIDX            0
#define getpgcolor(a)   0
#endif
#define KMAPSHIFT       15

#define PTEGLOBL        (1<<0)
#define PTEVALID        (1<<1)
#define PTEWRITE        (1<<2)
#define PTERONLY        0
#define PTEALGMASK      (7<<3)
#define PTENONCOHERWT   (0<<3)          /* cached, write-through (slower) */
#define PTEUNCACHED     (2<<3)
#define PTENONCOHERWB   (3<<3)          /* cached, write-back */
#define PTEUNCACHEDACC  (7<<3)
/* rest are reserved on 24k */
#define PTECOHERXCL     (4<<3)
#define PTECOHERXCLW    (5<<3)
#define PTECOHERUPDW    (6<<3)

/* how much faster is it? mflops goes from about .206 (WT) to .37 (WB) */
#define PTECACHABILITY PTENONCOHERWT    /* 24k erratum 48 disallows WB */
// #define PTECACHABILITY PTENONCOHERWB

#define PTEPID(n)       (n)
#define PTEMAPMEM       (1024*1024)
#define PTEPERTAB       (PTEMAPMEM/BY2PG)
#define SEGMAPSIZE      512
#define SSEGMAPSIZE     16

#define STLBLOG         15
#define STLBSIZE        (1<<STLBLOG)    /* entries in the soft TLB */
/* page # bits that don't fit in STLBLOG bits */
#define HIPFNBITS       (BI2WD - (PGSHIFT+1) - STLBLOG)
#define KPTELOG         8
#define KPTESIZE        (1<<KPTELOG)    /* entries in the kfault soft TLB */

#define TLBPID(n) ((n)&0xFF)
#define NTLBPID 256             /* # of pids (affects size of Mach) */
#define NTLB    16              /* # of entries (mips 24k) */
#define TLBOFF  1               /* first tlb entry (0 used within mmuswitch) */
#define NKTLB   2               /* # of initial kfault tlb entries */
#define WTLBOFF (TLBOFF+NKTLB)  /* first large IO window tlb entry */
#define NWTLB   0                /* # of large IO window tlb entries */
#define TLBROFF (WTLBOFF+NWTLB) /* offset of first randomly-indexed entry */

/*
 * Address spaces
 */
#define UZERO   KUSEG                   /* base of user address space */
#define UTZERO  (UZERO+MAXBY2PG)        /* 1st user text address; see mkfile */
#define USTKTOP (KZERO-BY2PG)           /* byte just beyond user stack */
#define USTKSIZE (8*1024*1024)          /* size of user stack */
#define TSTKTOP (KSEG2+USTKSIZE-BY2PG)  /* top of temporary stack */
#define TSTKSIZ (1024*1024/BY2PG)       /* can be at most UTSKSIZE/BY2PG */
#define KZERO   KSEG0                   /* base of kernel address space */
#define KTZERO  (KZERO+0x20000)         /* first address in kernel text */
#define MEMSIZE (256*MB)                /* fixed memory on routerboard */
#define PCIMEM  0x10000000              /* on rb450g */