Changeset 0867321 in mainline for kernel/arch/ppc32/src


Ignore:
Timestamp:
2009-02-02T18:06:15Z (17 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
cdda403
Parents:
7b187ef
Message:

very experimental TLB refill for ppc32

Location:
kernel/arch/ppc32/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ppc32/src/exception.S

    r7b187ef r0867321  
    209209.global exc_syscall
    210210exc_syscall:
    211         CONTEXT_STORE   
     211        CONTEXT_STORE
    212212       
    213213        b jump_to_kernel_syscall
     
    220220        li r3, 12
    221221        b jump_to_kernel
     222
     223.org 0x1000
     224.global exc_itlb_miss
     225exc_itlb_miss:
     226        CONTEXT_STORE
     227       
     228        b tlb_miss
     229
     230.org 0x1100
     231.global exc_dtlb_miss_load
     232exc_dtlb_miss_load:
     233        CONTEXT_STORE
     234       
     235        b tlb_miss
     236
     237.org 0x1200
     238.global exc_dtlb_miss_store
     239exc_dtlb_miss_store:
     240        CONTEXT_STORE
     241       
     242        b tlb_miss
    222243
    223244.org 0x4000
     
    245266        li r3, 3
    246267        b jump_to_kernel
     268
     269tlb_miss:
     270        li r3, 16
     271        mfspr r4, tlbmiss
     272        mfspr r5, ptehi
     273        mfspr r6, ptelo
     274        mr r7, sp
     275        addi r7, r7, 20
     276       
     277        bl tlb_refill_real
     278        b iret_real
    247279
    248280jump_to_kernel:
  • kernel/arch/ppc32/src/mm/tlb.c

    r7b187ef r0867321  
    228228
    229229
    230 /** Process Instruction/Data Storage Interrupt
    231  *
    232  * @param n             Interrupt vector number.
    233  * @param istate        Interrupted register context.
     230/** Process Instruction/Data Storage Exception
     231 *
     232 * @param n      Exception vector number.
     233 * @param istate Interrupted register context.
    234234 *
    235235 */
     
    288288
    289289
    290 /** Process Instruction/Data Storage Interrupt in Real Mode
    291  *
    292  * @param n             Interrupt vector number.
    293  * @param istate        Interrupted register context.
     290/** Process Instruction/Data Storage Exception in Real Mode
     291 *
     292 * @param n      Exception vector number.
     293 * @param istate Interrupted register context.
    294294 *
    295295 */
     
    406406       
    407407        return true;
     408}
     409
     410
     411/** Process ITLB/DTLB Miss Exception in Real Mode
     412 *
     413 *
     414 */
     415void tlb_refill_real(int n, uint32_t tlbmiss, ptehi_t ptehi, ptelo_t ptelo, istate_t *istate)
     416{
     417        uint32_t badvaddr = tlbmiss & 0xfffffffc;
     418       
     419        uint32_t physmem;
     420        asm volatile (
     421                "mfsprg3 %0\n"
     422                : "=r" (physmem)
     423        );
     424       
     425        if ((badvaddr < PA2KA(0)) || (badvaddr >= PA2KA(physmem)))
     426                return; // FIXME
     427       
     428        ptelo.rpn = KA2PA(badvaddr) >> 12;
     429        ptelo.wimg = 0;
     430        ptelo.pp = 2; // FIXME
     431       
     432        uint32_t index = 0;
     433        asm volatile (
     434                "mtspr 981, %0\n"
     435                "mtspr 982, %1\n"
     436                "tlbld %2\n"
     437                "tlbli %2\n"
     438                : "=r" (index)
     439                : "r" (ptehi),
     440                  "r" (ptelo)
     441        );
    408442}
    409443
Note: See TracChangeset for help on using the changeset viewer.