Subject: Re: Are page tables allocated in KSEG0 or in KSEG2?

From: Ralf Baechle <[email-masked]>
Date: Tue, 3 Jul 2001 13:05:31 +0200

On Sat, Jun 30, 2001 at 02:51:17PM +0530, Raghav P wrote:

> I was going thru the TLB exception for R2300 and had the following doubts
> which I hope someone can help me out with. ( am sorry if this is a newbie
> question but since this is MIPS specific I am posting here)
> 
> The code is in arch/mips/kernel/head.S for user TLB:
> 
>         /* TLB refill, EXL == 0, R[23]00 version */
>         LEAF(except_vec0_r2300)
>         .set    noat
>         .set    mips1
>         mfc0    k0, CP0_BADVADDR
>         lw      k1, current_pgd                 # get pgd pointer
>         srl     k0, k0, 22
>         sll     k0, k0, 2
>         addu    k1, k1, k0
>         mfc0    k0, CP0_CONTEXT
>         lw      k1, (k1)
>         and     k0, k0, 0xffc
>         addu    k1, k1, k0
>         lw      k0, (k1)
>         nop
>         mtc0    k0, CP0_ENTRYLO0
>         mfc0    k1, CP0_EPC
>         tlbwr
>         jr      k1
>         rfe
>         END(except_vec0_r2300)
> 
> My linux book says that pgd and pte entries are not setup by the kernel
> until a pagefault exception occurs.
> The above code will work only if the pgd and pte tables are stored in kseg2;
> if they were stored in kseg0 then if a pgd has an invalid pte entry the
> above code will index into an invalid pte page and get a wrong physical
> address.
> But the pgd_alloc() and pte_alloc() routines seem to be allocating physical
> pages from kseg0 for pgd and pte tables.
> Am I missing something here???

We avoid having to deal with the special case of a non-existant parts of the
page table except the actual ptes themselfes by having making those pgd
pointers point to invalid_pte_table.

  Ralf