Changeset a7961271 in mainline for kernel/arch/sparc64/src/mm


Ignore:
Timestamp:
2006-08-26T18:42:11Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c8ea4a8b
Parents:
f47fd19
Message:

sparc64 work.
Bunch of changes in preparation for sparc64 mm and userspace support.
Fix alignment of hardcoded_* variables in linker script.

File:
1 edited

Legend:

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

    rf47fd19 ra7961271  
    5151#include <symtab.h>
    5252
    53 static void dtlb_pte_copy(pte_t *t);
     53static void dtlb_pte_copy(pte_t *t, bool ro);
     54static void itlb_pte_copy(pte_t *t);
    5455static void do_fast_data_access_mmu_miss_fault(istate_t *istate, const char *str);
     56static void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, const char *str);
    5557
    5658char *context_encoding[] = {
     
    106108}
    107109
    108 void dtlb_pte_copy(pte_t *t)
    109 {
     110/** Copy PTE to TLB.
     111 *
     112 * @param t Page Table Entry to be copied.
     113 * @param ro If true, the entry will be created read-only, regardless of its w field.
     114 */
     115void dtlb_pte_copy(pte_t *t, bool ro)
     116{
     117        tlb_tag_access_reg_t tag;
     118        tlb_data_t data;
     119        page_address_t pg;
     120        frame_address_t fr;
     121
     122        pg.address = t->page;
     123        fr.address = t->frame;
     124
     125        tag.value = 0;
     126        tag.context = t->as->asid;
     127        tag.vpn = pg.vpn;
     128       
     129        dtlb_tag_access_write(tag.value);
     130       
     131        data.value = 0;
     132        data.v = true;
     133        data.size = PAGESIZE_8K;
     134        data.pfn = fr.pfn;
     135        data.l = false;
     136        data.cp = t->c;
     137        data.cv = t->c;
     138        data.p = t->p;
     139        data.w = ro ? false : t->w;
     140        data.g = t->g;
     141       
     142        dtlb_data_in_write(data.value);
     143}
     144
     145void itlb_pte_copy(pte_t *t)
     146{
     147        tlb_tag_access_reg_t tag;
     148        tlb_data_t data;
     149        page_address_t pg;
     150        frame_address_t fr;
     151
     152        pg.address = t->page;
     153        fr.address = t->frame;
     154
     155        tag.value = 0;
     156        tag.context = t->as->asid;
     157        tag.vpn = pg.vpn;
     158       
     159        itlb_tag_access_write(tag.value);
     160       
     161        data.value = 0;
     162        data.v = true;
     163        data.size = PAGESIZE_8K;
     164        data.pfn = fr.pfn;
     165        data.l = false;
     166        data.cp = t->c;
     167        data.cv = t->c;
     168        data.p = t->p;
     169        data.w = false;
     170        data.g = t->g;
     171       
     172        itlb_data_in_write(data.value);
    110173}
    111174
     
    113176void fast_instruction_access_mmu_miss(int n, istate_t *istate)
    114177{
    115         panic("%s\n", __FUNCTION__);
     178        uintptr_t va = ALIGN_DOWN(istate->tpc, PAGE_SIZE);
     179        pte_t *t;
     180
     181        page_table_lock(AS, true);
     182        t = page_mapping_find(AS, va);
     183        if (t && PTE_EXECUTABLE(t)) {
     184                /*
     185                 * The mapping was found in the software page hash table.
     186                 * Insert it into ITLB.
     187                 */
     188                t->a = true;
     189                itlb_pte_copy(t);
     190                page_table_unlock(AS, true);
     191        } else {
     192                /*
     193                 * Forward the page fault to the address space page fault handler.
     194                 */             
     195                page_table_unlock(AS, true);
     196                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
     197                        do_fast_instruction_access_mmu_miss_fault(istate, __FUNCTION__);
     198                }
     199        }
    116200}
    117201
     
    145229                 * Insert it into DTLB.
    146230                 */
    147                 dtlb_pte_copy(t);
     231                t->a = true;
     232                dtlb_pte_copy(t, true);
    148233                page_table_unlock(AS, true);
    149234        } else {
     
    191276}
    192277
     278void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, const char *str)
     279{
     280        char *tpc_str = get_symtab_entry(istate->tpc);
     281
     282        printf("TPC=%p, (%s)\n", istate->tpc, tpc_str);
     283        panic("%s\n", str);
     284}
     285
    193286void do_fast_data_access_mmu_miss_fault(istate_t *istate, const char *str)
    194287{
Note: See TracChangeset for help on using the changeset viewer.