/* * 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 double word */ #define BY2PG 4096 /* bytes per page */ #define WD2PG (BY2PG/BY2WD) /* words per page */ #define PGSHIFT 12 /* log(BY2PG) */ #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1)) #define PGROUND(s) ROUND(s, BY2PG) #define BIT(n) (1< 4096 descriptors -> 16Kb * L2: 8-bit index -> 256 descriptors -> 1Kb * Each L2 descriptor has access permissions for 4 1Kb sub-pages. * * TTB + L1Tx gives address of L1 descriptor * L1 descriptor gives PTBA * PTBA + L2Tx gives address of L2 descriptor * L2 descriptor gives PBA */ #define MmuSection (1<<20) #define MmuLargePage (1<<16) #define MmuSmallPage (1<<12) #define MmuTTB(pa) ((pa) & ~0x3FFF) /* translation table base */ #define MmuL1x(pa) (((pa)>>20) & 0xFFF) /* L1 table index */ #define MmuPTBA(pa) ((pa) & ~0x3FF) /* page table base address */ #define MmuL2x(pa) (((pa)>>12) & 0xFF) /* L2 table index */ #define MmuPBA(pa) ((pa) & ~0xFFF) /* page base address */ #define MmuSBA(pa) ((pa) & ~0xFFFFF) /* section base address */ #define MmuL1type 0x03 #define MmuL1page 0x01 /* descriptor is for L2 pages */ #define MmuL1section 0x02 /* descriptor is for section */ #define MmuL2invalid 0x000 #define MmuL2large 0x001 /* large */ #define MmuL2small 0x002 /* small */ #define MmuWB 0x004 /* data goes through write buffer */ #define MmuIDC 0x008 /* data placed in cache */ #define MmuDAC(d) (((d) & 0xF)<<5) /* L1 domain */ #define MmuAP(i, v) ((v)<<(((i)*2)+4)) /* access permissions */ #define MmuL1AP(v) MmuAP(3, (v)) #define MmuL2AP(v) MmuAP(3, (v))|MmuAP(2, (v))|MmuAP(1, (v))|MmuAP(0, (v)) #define MmuAPsro 0 /* supervisor ro if S|R */ #define MmuAPsrw 1 /* supervisor rw */ #define MmuAPuro 2 /* supervisor rw + user ro */ #define MmuAPurw 3 /* supervisor rw + user rw */