Changeset e3c762cd in mainline for arch/mips32/src/mm/tlb.c


Ignore:
Timestamp:
2006-05-05T11:59:19Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
de07bcf
Parents:
22cf454d
Message:

Complete implementation of copy_from_uspace() and copy_to_uspace()
for amd64 and ia32. Other architectures still compile and run,
but need to implement their own assembly-only memcpy(), memcpy_from_uspace(),
memcpy_to_uspace() and their failover parts. For these architectures
only dummy implementations are provided.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/mips32/src/mm/tlb.c

    r22cf454d re3c762cd  
    4545static void tlb_modified_fail(istate_t *istate);
    4646
    47 static pte_t *find_mapping_and_check(__address badvaddr);
     47static pte_t *find_mapping_and_check(__address badvaddr, istate_t *istate, int *pfrc);
    4848
    4949static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, __address pfn);
     
    9292        __address badvaddr;
    9393        pte_t *pte;
     94        int pfrc;
    9495
    9596        badvaddr = cp0_badvaddr_read();
     
    101102        page_table_lock(AS, true);
    102103
    103         pte = find_mapping_and_check(badvaddr);
    104         if (!pte)
    105                 goto fail;
     104        pte = find_mapping_and_check(badvaddr, istate, &pfrc);
     105        if (!pte) {
     106                switch (pfrc) {
     107                case AS_PF_FAULT:
     108                        goto fail;
     109                        break;
     110                case AS_PF_DEFER:
     111                        /*
     112                         * The page fault came during copy_from_uspace()
     113                         * or copy_to_uspace().
     114                         */
     115                        page_table_unlock(AS, true);
     116                        return;
     117                default:
     118                        panic("unexpected pfrc (%d)\n", pfrc);
     119                }
     120        }
    106121
    107122        /*
     
    149164        entry_hi_t hi;
    150165        pte_t *pte;
     166        int pfrc;
    151167
    152168        badvaddr = cp0_badvaddr_read();
     
    171187        }
    172188
    173         pte = find_mapping_and_check(badvaddr);
    174         if (!pte)
    175                 goto fail;
     189        pte = find_mapping_and_check(badvaddr, istate, &pfrc);
     190        if (!pte) {
     191                switch (pfrc) {
     192                case AS_PF_FAULT:
     193                        goto fail;
     194                        break;
     195                case AS_PF_DEFER:
     196                        /*
     197                         * The page fault came during copy_from_uspace()
     198                         * or copy_to_uspace().
     199                         */
     200                        page_table_unlock(AS, true);                     
     201                        return;
     202                default:
     203                        panic("unexpected pfrc (%d)\n", pfrc);
     204                }
     205        }
    176206
    177207        /*
     
    218248        entry_hi_t hi;
    219249        pte_t *pte;
     250        int pfrc;
    220251
    221252        badvaddr = cp0_badvaddr_read();
     
    240271        }
    241272
    242         pte = find_mapping_and_check(badvaddr);
    243         if (!pte)
    244                 goto fail;
     273        pte = find_mapping_and_check(badvaddr, istate, &pfrc);
     274        if (!pte) {
     275                switch (pfrc) {
     276                case AS_PF_FAULT:
     277                        goto fail;
     278                        break;
     279                case AS_PF_DEFER:
     280                        /*
     281                         * The page fault came during copy_from_uspace()
     282                         * or copy_to_uspace().
     283                         */
     284                        page_table_unlock(AS, true);                     
     285                        return;
     286                default:
     287                        panic("unexpected pfrc (%d)\n", pfrc);
     288                }
     289        }
    245290
    246291        /*
     
    322367 *
    323368 * @param badvaddr Faulting virtual address.
     369 * @param istate Pointer to interrupted state.
     370 * @param pfrc Pointer to variable where as_page_fault() return code will be stored.
    324371 *
    325372 * @return PTE on success, NULL otherwise.
    326373 */
    327 pte_t *find_mapping_and_check(__address badvaddr)
     374pte_t *find_mapping_and_check(__address badvaddr, istate_t *istate, int *pfrc)
    328375{
    329376        entry_hi_t hi;
     
    351398                return pte;
    352399        } else {
     400                int rc;
     401               
    353402                /*
    354403                 * Mapping not found in page tables.
     
    356405                 */
    357406                page_table_unlock(AS, true);
    358                 if (as_page_fault(badvaddr)) {
     407                switch (rc = as_page_fault(badvaddr, istate)) {
     408                case AS_PF_OK:
    359409                        /*
    360410                         * The higher-level page fault handler succeeded,
     
    365415                        ASSERT(pte && pte->p);
    366416                        return pte;
    367                 } else {
     417                        break;
     418                case AS_PF_DEFER:
     419                        page_table_lock(AS, true);
     420                        *pfrc = AS_PF_DEFER;
     421                        return NULL;
     422                        break;
     423                case AS_PF_FAULT:
    368424                        page_table_lock(AS, true);
    369425                        printf("Page fault.\n");
     426                        *pfrc = AS_PF_FAULT;
    370427                        return NULL;
     428                        break;
     429                default:
     430                        panic("unexpected rc (%d)\n", rc);
    371431                }
    372432               
Note: See TracChangeset for help on using the changeset viewer.