Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/mm/sun4v/tlb.c

    r1dbc43f r560b81c  
    4646#include <arch.h>
    4747#include <print.h>
     48#include <log.h>
    4849#include <typedefs.h>
    4950#include <config.h>
     
    207208
    208209/** ITLB miss handler. */
    209 void fast_instruction_access_mmu_miss(sysarg_t unused, istate_t *istate)
     210void fast_instruction_access_mmu_miss(unsigned int tt, istate_t *istate)
    210211{
    211212        uintptr_t va = ALIGN_DOWN(istate->tpc, PAGE_SIZE);
    212         pte_t *t;
    213 
    214         t = page_mapping_find(AS, va, true);
    215 
    216         if (t && PTE_EXECUTABLE(t)) {
     213        pte_t t;
     214
     215        bool found = page_mapping_find(AS, va, true, &t);
     216        if (found && PTE_EXECUTABLE(&t)) {
     217                ASSERT(t.p);
     218
    217219                /*
    218220                 * The mapping was found in the software page hash table.
    219221                 * Insert it into ITLB.
    220222                 */
    221                 t->a = true;
    222                 itlb_pte_copy(t);
     223                t.a = true;
     224                itlb_pte_copy(&t);
    223225#ifdef CONFIG_TSB
    224                 itsb_pte_copy(t);
    225 #endif
     226                itsb_pte_copy(&t);
     227#endif
     228                page_mapping_update(AS, va, true, &t);
    226229        } else {
    227230                /*
     
    238241 * low-level, assembly language part of the fast_data_access_mmu_miss handler.
    239242 *
    240  * @param page_and_ctx  A 64-bit value describing the fault. The most
    241  *                      significant 51 bits of the value contain the virtual
    242  *                      address which caused the fault truncated to the page
    243  *                      boundary. The least significant 13 bits of the value
    244  *                      contain the number of the context in which the fault
    245  *                      occurred.
     243 * @param tt            Trap type.
    246244 * @param istate        Interrupted state saved on the stack.
    247245 */
    248 void fast_data_access_mmu_miss(uint64_t page_and_ctx, istate_t *istate)
    249 {
    250         pte_t *t;
    251         uintptr_t va = DMISS_ADDRESS(page_and_ctx);
    252         uint16_t ctx = DMISS_CONTEXT(page_and_ctx);
     246void fast_data_access_mmu_miss(unsigned int tt, istate_t *istate)
     247{
     248        pte_t t;
     249        uintptr_t va = DMISS_ADDRESS(istate->tlb_tag_access);
     250        uint16_t ctx = DMISS_CONTEXT(istate->tlb_tag_access);
     251        as_t *as = AS;
    253252
    254253        if (ctx == ASID_KERNEL) {
     
    256255                        /* NULL access in kernel */
    257256                        panic("NULL pointer dereference.");
     257                } else if (va >= end_of_identity) {
     258                        /* Kernel non-identity */
     259                        as = AS_KERNEL;
     260                } else {
     261                        panic("Unexpected kernel page fault.");
    258262                }
    259                 panic("Unexpected kernel page fault.");
    260         }
    261 
    262         t = page_mapping_find(AS, va, true);
    263         if (t) {
     263        }
     264
     265        bool found = page_mapping_find(as, va, true, &t);
     266        if (found) {
     267                ASSERT(t.p);
     268
    264269                /*
    265270                 * The mapping was found in the software page hash table.
    266271                 * Insert it into DTLB.
    267272                 */
    268                 t->a = true;
    269                 dtlb_pte_copy(t, true);
     273                t.a = true;
     274                dtlb_pte_copy(&t, true);
    270275#ifdef CONFIG_TSB
    271                 dtsb_pte_copy(t, true);
    272 #endif
     276                dtsb_pte_copy(&t, true);
     277#endif
     278                page_mapping_update(as, va, true, &t);
    273279        } else {
    274280                /*
     
    282288/** DTLB protection fault handler.
    283289 *
    284  * @param page_and_ctx  A 64-bit value describing the fault. The most
    285  *                      significant 51 bits of the value contain the virtual
    286  *                      address which caused the fault truncated to the page
    287  *                      boundary. The least significant 13 bits of the value
    288  *                      contain the number of the context in which the fault
    289  *                      occurred.
     290 * @param tt            Trap type.
    290291 * @param istate        Interrupted state saved on the stack.
    291292 */
    292 void fast_data_access_protection(uint64_t page_and_ctx, istate_t *istate)
    293 {
    294         pte_t *t;
    295         uintptr_t va = DMISS_ADDRESS(page_and_ctx);
    296         uint16_t ctx = DMISS_CONTEXT(page_and_ctx);
    297 
    298         t = page_mapping_find(AS, va, true);
    299         if (t && PTE_WRITABLE(t)) {
     293void fast_data_access_protection(unsigned int tt, istate_t *istate)
     294{
     295        pte_t t;
     296        uintptr_t va = DMISS_ADDRESS(istate->tlb_tag_access);
     297        uint16_t ctx = DMISS_CONTEXT(istate->tlb_tag_access);
     298        as_t *as = AS;
     299
     300        if (ctx == ASID_KERNEL)
     301                as = AS_KERNEL;
     302
     303        bool found = page_mapping_find(as, va, true, &t);
     304        if (found && PTE_WRITABLE(&t)) {
     305                ASSERT(t.p);
     306
    300307                /*
    301308                 * The mapping was found in the software page hash table and is
     
    303310                 * into DTLB.
    304311                 */
    305                 t->a = true;
    306                 t->d = true;
     312                t.a = true;
     313                t.d = true;
    307314                mmu_demap_page(va, ctx, MMU_FLAG_DTLB);
    308                 dtlb_pte_copy(t, false);
     315                dtlb_pte_copy(&t, false);
    309316#ifdef CONFIG_TSB
    310                 dtsb_pte_copy(t, false);
    311 #endif
     317                dtsb_pte_copy(&t, false);
     318#endif
     319                page_mapping_update(as, va, true, &t);
    312320        } else {
    313321                /*
     
    326334void tlb_print(void)
    327335{
    328         printf("Operation not possible on Niagara.\n");
     336        log(LF_ARCH, LVL_WARN, "Operation not possible on Niagara.");
    329337}
    330338
     
    383391
    384392        for (i = 0; i < cnt; i++) {
    385                 __hypercall_fast5(MMU_DEMAP_PAGE, 0, 0, page, asid,
    386                         MMU_FLAG_DTLB | MMU_FLAG_ITLB);
     393                __hypercall_fast5(MMU_DEMAP_PAGE, 0, 0, page + i * PAGE_SIZE,
     394                    asid, MMU_FLAG_DTLB | MMU_FLAG_ITLB);
    387395        }
    388396
Note: See TracChangeset for help on using the changeset viewer.