Support for 64 bit PTEs on n32 and n64 compilation.
In n32 and n64, add support for physical address above 4GB by having 64 bit page table entries and physical addresses. Major changes are: - param.h: update PTE sizes, masks and shift values to support 64 bit PTEs. - param.h: remove DELAY(), mips_btop(same as atop), mips_ptob (same as ptoa), and reformat. - param.h: remove casting to unsigned long in trunc_page and round_page since this will be used on physical addresses. - _types.h: have 64 bit __vm_paddr_t for n32. - pte.h: update TLB LO0/1 access macros to support 64 bit PTE - pte.h: assembly macros for PTE operations. - proc.h: md_upte is now 64 bit for n32 and n64. - exception.S and swtch.S: use the new PTE macros for PTE operations. - cpufunc.h: TLB_LO0/1 registers are 64bit for n32 and n64. - xlr_machdep.c: Add memory segments above 4GB to phys_avail[] as they are supported now. Reviewed by: jmallett (earlier version)
This commit is contained in:
parent
267bbb0105
commit
564c9a855e
@ -133,13 +133,17 @@ typedef __uint32_t __u_register_t;
|
||||
#endif
|
||||
#ifdef __LP64__
|
||||
typedef __uint64_t __vm_offset_t;
|
||||
typedef __uint64_t __vm_paddr_t;
|
||||
typedef __uint64_t __vm_size_t;
|
||||
#else
|
||||
typedef __uint32_t __vm_offset_t;
|
||||
typedef __uint32_t __vm_paddr_t;
|
||||
typedef __uint32_t __vm_size_t;
|
||||
#endif
|
||||
#if defined(__LP64__) || defined(__mips_n32) /* PHYSADDR_64_BIT */
|
||||
typedef __uint64_t __vm_paddr_t;
|
||||
#else
|
||||
typedef __uint32_t __vm_paddr_t;
|
||||
#endif
|
||||
|
||||
typedef __int64_t __vm_ooffset_t;
|
||||
typedef __uint64_t __vm_pindex_t;
|
||||
|
||||
|
@ -138,11 +138,13 @@ mips_wr_ ## n (uint64_t a0) \
|
||||
|
||||
#if defined(__mips_n64)
|
||||
MIPS_RW64_COP0(excpc, MIPS_COP_0_EXC_PC);
|
||||
MIPS_RW64_COP0(entrylo0, MIPS_COP_0_TLB_LO0);
|
||||
MIPS_RW64_COP0(entrylo1, MIPS_COP_0_TLB_LO1);
|
||||
MIPS_RW64_COP0(entryhi, MIPS_COP_0_TLB_HI);
|
||||
MIPS_RW64_COP0(pagemask, MIPS_COP_0_TLB_PG_MASK);
|
||||
#endif
|
||||
#if defined(__mips_n64) || defined(__mips_n32) /* PHYSADDR_64_BIT */
|
||||
MIPS_RW64_COP0(entrylo0, MIPS_COP_0_TLB_LO0);
|
||||
MIPS_RW64_COP0(entrylo1, MIPS_COP_0_TLB_LO1);
|
||||
#endif
|
||||
MIPS_RW64_COP0(xcontext, MIPS_COP_0_TLB_XCONTEXT);
|
||||
|
||||
#undef MIPS_RW64_COP0
|
||||
@ -221,11 +223,13 @@ MIPS_RW32_COP0(status, MIPS_COP_0_STATUS);
|
||||
|
||||
/* XXX: Some of these registers are specific to MIPS32. */
|
||||
#if !defined(__mips_n64)
|
||||
MIPS_RW32_COP0(entrylo0, MIPS_COP_0_TLB_LO0);
|
||||
MIPS_RW32_COP0(entrylo1, MIPS_COP_0_TLB_LO1);
|
||||
MIPS_RW32_COP0(entryhi, MIPS_COP_0_TLB_HI);
|
||||
MIPS_RW32_COP0(pagemask, MIPS_COP_0_TLB_PG_MASK);
|
||||
#endif
|
||||
#if !defined(__mips_n64) && !defined(__mips_n32) /* !PHYSADDR_64_BIT */
|
||||
MIPS_RW32_COP0(entrylo0, MIPS_COP_0_TLB_LO0);
|
||||
MIPS_RW32_COP0(entrylo1, MIPS_COP_0_TLB_LO1);
|
||||
#endif
|
||||
MIPS_RW32_COP0(prid, MIPS_COP_0_PRID);
|
||||
/* XXX 64-bit? */
|
||||
MIPS_RW32_COP0_SEL(ebase, MIPS_COP_0_PRID, 1);
|
||||
|
@ -116,31 +116,39 @@
|
||||
#define CACHE_LINE_SHIFT 6
|
||||
#define CACHE_LINE_SIZE (1 << CACHE_LINE_SHIFT)
|
||||
|
||||
#define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */
|
||||
#define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */
|
||||
#define PAGE_MASK (PAGE_SIZE-1)
|
||||
#define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */
|
||||
#define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */
|
||||
#define PAGE_MASK (PAGE_SIZE-1)
|
||||
|
||||
#define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t)))
|
||||
#define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t)))
|
||||
#define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t)))
|
||||
#define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t)))
|
||||
|
||||
#if defined(__mips_n64)
|
||||
#define SEGSHIFT 31 /* LOG2(NBSEG) */
|
||||
#define NBSEG (1ul << SEGSHIFT) /* bytes/segment */
|
||||
#define PDRSHIFT 22 /* second level */
|
||||
#define PDRMASK ((1 << PDRSHIFT) - 1)
|
||||
#if defined(__mips_n32) || defined(__mips_n64) /* PHYSADDR_64_BIT */
|
||||
#define NPTEPGSHIFT 9 /* LOG2(NPTEPG) */
|
||||
#else
|
||||
#define SEGSHIFT 22 /* LOG2(NBSEG) */
|
||||
#define NBSEG (1 << SEGSHIFT) /* bytes/segment */
|
||||
#define PDRSHIFT SEGSHIFT /* alias for SEG in 32 bit */
|
||||
#define PDRMASK ((1 << PDRSHIFT) - 1)
|
||||
#define NPTEPGSHIFT 10 /* LOG2(NPTEPG) */
|
||||
#endif
|
||||
#define NBPDR (1 << PDRSHIFT) /* bytes/pagedir */
|
||||
#define SEGMASK (NBSEG-1) /* byte offset into segment */
|
||||
|
||||
#define MAXPAGESIZES 1 /* maximum number of supported page sizes */
|
||||
#ifdef __mips_n64
|
||||
#define NPDEPGSHIFT 9 /* LOG2(NPTEPG) */
|
||||
#define SEGSHIFT (PAGE_SHIFT + NPTEPGSHIFT + NPDEPGSHIFT)
|
||||
#define NBSEG (1ul << SEGSHIFT)
|
||||
#define PDRSHIFT (PAGE_SHIFT + NPTEPGSHIFT)
|
||||
#define PDRMASK ((1 << PDRSHIFT) - 1)
|
||||
#else
|
||||
#define NPDEPGSHIFT 10 /* LOG2(NPTEPG) */
|
||||
#define SEGSHIFT (PAGE_SHIFT + NPTEPGSHIFT)
|
||||
#define NBSEG (1 << SEGSHIFT) /* bytes/segment */
|
||||
#define PDRSHIFT SEGSHIFT /* alias for SEG in 32 bit */
|
||||
#define PDRMASK ((1 << PDRSHIFT) - 1)
|
||||
#endif
|
||||
#define NBPDR (1 << PDRSHIFT) /* bytes/pagedir */
|
||||
#define SEGMASK (NBSEG - 1) /* byte offset into segment */
|
||||
|
||||
#define BLKDEV_IOSIZE 2048 /* xxx: Why is this 1/2 page? */
|
||||
#define MAXDUMPPGS 1 /* xxx: why is this only one? */
|
||||
#define MAXPAGESIZES 1 /* max supported pagesizes */
|
||||
|
||||
#define BLKDEV_IOSIZE 2048 /* xxx: Why is this 1/2 page? */
|
||||
#define MAXDUMPPGS 1 /* xxx: why is this only one? */
|
||||
|
||||
/*
|
||||
* The kernel stack needs to be aligned on a (PAGE_SIZE * 2) boundary.
|
||||
@ -151,8 +159,8 @@
|
||||
#define UPAGES 2
|
||||
|
||||
/* pages ("clicks") (4096 bytes) to disk blocks */
|
||||
#define ctod(x) ((x) << (PAGE_SHIFT - DEV_BSHIFT))
|
||||
#define dtoc(x) ((x) >> (PAGE_SHIFT - DEV_BSHIFT))
|
||||
#define ctod(x) ((x) << (PAGE_SHIFT - DEV_BSHIFT))
|
||||
#define dtoc(x) ((x) >> (PAGE_SHIFT - DEV_BSHIFT))
|
||||
|
||||
/*
|
||||
* Map a ``block device block'' to a file system block.
|
||||
@ -160,24 +168,17 @@
|
||||
* field from the disk label.
|
||||
* For now though just use DEV_BSIZE.
|
||||
*/
|
||||
#define bdbtofsb(bn) ((bn) / (BLKDEV_IOSIZE/DEV_BSIZE))
|
||||
#define bdbtofsb(bn) ((bn) / (BLKDEV_IOSIZE/DEV_BSIZE))
|
||||
|
||||
/*
|
||||
* Mach derived conversion macros
|
||||
*/
|
||||
#define round_page(x) (((unsigned long)(x) + PAGE_MASK) & ~PAGE_MASK)
|
||||
#define trunc_page(x) ((unsigned long)(x) & ~PAGE_MASK)
|
||||
#define round_page(x) (((x) + PAGE_MASK) & ~PAGE_MASK)
|
||||
#define trunc_page(x) ((x) & ~PAGE_MASK)
|
||||
|
||||
#define atop(x) ((unsigned long)(x) >> PAGE_SHIFT)
|
||||
#define ptoa(x) ((unsigned long)(x) << PAGE_SHIFT)
|
||||
#define atop(x) ((x) >> PAGE_SHIFT)
|
||||
#define ptoa(x) ((x) << PAGE_SHIFT)
|
||||
|
||||
#define mips_btop(x) ((unsigned long)(x) >> PAGE_SHIFT)
|
||||
#define mips_ptob(x) ((unsigned long)(x) << PAGE_SHIFT)
|
||||
|
||||
#define pgtok(x) ((unsigned long)(x) * (PAGE_SIZE / 1024))
|
||||
|
||||
#ifndef _KERNEL
|
||||
#define DELAY(n) { register int N = (n); while (--N > 0); }
|
||||
#endif /* !_KERNEL */
|
||||
#define pgtok(x) ((x) * (PAGE_SIZE / 1024))
|
||||
|
||||
#endif /* !_MIPS_INCLUDE_PARAM_H_ */
|
||||
|
@ -43,17 +43,21 @@
|
||||
* Machine-dependent part of the proc structure.
|
||||
*/
|
||||
struct mdthread {
|
||||
int md_flags; /* machine-dependent flags */
|
||||
int md_upte[KSTACK_PAGES]; /* ptes for mapping u pcb */
|
||||
int md_ss_addr; /* single step address for ptrace */
|
||||
int md_ss_instr; /* single step instruction for ptrace */
|
||||
int md_flags; /* machine-dependent flags */
|
||||
#if defined(__mips_n64) || defined(__mips_n32) /* PHYSADDR_64_BIT */
|
||||
uint64_t md_upte[KSTACK_PAGES]; /* ptes for mapping u pcb */
|
||||
#else
|
||||
int md_upte[KSTACK_PAGES];
|
||||
#endif
|
||||
int md_ss_addr; /* single step address for ptrace */
|
||||
int md_ss_instr; /* single step instruction for ptrace */
|
||||
register_t md_saved_intr;
|
||||
u_int md_spinlock_count;
|
||||
u_int md_spinlock_count;
|
||||
/* The following is CPU dependent, but kept in for compatibility */
|
||||
int md_pc_ctrl; /* performance counter control */
|
||||
int md_pc_count; /* performance counter */
|
||||
int md_pc_spill; /* performance counter spill */
|
||||
void *md_tls;
|
||||
int md_pc_ctrl; /* performance counter control */
|
||||
int md_pc_count; /* performance counter */
|
||||
int md_pc_spill; /* performance counter spill */
|
||||
void *md_tls;
|
||||
};
|
||||
|
||||
/* md_flags */
|
||||
|
@ -30,8 +30,11 @@
|
||||
#define _MACHINE_PTE_H_
|
||||
|
||||
#ifndef _LOCORE
|
||||
/* pt_entry_t is 32 bit for now, has to be made 64 bit for n64 */
|
||||
#if defined(__mips_n64) || defined(__mips_n32) /* PHYSADDR_64_BIT */
|
||||
typedef uint64_t pt_entry_t;
|
||||
#else
|
||||
typedef uint32_t pt_entry_t;
|
||||
#endif
|
||||
typedef pt_entry_t *pd_entry_t;
|
||||
#endif
|
||||
|
||||
@ -61,10 +64,15 @@ typedef pt_entry_t *pd_entry_t;
|
||||
* written as anything, but otherwise they have as much meaning as
|
||||
* other 0 fields.
|
||||
*/
|
||||
#if defined(__mips_n64) || defined(__mips_n32) /* PHYSADDR_64_BIT */
|
||||
#define TLBLO_SWBITS_SHIFT (34)
|
||||
#define TLBLO_PFN_MASK 0x3FFFFFFC0ULL
|
||||
#else
|
||||
#define TLBLO_SWBITS_SHIFT (30)
|
||||
#define TLBLO_SWBITS_MASK (0x3U << TLBLO_SWBITS_SHIFT)
|
||||
#define TLBLO_PFN_SHIFT (6)
|
||||
#define TLBLO_PFN_MASK (0x3FFFFFC0)
|
||||
#endif
|
||||
#define TLBLO_PFN_SHIFT (6)
|
||||
#define TLBLO_SWBITS_MASK ((pt_entry_t)0x3 << TLBLO_SWBITS_SHIFT)
|
||||
#define TLBLO_PA_TO_PFN(pa) ((((pa) >> TLB_PAGE_SHIFT) << TLBLO_PFN_SHIFT) & TLBLO_PFN_MASK)
|
||||
#define TLBLO_PFN_TO_PA(pfn) ((vm_paddr_t)((pfn) >> TLBLO_PFN_SHIFT) << TLB_PAGE_SHIFT)
|
||||
#define TLBLO_PTE_TO_PFN(pte) ((pte) & TLBLO_PFN_MASK)
|
||||
@ -96,10 +104,10 @@ typedef pt_entry_t *pd_entry_t;
|
||||
#define TLBHI_ENTRY(va, asid) ((TLBHI_VA_R((va))) /* Region. */ | \
|
||||
(TLBHI_VA_TO_VPN2((va))) /* VPN2. */ | \
|
||||
((asid) & TLBHI_ASID_MASK))
|
||||
#else
|
||||
#else /* !defined(__mips_n64) */
|
||||
#define TLBHI_PAGE_MASK (2 * PAGE_SIZE - 1)
|
||||
#define TLBHI_ENTRY(va, asid) (((va) & ~TLBHI_PAGE_MASK) | ((asid) & TLBHI_ASID_MASK))
|
||||
#endif
|
||||
#endif /* defined(__mips_n64) */
|
||||
|
||||
/*
|
||||
* TLB flags managed in hardware:
|
||||
@ -112,12 +120,12 @@ typedef pt_entry_t *pd_entry_t;
|
||||
* in EVERY address space, and to ignore the ASID when
|
||||
* it is matched.
|
||||
*/
|
||||
#define PTE_C(attr) ((attr & 0x07) << 3)
|
||||
#define PTE_C_UNCACHED (PTE_C(MIPS_CCA_UNCACHED))
|
||||
#define PTE_C_CACHE (PTE_C(MIPS_CCA_CACHED))
|
||||
#define PTE_D 0x04
|
||||
#define PTE_V 0x02
|
||||
#define PTE_G 0x01
|
||||
#define PTE_C(attr) ((attr & 0x07) << 3)
|
||||
#define PTE_C_UNCACHED (PTE_C(MIPS_CCA_UNCACHED))
|
||||
#define PTE_C_CACHE (PTE_C(MIPS_CCA_CACHED))
|
||||
#define PTE_D 0x04
|
||||
#define PTE_V 0x02
|
||||
#define PTE_G 0x01
|
||||
|
||||
/*
|
||||
* VM flags managed in software:
|
||||
@ -125,8 +133,8 @@ typedef pt_entry_t *pd_entry_t;
|
||||
* listen to requests to write to it.
|
||||
* W: Wired. ???
|
||||
*/
|
||||
#define PTE_RO (0x01 << TLBLO_SWBITS_SHIFT)
|
||||
#define PTE_W (0x02 << TLBLO_SWBITS_SHIFT)
|
||||
#define PTE_RO ((pt_entry_t)0x01 << TLBLO_SWBITS_SHIFT)
|
||||
#define PTE_W ((pt_entry_t)0x02 << TLBLO_SWBITS_SHIFT)
|
||||
|
||||
/*
|
||||
* PTE management functions for bits defined above.
|
||||
@ -135,4 +143,33 @@ typedef pt_entry_t *pd_entry_t;
|
||||
#define pte_set(pte, bit) (*(pte) |= (bit))
|
||||
#define pte_test(pte, bit) ((*(pte) & (bit)) == (bit))
|
||||
|
||||
/* Assembly support for PTE access*/
|
||||
#ifdef LOCORE
|
||||
#if defined(__mips_n64) || defined(__mips_n32) /* PHYSADDR_64_BIT */
|
||||
#define PTESHIFT 3
|
||||
#define PTE2MASK 0xff0 /* for the 2-page lo0/lo1 */
|
||||
#define PTEMASK 0xff8
|
||||
#define PTESIZE 8
|
||||
#define PTE_L ld
|
||||
#define PTE_MTC0 dmtc0
|
||||
#define CLEAR_PTE_SWBITS(pr)
|
||||
#else
|
||||
#define PTESHIFT 2
|
||||
#define PTE2MASK 0xff8 /* for the 2-page lo0/lo1 */
|
||||
#define PTEMASK 0xffc
|
||||
#define PTESIZE 4
|
||||
#define PTE_L lw
|
||||
#define PTE_MTC0 mtc0
|
||||
#define CLEAR_PTE_SWBITS(r) sll r, 2; srl r, 2 /* remove 2 high bits */
|
||||
#endif /* defined(__mips_n64) || defined(__mips_n32) */
|
||||
|
||||
#if defined(__mips_n64)
|
||||
#define PTRSHIFT 3
|
||||
#define PDEPTRMASK 0xff8
|
||||
#else
|
||||
#define PTRSHIFT 2
|
||||
#define PDEPTRMASK 0xffc
|
||||
#endif
|
||||
|
||||
#endif /* LOCORE */
|
||||
#endif /* !_MACHINE_PTE_H_ */
|
||||
|
@ -182,7 +182,7 @@ cb_dumpdata(struct md_pa *mdp, int seqnr, void *arg)
|
||||
counter &= (1<<24) - 1;
|
||||
}
|
||||
|
||||
error = dump_write(di, (void *)(pa),0, dumplo, sz);
|
||||
error = dump_write(di, (void *)(intptr_t)(pa),0, dumplo, sz); /* XXX fix PA */
|
||||
if (error)
|
||||
break;
|
||||
dumplo += sz;
|
||||
|
@ -66,28 +66,13 @@
|
||||
|
||||
#include "assym.s"
|
||||
|
||||
/*
|
||||
* Clear the software-managed bits in a PTE in register pr.
|
||||
*/
|
||||
#define CLEAR_PTE_SWBITS(pr) \
|
||||
sll pr, 2 ; \
|
||||
srl pr, 2 # keep bottom 30 bits
|
||||
|
||||
.set noreorder # Noreorder is default style!
|
||||
.set noreorder # Noreorder is default style!
|
||||
|
||||
/*
|
||||
* Reasonable limit
|
||||
*/
|
||||
#define INTRCNT_COUNT 128
|
||||
|
||||
/* Pointer size and mask for n64 */
|
||||
#if defined(__mips_n64)
|
||||
#define PTRSHIFT 3
|
||||
#define PTRMASK 0xff8
|
||||
#else
|
||||
#define PTRSHIFT 2
|
||||
#define PTRMASK 0xffc
|
||||
#endif
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------------
|
||||
@ -131,7 +116,7 @@ MipsDoTLBMiss:
|
||||
GET_CPU_PCPU(k1)
|
||||
PTR_L k1, PC_SEGBASE(k1)
|
||||
beqz k1, 2f #05: make sure segbase is not null
|
||||
andi k0, k0, PTRMASK #06: k0=seg offset
|
||||
andi k0, k0, PDEPTRMASK #06: k0=seg offset
|
||||
PTR_ADDU k1, k0, k1 #07: k1=seg entry address
|
||||
|
||||
PTR_L k1, 0(k1) #08: k1=seg entry
|
||||
@ -139,22 +124,22 @@ MipsDoTLBMiss:
|
||||
beq k1, zero, 2f #0a: ==0 -- no page table
|
||||
#ifdef __mips_n64
|
||||
PTR_SRL k0, PDRSHIFT - PTRSHIFT # k0=VPN
|
||||
andi k0, k0, PTRMASK # k0=pde offset
|
||||
andi k0, k0, PDEPTRMASK # k0=pde offset
|
||||
PTR_ADDU k1, k0, k1 # k1=pde entry address
|
||||
PTR_L k1, 0(k1) # k1=pde entry
|
||||
MFC0 k0, MIPS_COP_0_BAD_VADDR # k0=bad address (again)
|
||||
beq k1, zero, 2f # ==0 -- no page table
|
||||
#endif
|
||||
PTR_SRL k0, PAGE_SHIFT - 2 #0b: k0=VPN (aka va>>10)
|
||||
andi k0, k0, 0xff8 #0c: k0=page tab offset
|
||||
PTR_SRL k0, PAGE_SHIFT - PTESHIFT #0b: k0=VPN (aka va>>10)
|
||||
andi k0, k0, PTE2MASK #0c: k0=page tab offset
|
||||
PTR_ADDU k1, k1, k0 #0d: k1=pte address
|
||||
lw k0, 0(k1) #0e: k0=lo0 pte
|
||||
lw k1, 4(k1) #0f: k1=lo0 pte
|
||||
PTE_L k0, 0(k1) #0e: k0=lo0 pte
|
||||
PTE_L k1, PTESIZE(k1) #0f: k1=lo0 pte
|
||||
CLEAR_PTE_SWBITS(k0)
|
||||
MTC0 k0, MIPS_COP_0_TLB_LO0 #12: lo0 is loaded
|
||||
PTE_MTC0 k0, MIPS_COP_0_TLB_LO0 #12: lo0 is loaded
|
||||
COP0_SYNC
|
||||
CLEAR_PTE_SWBITS(k1)
|
||||
MTC0 k1, MIPS_COP_0_TLB_LO1 #15: lo1 is loaded
|
||||
PTE_MTC0 k1, MIPS_COP_0_TLB_LO1 #15: lo1 is loaded
|
||||
COP0_SYNC
|
||||
tlbwr #1a: write to tlb
|
||||
HAZARD_DELAY
|
||||
@ -824,7 +809,7 @@ NLEAF(MipsTLBInvalidException)
|
||||
|
||||
PTR_SRL k0, SEGSHIFT - PTRSHIFT # k0=seg offset (almost)
|
||||
beq k1, zero, MipsKernGenException # ==0 -- no seg tab
|
||||
andi k0, k0, PTRMASK # k0=seg offset
|
||||
andi k0, k0, PDEPTRMASK #06: k0=seg offset
|
||||
PTR_ADDU k1, k0, k1 # k1=seg entry address
|
||||
PTR_L k1, 0(k1) # k1=seg entry
|
||||
|
||||
@ -836,7 +821,7 @@ NLEAF(MipsTLBInvalidException)
|
||||
MFC0 k0, MIPS_COP_0_BAD_VADDR
|
||||
PTR_SRL k0, PDRSHIFT - PTRSHIFT # k0=pde offset (almost)
|
||||
beq k1, zero, MipsKernGenException # ==0 -- no pde tab
|
||||
andi k0, k0, PTRMASK # k0=pde offset
|
||||
andi k0, k0, PDEPTRMASK # k0=pde offset
|
||||
PTR_ADDU k1, k0, k1 # k1=pde entry address
|
||||
PTR_L k1, 0(k1) # k1=pde entry
|
||||
|
||||
@ -845,10 +830,10 @@ NLEAF(MipsTLBInvalidException)
|
||||
nop
|
||||
#endif
|
||||
MFC0 k0, MIPS_COP_0_BAD_VADDR # k0=bad address (again)
|
||||
PTR_SRL k0, PAGE_SHIFT - 2 # k0=VPN
|
||||
andi k0, k0, 0xffc # k0=page tab offset
|
||||
PTR_SRL k0, PAGE_SHIFT - PTESHIFT # k0=VPN
|
||||
andi k0, k0, PTEMASK # k0=page tab offset
|
||||
PTR_ADDU k1, k1, k0 # k1=pte address
|
||||
lw k0, 0(k1) # k0=this PTE
|
||||
PTE_L k0, 0(k1) # k0=this PTE
|
||||
|
||||
/* Validate page table entry. */
|
||||
andi k0, PTE_V
|
||||
@ -856,30 +841,30 @@ NLEAF(MipsTLBInvalidException)
|
||||
nop
|
||||
|
||||
/* Check whether this is an even or odd entry. */
|
||||
andi k0, k1, 4
|
||||
andi k0, k1, PTESIZE
|
||||
bnez k0, odd_page
|
||||
nop
|
||||
|
||||
lw k0, 0(k1)
|
||||
lw k1, 4(k1)
|
||||
PTE_L k0, 0(k1)
|
||||
PTE_L k1, PTESIZE(k1)
|
||||
CLEAR_PTE_SWBITS(k0)
|
||||
MTC0 k0, MIPS_COP_0_TLB_LO0
|
||||
PTE_MTC0 k0, MIPS_COP_0_TLB_LO0
|
||||
COP0_SYNC
|
||||
CLEAR_PTE_SWBITS(k1)
|
||||
MTC0 k1, MIPS_COP_0_TLB_LO1
|
||||
PTE_MTC0 k1, MIPS_COP_0_TLB_LO1
|
||||
COP0_SYNC
|
||||
|
||||
b tlb_insert_entry
|
||||
nop
|
||||
|
||||
odd_page:
|
||||
lw k0, -4(k1)
|
||||
lw k1, 0(k1)
|
||||
PTE_L k0, -PTESIZE(k1)
|
||||
PTE_L k1, 0(k1)
|
||||
CLEAR_PTE_SWBITS(k0)
|
||||
MTC0 k0, MIPS_COP_0_TLB_LO0
|
||||
PTE_MTC0 k0, MIPS_COP_0_TLB_LO0
|
||||
COP0_SYNC
|
||||
CLEAR_PTE_SWBITS(k1)
|
||||
MTC0 k1, MIPS_COP_0_TLB_LO1
|
||||
PTE_MTC0 k1, MIPS_COP_0_TLB_LO1
|
||||
COP0_SYNC
|
||||
|
||||
tlb_insert_entry:
|
||||
@ -999,29 +984,29 @@ NLEAF(MipsTLBMissException)
|
||||
PTR_SRL k0, SEGSHIFT - PTRSHIFT # k0=seg offset (almost)
|
||||
PTR_L k1, %lo(kernel_segmap)(k1) # k1=segment tab base
|
||||
beq k1, zero, MipsKernGenException # ==0 -- no seg tab
|
||||
andi k0, k0, PTRMASK # k0=seg offset
|
||||
andi k0, k0, PDEPTRMASK #06: k0=seg offset
|
||||
PTR_ADDU k1, k0, k1 # k1=seg entry address
|
||||
PTR_L k1, 0(k1) # k1=seg entry
|
||||
MFC0 k0, MIPS_COP_0_BAD_VADDR # k0=bad address (again)
|
||||
beq k1, zero, MipsKernGenException # ==0 -- no page table
|
||||
#ifdef __mips_n64
|
||||
PTR_SRL k0, PDRSHIFT - PTRSHIFT # k0=VPN
|
||||
andi k0, k0, PTRMASK # k0=pde offset
|
||||
andi k0, k0, PDEPTRMASK # k0=pde offset
|
||||
PTR_ADDU k1, k0, k1 # k1=pde entry address
|
||||
PTR_L k1, 0(k1) # k1=pde entry
|
||||
MFC0 k0, MIPS_COP_0_BAD_VADDR # k0=bad address (again)
|
||||
beq k1, zero, MipsKernGenException # ==0 -- no page table
|
||||
#endif
|
||||
PTR_SRL k0, PAGE_SHIFT - 2 # k0=VPN
|
||||
andi k0, k0, 0xff8 # k0=page tab offset
|
||||
PTR_SRL k0, PAGE_SHIFT - PTESHIFT # k0=VPN
|
||||
andi k0, k0, PTE2MASK # k0=page tab offset
|
||||
PTR_ADDU k1, k1, k0 # k1=pte address
|
||||
lw k0, 0(k1) # k0=lo0 pte
|
||||
lw k1, 4(k1) # k1=lo1 pte
|
||||
PTE_L k0, 0(k1) # k0=lo0 pte
|
||||
PTE_L k1, PTESIZE(k1) # k1=lo1 pte
|
||||
CLEAR_PTE_SWBITS(k0)
|
||||
MTC0 k0, MIPS_COP_0_TLB_LO0 # lo0 is loaded
|
||||
PTE_MTC0 k0, MIPS_COP_0_TLB_LO0 # lo0 is loaded
|
||||
COP0_SYNC
|
||||
CLEAR_PTE_SWBITS(k1)
|
||||
MTC0 k1, MIPS_COP_0_TLB_LO1 # lo1 is loaded
|
||||
PTE_MTC0 k1, MIPS_COP_0_TLB_LO1 # lo1 is loaded
|
||||
COP0_SYNC
|
||||
tlbwr # write to tlb
|
||||
HAZARD_DELAY
|
||||
|
@ -205,8 +205,9 @@ cpu_startup(void *dummy)
|
||||
|
||||
vm_ksubmap_init(&kmi);
|
||||
|
||||
printf("avail memory = %lu (%luMB)\n", ptoa(cnt.v_free_count),
|
||||
ptoa(cnt.v_free_count) / 1048576);
|
||||
printf("avail memory = %ju (%juMB)\n",
|
||||
ptoa((uintmax_t)cnt.v_free_count),
|
||||
ptoa((uintmax_t)cnt.v_free_count) / 1048576);
|
||||
cpu_init_interrupts();
|
||||
|
||||
/*
|
||||
|
@ -3151,7 +3151,7 @@ pmap_asid_alloc(pmap)
|
||||
int
|
||||
page_is_managed(vm_paddr_t pa)
|
||||
{
|
||||
vm_offset_t pgnum = mips_btop(pa);
|
||||
vm_offset_t pgnum = atop(pa);
|
||||
|
||||
if (pgnum >= first_page) {
|
||||
vm_page_t m;
|
||||
|
@ -91,6 +91,7 @@
|
||||
#define RESTORE_U_PCB_CONTEXT(reg, offs, base) \
|
||||
REG_L reg, U_PCB_CONTEXT + (SZREG * offs) (base)
|
||||
|
||||
|
||||
/*
|
||||
* Setup for and return to user.
|
||||
*/
|
||||
@ -284,8 +285,8 @@ blocked_loop:
|
||||
PTR_LI s0, MIPS_KSEG2_START # If Uarea addr is below kseg2,
|
||||
#endif
|
||||
bltu v0, s0, sw2 # no need to insert in TLB.
|
||||
lw a1, TD_UPTE + 0(s7) # a1 = u. pte #0
|
||||
lw a2, TD_UPTE + 4(s7) # a2 = u. pte #1
|
||||
PTE_L a1, TD_UPTE + 0(s7) # a1 = u. pte #0
|
||||
PTE_L a2, TD_UPTE + PTESIZE(s7) # a2 = u. pte #1
|
||||
/*
|
||||
* Wiredown the USPACE of newproc in TLB entry#0. Check whether target
|
||||
* USPACE is already in another place of TLB before that, and if so
|
||||
@ -306,8 +307,8 @@ blocked_loop:
|
||||
sll s0, PAGE_SHIFT + 1
|
||||
addu t1, s0
|
||||
MTC0 t1, MIPS_COP_0_TLB_HI
|
||||
mtc0 zero, MIPS_COP_0_TLB_LO0
|
||||
mtc0 zero, MIPS_COP_0_TLB_LO1
|
||||
PTE_MTC0 zero, MIPS_COP_0_TLB_LO0
|
||||
PTE_MTC0 zero, MIPS_COP_0_TLB_LO1
|
||||
HAZARD_DELAY
|
||||
tlbwi
|
||||
HAZARD_DELAY
|
||||
@ -317,9 +318,9 @@ entry0set:
|
||||
/* SMP!! - Works only for unshared TLB case - i.e. no v-cpus */
|
||||
mtc0 zero, MIPS_COP_0_TLB_INDEX # TLB entry #0
|
||||
HAZARD_DELAY
|
||||
mtc0 a1, MIPS_COP_0_TLB_LO0 # upte[0]
|
||||
PTE_MTC0 a1, MIPS_COP_0_TLB_LO0 # upte[0]
|
||||
HAZARD_DELAY
|
||||
mtc0 a2, MIPS_COP_0_TLB_LO1 # upte[1]
|
||||
PTE_MTC0 a2, MIPS_COP_0_TLB_LO1 # upte[1]
|
||||
HAZARD_DELAY
|
||||
tlbwi # set TLB entry #0
|
||||
HAZARD_DELAY
|
||||
|
@ -365,6 +365,7 @@ xlr_mem_init(void)
|
||||
dump_avail[0] = phys_avail[0];
|
||||
dump_avail[1] = phys_avail[1];
|
||||
} else {
|
||||
#if !defined(__mips_n64) && !defined(__mips_n32) /* !PHYSADDR_64_BIT */
|
||||
/*
|
||||
* In 32 bit physical address mode we cannot use
|
||||
* mem > 0xffffffff
|
||||
@ -383,6 +384,7 @@ xlr_mem_init(void)
|
||||
printf("Memory: start %#jx limited to 4GB\n",
|
||||
(intmax_t)boot_map->physmem_map[i].addr);
|
||||
}
|
||||
#endif /* !PHYSADDR_64_BIT */
|
||||
phys_avail[j] = (vm_paddr_t)
|
||||
boot_map->physmem_map[i].addr;
|
||||
phys_avail[j + 1] = phys_avail[j] +
|
||||
|
Loading…
Reference in New Issue
Block a user