Changeset ad4b32c in mainline for kernel/arch/ia64/src


Ignore:
Timestamp:
2009-09-04T21:50:59Z (16 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
309ede1
Parents:
7e266ff (diff), 40240b1 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

Location:
kernel/arch/ia64/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/mm/as.c

    r7e266ff rad4b32c  
    5555void as_install_arch(as_t *as)
    5656{
    57         region_register rr;
     57        region_register_t rr;
    5858        int i;
    5959       
  • kernel/arch/ia64/src/mm/page.c

    r7e266ff rad4b32c  
    6363void set_environment(void)
    6464{
    65         region_register rr;
    66         pta_register pta;
     65        region_register_t rr;
     66        pta_register_t pta;
    6767        int i;
    6868#ifdef CONFIG_VHPT
     
    131131vhpt_entry_t *vhpt_hash(uintptr_t page, asid_t asid)
    132132{
    133         region_register rr_save, rr;
     133        region_register_t rr_save, rr;
    134134        size_t vrn;
    135135        rid_t rid;
     
    176176bool vhpt_compare(uintptr_t page, asid_t asid, vhpt_entry_t *v)
    177177{
    178         region_register rr_save, rr;   
     178        region_register_t rr_save, rr;
    179179        size_t vrn;
    180180        rid_t rid;
     
    223223    int flags)
    224224{
    225         region_register rr_save, rr;   
     225        region_register_t rr_save, rr;
    226226        size_t vrn;
    227227        rid_t rid;
     
    257257        v->present.ma = (flags & PAGE_CACHEABLE) ?
    258258            MA_WRITEBACK : MA_UNCACHEABLE;
    259         v->present.a = false;   /* not accessed */
    260         v->present.d = false;   /* not dirty */
     259        v->present.a = false;  /* not accessed */
     260        v->present.d = false;  /* not dirty */
    261261        v->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL;
    262262        v->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ;
    263263        v->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0;
    264264        v->present.ppn = frame >> PPN_SHIFT;
    265         v->present.ed = false;  /* exception not deffered */
     265        v->present.ed = false;  /* exception not deffered */
    266266        v->present.ps = PAGE_WIDTH;
    267267        v->present.key = 0;
  • kernel/arch/ia64/src/mm/tlb.c

    r7e266ff rad4b32c  
    2727 */
    2828
    29 /** @addtogroup ia64mm 
     29/** @addtogroup ia64mm
    3030 * @{
    3131 */
     
    5353#include <interrupt.h>
    5454
     55#define IO_FRAME_BASE 0xFFFFC000000
     56
    5557/** Invalidate all TLB entries. */
    5658void tlb_invalidate_all(void)
     
    5961        uintptr_t adr;
    6062        uint32_t count1, count2, stride1, stride2;
    61                
     63       
    6264        unsigned int i, j;
    63                
     65       
    6466        adr = PAL_PTCE_INFO_BASE();
    6567        count1 = PAL_PTCE_INFO_COUNT1();
     
    6769        stride1 = PAL_PTCE_INFO_STRIDE1();
    6870        stride2 = PAL_PTCE_INFO_STRIDE2();
    69                
     71       
    7072        ipl = interrupts_disable();
    71 
     73       
    7274        for (i = 0; i < count1; i++) {
    7375                for (j = 0; j < count2; j++) {
    7476                        asm volatile (
    75                                 "ptc.e %0 ;;"
    76                                 :
    77                                 : "r" (adr)
     77                                "ptc.e %[adr] ;;"
     78                                :: [adr] "r" (adr)
    7879                        );
    7980                        adr += stride2;
     
    8182                adr += stride1;
    8283        }
    83 
     84       
    8485        interrupts_restore(ipl);
    85 
     86       
    8687        srlz_d();
    8788        srlz_i();
     89       
    8890#ifdef CONFIG_VHPT
    8991        vhpt_invalidate_all();
    90 #endif 
     92#endif
    9193}
    9294
    9395/** Invalidate entries belonging to an address space.
    9496 *
    95  * @param asid          Address space identifier.
     97 * @param asid Address space identifier.
     98 *
    9699 */
    97100void tlb_invalidate_asid(asid_t asid)
     
    103106void tlb_invalidate_pages(asid_t asid, uintptr_t page, size_t cnt)
    104107{
    105         region_register rr;
     108        region_register_t rr;
    106109        bool restore_rr = false;
    107110        int b = 0;
    108111        int c = cnt;
    109 
     112       
    110113        uintptr_t va;
    111114        va = page;
    112 
     115       
    113116        rr.word = rr_read(VA2VRN(va));
    114117        if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) {
     
    117120                 * Save the old content of the register and replace the RID.
    118121                 */
    119                 region_register rr0;
    120 
     122                region_register_t rr0;
     123               
    121124                rr0 = rr;
    122125                rr0.map.rid = ASID2RID(asid, VA2VRN(va));
     
    126129        }
    127130       
    128         while(c >>= 1)
     131        while (c >>= 1)
    129132                b++;
    130133        b >>= 1;
     
    169172                break;
    170173        }
    171         for(; va < (page + cnt * PAGE_SIZE); va += (1 << ps))
    172                 asm volatile ("ptc.l %0, %1;;" :: "r" (va), "r" (ps << 2));
     174       
     175        for (; va < (page + cnt * PAGE_SIZE); va += (1 << ps))
     176                asm volatile (
     177                        "ptc.l %[va], %[ps] ;;"
     178                        :: [va]"r" (va),
     179                           [ps] "r" (ps << 2)
     180                );
     181       
    173182        srlz_d();
    174183        srlz_i();
     
    183192/** Insert data into data translation cache.
    184193 *
    185  * @param va            Virtual page address.
    186  * @param asid          Address space identifier.
    187  * @param entry         The rest of TLB entry as required by TLB insertion
    188  *                      format.
     194 * @param va    Virtual page address.
     195 * @param asid  Address space identifier.
     196 * @param entry The rest of TLB entry as required by TLB insertion
     197 *              format.
     198 *
    189199 */
    190200void dtc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry)
     
    195205/** Insert data into instruction translation cache.
    196206 *
    197  * @param va            Virtual page address.
    198  * @param asid          Address space identifier.
    199  * @param entry         The rest of TLB entry as required by TLB insertion
    200  *                      format.
     207 * @param va    Virtual page address.
     208 * @param asid  Address space identifier.
     209 * @param entry The rest of TLB entry as required by TLB insertion
     210 *              format.
    201211 */
    202212void itc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry)
     
    207217/** Insert data into instruction or data translation cache.
    208218 *
    209  * @param va            Virtual page address.
    210  * @param asid          Address space identifier.
    211  * @param entry         The rest of TLB entry as required by TLB insertion
    212  *                      format.
    213  * @param dtc           If true, insert into data translation cache, use
    214  *                      instruction translation cache otherwise.
     219 * @param va    Virtual page address.
     220 * @param asid  Address space identifier.
     221 * @param entry The rest of TLB entry as required by TLB insertion
     222 *              format.
     223 * @param dtc   If true, insert into data translation cache, use
     224 *              instruction translation cache otherwise.
     225 *
    215226 */
    216227void tc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtc)
    217228{
    218         region_register rr;
     229        region_register_t rr;
    219230        bool restore_rr = false;
    220 
     231       
    221232        rr.word = rr_read(VA2VRN(va));
    222233        if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) {
     
    225236                 * Save the old content of the register and replace the RID.
    226237                 */
    227                 region_register rr0;
    228 
     238                region_register_t rr0;
     239               
    229240                rr0 = rr;
    230241                rr0.map.rid = ASID2RID(asid, VA2VRN(va));
     
    235246       
    236247        asm volatile (
    237                 "mov r8 = psr;;\n"
    238                 "rsm %0;;\n"                    /* PSR_IC_MASK */
    239                 "srlz.d;;\n"
    240                 "srlz.i;;\n"
    241                 "mov cr.ifa = %1\n"             /* va */
    242                 "mov cr.itir = %2;;\n"          /* entry.word[1] */
    243                 "cmp.eq p6,p7 = %4,r0;;\n"      /* decide between itc and dtc */
    244                 "(p6) itc.i %3;;\n"
    245                 "(p7) itc.d %3;;\n"
    246                 "mov psr.l = r8;;\n"
    247                 "srlz.d;;\n"
    248                 :
    249                 : "i" (PSR_IC_MASK), "r" (va), "r" (entry.word[1]),
    250                     "r" (entry.word[0]), "r" (dtc)
     248                "mov r8 = psr ;;\n"
     249                "rsm %[mask] ;;\n"                 /* PSR_IC_MASK */
     250                "srlz.d ;;\n"
     251                "srlz.i ;;\n"
     252                "mov cr.ifa = %[va]\n"             /* va */
     253                "mov cr.itir = %[word1] ;;\n"      /* entry.word[1] */
     254                "cmp.eq p6, p7 = %[dtc], r0 ;;\n"  /* decide between itc and dtc */
     255                "(p6) itc.i %[word0] ;;\n"
     256                "(p7) itc.d %[word0] ;;\n"
     257                "mov psr.l = r8 ;;\n"
     258                "srlz.d ;;\n"
     259                :: [mask] "i" (PSR_IC_MASK),
     260                   [va] "r" (va),
     261                   [word0] "r" (entry.word[0]),
     262                   [word1] "r" (entry.word[1]),
     263                   [dtc] "r" (dtc)
    251264                : "p6", "p7", "r8"
    252265        );
     
    261274/** Insert data into instruction translation register.
    262275 *
    263  * @param va            Virtual page address.
    264  * @param asid          Address space identifier.
    265  * @param entry         The rest of TLB entry as required by TLB insertion
    266  *                      format.
    267  * @param tr            Translation register.
    268  */
    269 void
    270 itr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, size_t tr)
     276 * @param va    Virtual page address.
     277 * @param asid  Address space identifier.
     278 * @param entry The rest of TLB entry as required by TLB insertion
     279 *              format.
     280 * @param tr    Translation register.
     281 *
     282 */
     283void itr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, size_t tr)
    271284{
    272285        tr_mapping_insert(va, asid, entry, false, tr);
     
    275288/** Insert data into data translation register.
    276289 *
    277  * @param va            Virtual page address.
    278  * @param asid          Address space identifier.
    279  * @param entry         The rest of TLB entry as required by TLB insertion
    280  *                      format.
    281  * @param tr            Translation register.
    282  */
    283 void
    284 dtr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, size_t tr)
     290 * @param va    Virtual page address.
     291 * @param asid  Address space identifier.
     292 * @param entry The rest of TLB entry as required by TLB insertion
     293 *              format.
     294 * @param tr    Translation register.
     295 *
     296 */
     297void dtr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, size_t tr)
    285298{
    286299        tr_mapping_insert(va, asid, entry, true, tr);
     
    289302/** Insert data into instruction or data translation register.
    290303 *
    291  * @param va            Virtual page address.
    292  * @param asid          Address space identifier.
    293  * @param entry         The rest of TLB entry as required by TLB insertion
    294  *                      format.
    295  * @param dtr           If true, insert into data translation register, use
    296  *                      instruction translation register otherwise.
    297  * @param tr            Translation register.
    298  */
    299 void
    300 tr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtr,
     304 * @param va    Virtual page address.
     305 * @param asid  Address space identifier.
     306 * @param entry The rest of TLB entry as required by TLB insertion
     307 *              format.
     308 * @param dtr   If true, insert into data translation register, use
     309 *              instruction translation register otherwise.
     310 * @param tr    Translation register.
     311 *
     312 */
     313void tr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtr,
    301314    size_t tr)
    302315{
    303         region_register rr;
     316        region_register_t rr;
    304317        bool restore_rr = false;
    305 
     318       
    306319        rr.word = rr_read(VA2VRN(va));
    307320        if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) {
     
    310323                 * Save the old content of the register and replace the RID.
    311324                 */
    312                 region_register rr0;
    313 
     325                region_register_t rr0;
     326               
    314327                rr0 = rr;
    315328                rr0.map.rid = ASID2RID(asid, VA2VRN(va));
     
    318331                srlz_i();
    319332        }
    320 
     333       
    321334        asm volatile (
    322                 "mov r8 = psr;;\n"
    323                 "rsm %0;;\n"                    /* PSR_IC_MASK */
    324                 "srlz.d;;\n"
    325                 "srlz.i;;\n"
    326                 "mov cr.ifa = %1\n"             /* va */                 
    327                 "mov cr.itir = %2;;\n"          /* entry.word[1] */
    328                 "cmp.eq p6,p7 = %5,r0;;\n"      /* decide between itr and dtr */
    329                 "(p6) itr.i itr[%4] = %3;;\n"
    330                 "(p7) itr.d dtr[%4] = %3;;\n"
    331                 "mov psr.l = r8;;\n"
    332                 "srlz.d;;\n"
    333                 :
    334                 : "i" (PSR_IC_MASK), "r" (va), "r" (entry.word[1]),
    335                     "r" (entry.word[0]), "r" (tr), "r" (dtr)
     335                "mov r8 = psr ;;\n"
     336                "rsm %[mask] ;;\n"                       /* PSR_IC_MASK */
     337                "srlz.d ;;\n"
     338                "srlz.i ;;\n"
     339                "mov cr.ifa = %[va]\n"                   /* va */
     340                "mov cr.itir = %[word1] ;;\n"            /* entry.word[1] */
     341                "cmp.eq p6, p7 = %[dtr], r0 ;;\n"        /* decide between itr and dtr */
     342                "(p6) itr.i itr[%[tr]] = %[word0] ;;\n"
     343                "(p7) itr.d dtr[%[tr]] = %[word0] ;;\n"
     344                "mov psr.l = r8 ;;\n"
     345                "srlz.d ;;\n"
     346                :: [mask] "i" (PSR_IC_MASK),
     347                   [va] "r" (va),
     348                   [word1] "r" (entry.word[1]),
     349                   [word0] "r" (entry.word[0]),
     350                   [tr] "r" (tr),
     351                   [dtr] "r" (dtr)
    336352                : "p6", "p7", "r8"
    337353        );
     
    346362/** Insert data into DTLB.
    347363 *
    348  * @param page          Virtual page address including VRN bits.
    349  * @param frame         Physical frame address.
    350  * @param dtr           If true, insert into data translation register, use data
    351  *                      translation cache otherwise.
    352  * @param tr            Translation register if dtr is true, ignored otherwise.
    353  */
    354 void
    355 dtlb_kernel_mapping_insert(uintptr_t page, uintptr_t frame, bool dtr,
     364 * @param page  Virtual page address including VRN bits.
     365 * @param frame Physical frame address.
     366 * @param dtr   If true, insert into data translation register, use data
     367 *              translation cache otherwise.
     368 * @param tr    Translation register if dtr is true, ignored otherwise.
     369 *
     370 */
     371void dtlb_kernel_mapping_insert(uintptr_t page, uintptr_t frame, bool dtr,
    356372    size_t tr)
    357373{
     
    361377        entry.word[1] = 0;
    362378       
    363         entry.p = true;                 /* present */
     379        entry.p = true;           /* present */
    364380        entry.ma = MA_WRITEBACK;
    365         entry.a = true;                 /* already accessed */
    366         entry.d = true;                 /* already dirty */
     381        entry.a = true;           /* already accessed */
     382        entry.d = true;           /* already dirty */
    367383        entry.pl = PL_KERNEL;
    368384        entry.ar = AR_READ | AR_WRITE;
     
    380396 * Purge DTR entries used by the kernel.
    381397 *
    382  * @param page          Virtual page address including VRN bits.
    383  * @param width         Width of the purge in bits.
     398 * @param page  Virtual page address including VRN bits.
     399 * @param width Width of the purge in bits.
     400 *
    384401 */
    385402void dtr_purge(uintptr_t page, size_t width)
    386403{
    387         asm volatile ("ptr.d %0, %1\n" : : "r" (page), "r" (width << 2));
     404        asm volatile (
     405                "ptr.d %[page], %[width]\n"
     406                :: [page] "r" (page),
     407                   [width] "r" (width << 2)
     408        );
    388409}
    389410
     
    391412/** Copy content of PTE into data translation cache.
    392413 *
    393  * @param t             PTE.
     414 * @param t PTE.
     415 *
    394416 */
    395417void dtc_pte_copy(pte_t *t)
    396418{
    397419        tlb_entry_t entry;
    398 
     420       
    399421        entry.word[0] = 0;
    400422        entry.word[1] = 0;
     
    410432       
    411433        dtc_mapping_insert(t->page, t->as->asid, entry);
     434       
    412435#ifdef CONFIG_VHPT
    413436        vhpt_mapping_insert(t->page, t->as->asid, entry);
    414 #endif 
     437#endif
    415438}
    416439
    417440/** Copy content of PTE into instruction translation cache.
    418441 *
    419  * @param t             PTE.
     442 * @param t PTE.
     443 *
    420444 */
    421445void itc_pte_copy(pte_t *t)
    422446{
    423447        tlb_entry_t entry;
    424 
     448       
    425449        entry.word[0] = 0;
    426450        entry.word[1] = 0;
     
    437461       
    438462        itc_mapping_insert(t->page, t->as->asid, entry);
     463       
    439464#ifdef CONFIG_VHPT
    440465        vhpt_mapping_insert(t->page, t->as->asid, entry);
    441 #endif 
     466#endif
    442467}
    443468
    444469/** Instruction TLB fault handler for faults with VHPT turned off.
    445470 *
    446  * @param vector                Interruption vector.
    447  * @param istate                Structure with saved interruption state.
     471 * @param vector Interruption vector.
     472 * @param istate Structure with saved interruption state.
     473 *
    448474 */
    449475void alternate_instruction_tlb_fault(uint64_t vector, istate_t *istate)
    450476{
    451         region_register rr;
     477        region_register_t rr;
    452478        rid_t rid;
    453479        uintptr_t va;
    454480        pte_t *t;
    455481       
    456         va = istate->cr_ifa;    /* faulting address */
     482        va = istate->cr_ifa; /* faulting address */
    457483        rr.word = rr_read(VA2VRN(va));
    458484        rid = rr.map.rid;
    459 
     485       
    460486        page_table_lock(AS, true);
    461487        t = page_mapping_find(AS, va);
     
    473499                page_table_unlock(AS, true);
    474500                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
    475                         fault_if_from_uspace(istate,"Page fault at %p.",va);
     501                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    476502                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
    477503                            istate->cr_iip);
     
    488514}
    489515
    490 #define IO_FRAME_BASE 0xFFFFC000000
    491 
    492516/**
    493517 * There is special handling of memory mapped legacy io, because of 4KB sized
    494518 * access for userspace.
    495519 *
    496  * @param va            Virtual address of page fault.
    497  * @param istate        Structure with saved interruption state.
    498  *
    499  * @return              One on success, zero on failure.
     520 * @param va     Virtual address of page fault.
     521 * @param istate Structure with saved interruption state.
     522 *
     523 * @return One on success, zero on failure.
     524 *
    500525 */
    501526static int try_memmap_io_insertion(uintptr_t va, istate_t *istate)
     
    505530                        uint64_t io_page = (va & ((1 << IO_PAGE_WIDTH) - 1)) >>
    506531                            USPACE_IO_PAGE_WIDTH;
    507 
     532                       
    508533                        if (is_io_page_accessible(io_page)) {
    509534                                uint64_t page, frame;
    510 
     535                               
    511536                                page = IO_OFFSET +
    512537                                    (1 << USPACE_IO_PAGE_WIDTH) * io_page;
    513538                                frame = IO_FRAME_BASE +
    514539                                    (1 << USPACE_IO_PAGE_WIDTH) * io_page;
    515 
     540                               
    516541                                tlb_entry_t entry;
    517        
     542                               
    518543                                entry.word[0] = 0;
    519544                                entry.word[1] = 0;
    520        
    521                                 entry.p = true;         /* present */
    522                                 entry.ma = MA_UNCACHEABLE;             
    523                                 entry.a = true;         /* already accessed */
    524                                 entry.d = true;         /* already dirty */
     545                               
     546                                entry.p = true;             /* present */
     547                                entry.ma = MA_UNCACHEABLE;
     548                                entry.a = true;             /* already accessed */
     549                                entry.d = true;             /* already dirty */
    525550                                entry.pl = PL_USER;
    526551                                entry.ar = AR_READ | AR_WRITE;
    527552                                entry.ppn = frame >> PPN_SHIFT;
    528553                                entry.ps = USPACE_IO_PAGE_WIDTH;
    529        
     554                               
    530555                                dtc_mapping_insert(page, TASK->as->asid, entry);
    531556                                return 1;
     
    536561                }
    537562        }
    538                
     563       
    539564        return 0;
    540565}
     
    542567/** Data TLB fault handler for faults with VHPT turned off.
    543568 *
    544  * @param vector        Interruption vector.
    545  * @param istate        Structure with saved interruption state.
     569 * @param vector Interruption vector.
     570 * @param istate Structure with saved interruption state.
     571 *
    546572 */
    547573void alternate_data_tlb_fault(uint64_t vector, istate_t *istate)
    548574{
    549         region_register rr;
    550         rid_t rid;
    551         uintptr_t va;
    552         pte_t *t;
    553        
    554         va = istate->cr_ifa;    /* faulting address */
    555         rr.word = rr_read(VA2VRN(va));
    556         rid = rr.map.rid;
     575        if (istate->cr_isr.sp) {
     576                /* Speculative load. Deffer the exception
     577                   until a more clever approach can be used.
     578                   
     579                   Currently if we try to find the mapping
     580                   for the speculative load while in the kernel,
     581                   we might introduce a livelock because of
     582                   the possibly invalid values of the address. */
     583                istate->cr_ipsr.ed = true;
     584                return;
     585        }
     586       
     587        uintptr_t va = istate->cr_ifa;  /* faulting address */
     588       
     589        region_register_t rr;
     590        rr.word = rr_read(VA2VRN(va));
     591        rid_t rid = rr.map.rid;
    557592        if (RID2ASID(rid) == ASID_KERNEL) {
    558593                if (VA2VRN(va) == VRN_KERNEL) {
     
    565600                }
    566601        }
    567 
     602       
     603       
    568604        page_table_lock(AS, true);
    569         t = page_mapping_find(AS, va);
    570         if (t) {
     605        pte_t *entry = page_mapping_find(AS, va);
     606        if (entry) {
    571607                /*
    572608                 * The mapping was found in the software page hash table.
    573609                 * Insert it into data translation cache.
    574610                 */
    575                 dtc_pte_copy(t);
     611                dtc_pte_copy(entry);
    576612                page_table_unlock(AS, true);
    577613        } else {
     
    579615                if (try_memmap_io_insertion(va, istate))
    580616                        return;
    581                 /*
    582                  * Forward the page fault to the address space page fault
     617               
     618                /*
     619                 * Forward the page fault to the address space page fault
    583620                 * handler.
    584621                 */
    585622                if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
    586                         fault_if_from_uspace(istate,"Page fault at %p.",va);
     623                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    587624                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
    588625                            istate->cr_iip);
     
    595632 * This fault should not occur.
    596633 *
    597  * @param vector        Interruption vector.
    598  * @param istate        Structure with saved interruption state.
     634 * @param vector Interruption vector.
     635 * @param istate Structure with saved interruption state.
     636 *
    599637 */
    600638void data_nested_tlb_fault(uint64_t vector, istate_t *istate)
    601639{
    602         panic("%s.", __func__);
     640        ASSERT(false);
    603641}
    604642
    605643/** Data Dirty bit fault handler.
    606644 *
    607  * @param vector        Interruption vector.
    608  * @param istate        Structure with saved interruption state.
     645 * @param vector Interruption vector.
     646 * @param istate Structure with saved interruption state.
     647 *
    609648 */
    610649void data_dirty_bit_fault(uint64_t vector, istate_t *istate)
    611650{
    612         region_register rr;
     651        region_register_t rr;
    613652        rid_t rid;
    614653        uintptr_t va;
    615654        pte_t *t;
    616655       
    617         va = istate->cr_ifa;    /* faulting address */
     656        va = istate->cr_ifa;  /* faulting address */
    618657        rr.word = rr_read(VA2VRN(va));
    619658        rid = rr.map.rid;
    620 
     659       
    621660        page_table_lock(AS, true);
    622661        t = page_mapping_find(AS, va);
    623         ASSERT(t && t->p);
    624         if (t && t->p && t->w) {
     662        ASSERT((t) && (t->p));
     663        if ((t) && (t->p) && (t->w)) {
    625664                /*
    626665                 * Update the Dirty bit in page tables and reinsert
     
    631670        } else {
    632671                if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
    633                         fault_if_from_uspace(istate,"Page fault at %p.",va);
     672                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    634673                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
    635674                            istate->cr_iip);
     
    641680/** Instruction access bit fault handler.
    642681 *
    643  * @param vector        Interruption vector.
    644  * @param istate        Structure with saved interruption state.
     682 * @param vector Interruption vector.
     683 * @param istate Structure with saved interruption state.
     684 *
    645685 */
    646686void instruction_access_bit_fault(uint64_t vector, istate_t *istate)
    647687{
    648         region_register rr;
     688        region_register_t rr;
    649689        rid_t rid;
    650690        uintptr_t va;
    651         pte_t *t;       
    652 
    653         va = istate->cr_ifa;    /* faulting address */
     691        pte_t *t;
     692       
     693        va = istate->cr_ifa;  /* faulting address */
    654694        rr.word = rr_read(VA2VRN(va));
    655695        rid = rr.map.rid;
    656 
     696       
    657697        page_table_lock(AS, true);
    658698        t = page_mapping_find(AS, va);
    659         ASSERT(t && t->p);
    660         if (t && t->p && t->x) {
     699        ASSERT((t) && (t->p));
     700        if ((t) && (t->p) && (t->x)) {
    661701                /*
    662702                 * Update the Accessed bit in page tables and reinsert
     
    679719 * @param vector Interruption vector.
    680720 * @param istate Structure with saved interruption state.
     721 *
    681722 */
    682723void data_access_bit_fault(uint64_t vector, istate_t *istate)
    683724{
    684         region_register rr;
     725        region_register_t rr;
    685726        rid_t rid;
    686727        uintptr_t va;
    687728        pte_t *t;
    688 
    689         va = istate->cr_ifa;    /* faulting address */
     729       
     730        va = istate->cr_ifa;  /* faulting address */
    690731        rr.word = rr_read(VA2VRN(va));
    691732        rid = rr.map.rid;
    692 
     733       
    693734        page_table_lock(AS, true);
    694735        t = page_mapping_find(AS, va);
    695         ASSERT(t && t->p);
    696         if (t && t->p) {
     736        ASSERT((t) && (t->p));
     737        if ((t) && (t->p)) {
    697738                /*
    698739                 * Update the Accessed bit in page tables and reinsert
     
    715756 * @param vector Interruption vector.
    716757 * @param istate Structure with saved interruption state.
     758 *
    717759 */
    718760void data_access_rights_fault(uint64_t vector, istate_t *istate)
    719761{
    720         region_register rr;
     762        region_register_t rr;
    721763        rid_t rid;
    722764        uintptr_t va;
    723765        pte_t *t;
    724 
    725         va = istate->cr_ifa;    /* faulting address */
     766       
     767        va = istate->cr_ifa;  /* faulting address */
    726768        rr.word = rr_read(VA2VRN(va));
    727769        rid = rr.map.rid;
    728 
     770       
    729771        /*
    730772         * Assume a write to a read-only page.
     
    732774        page_table_lock(AS, true);
    733775        t = page_mapping_find(AS, va);
    734         ASSERT(t && t->p);
     776        ASSERT((t) && (t->p));
    735777        ASSERT(!t->w);
    736778        if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
     
    746788 * @param vector Interruption vector.
    747789 * @param istate Structure with saved interruption state.
     790 *
    748791 */
    749792void page_not_present(uint64_t vector, istate_t *istate)
    750793{
    751         region_register rr;
     794        region_register_t rr;
    752795        rid_t rid;
    753796        uintptr_t va;
    754797        pte_t *t;
    755798       
    756         va = istate->cr_ifa;    /* faulting address */
     799        va = istate->cr_ifa;  /* faulting address */
    757800        rr.word = rr_read(VA2VRN(va));
    758801        rid = rr.map.rid;
    759 
     802       
    760803        page_table_lock(AS, true);
    761804        t = page_mapping_find(AS, va);
  • kernel/arch/ia64/src/mm/vhpt.c

    r7e266ff rad4b32c  
    2727 */
    2828
    29 /** @addtogroup ia64mm 
     29/** @addtogroup ia64mm
    3030 * @{
    3131 */
     
    4444        vhpt_base = frame_alloc(VHPT_WIDTH - FRAME_WIDTH,
    4545            FRAME_KA | FRAME_ATOMIC);
    46         if (!vhpt_base) 
     46        if (!vhpt_base)
    4747                panic("Kernel configured with VHPT but no memory for table.");
    4848        vhpt_invalidate_all();
     
    5353void vhpt_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry)
    5454{
    55         region_register rr_save, rr;
     55        region_register_t rr_save, rr;
    5656        size_t vrn;
    5757        rid_t rid;
    5858        uint64_t tag;
    59 
     59       
    6060        vhpt_entry_t *ventry;
    61 
    62 
     61       
    6362        vrn = va >> VRN_SHIFT;
    6463        rid = ASID2RID(asid, vrn);
    65                                                                                                                                                                                                                                
     64       
    6665        rr_save.word = rr_read(vrn);
    6766        rr.word = rr_save.word;
     
    7574        srlz_i();
    7675        srlz_d();
    77 
     76       
    7877        ventry->word[0] = entry.word[0];
    7978        ventry->word[1] = entry.word[1];
  • kernel/arch/ia64/src/start.S

    r7e266ff rad4b32c  
    3232#include <mm/asid.h>
    3333
    34 #define RR_MASK (0xFFFFFFFF00000002)
    35 #define RID_SHIFT       8
    36 #define PS_SHIFT        2
    37 
    38 #define KERNEL_TRANSLATION_I    0x0010000000000661
    39 #define KERNEL_TRANSLATION_D    0x0010000000000661
    40 #define KERNEL_TRANSLATION_VIO  0x0010000000000671
    41 #define KERNEL_TRANSLATION_IO   0x00100FFFFC000671
    42 #define KERNEL_TRANSLATION_FW   0x00100000F0000671
     34#define RR_MASK    (0xFFFFFFFF00000002)
     35#define RID_SHIFT  8
     36#define PS_SHIFT   2
     37
     38#define KERNEL_TRANSLATION_I    0x0010000000000661
     39#define KERNEL_TRANSLATION_D    0x0010000000000661
     40#define KERNEL_TRANSLATION_VIO  0x0010000000000671
     41#define KERNEL_TRANSLATION_IO   0x00100FFFFC000671
     42#define KERNEL_TRANSLATION_FW   0x00100000F0000671
    4343
    4444.section K_TEXT_START, "ax"
     
    4949kernel_image_start:
    5050        .auto
    51 
     51       
    5252#ifdef CONFIG_SMP
    5353        # Identify self(CPU) in OS structures by ID / EID
    54 
     54       
    5555        mov r9 = cr64
    5656        mov r10 = 1
     
    6262        st1 [r8] = r10
    6363#endif
    64 
     64       
    6565        mov psr.l = r0
    6666        srlz.i
    6767        srlz.d
    68 
     68       
    6969        # Fill TR.i and TR.d using Region Register #VRN_KERNEL
    70 
     70       
    7171        movl r8 = (VRN_KERNEL << VRN_SHIFT)
    7272        mov r9 = rr[r8]
    73 
     73       
    7474        movl r10 = (RR_MASK)
    7575        and r9 = r10, r9
    7676        movl r10 = ((RID_KERNEL << RID_SHIFT) | (KERNEL_PAGE_WIDTH << PS_SHIFT))
    77         or  r9 = r10, r9
    78 
     77        or r9 = r10, r9
     78       
    7979        mov rr[r8] = r9
    80 
     80       
    8181        movl r8 = (VRN_KERNEL << VRN_SHIFT)
    8282        mov cr.ifa = r8
    83 
     83       
    8484        mov r11 = cr.itir
    8585        movl r10 = (KERNEL_PAGE_WIDTH << PS_SHIFT)
    8686        or r10 = r10, r11
    8787        mov cr.itir = r10
    88 
     88       
    8989        movl r10 = (KERNEL_TRANSLATION_I)
    9090        itr.i itr[r0] = r10
    9191        movl r10 = (KERNEL_TRANSLATION_D)
    9292        itr.d dtr[r0] = r10
    93 
     93       
    9494        movl r7 = 1
    9595        movl r8 = (VRN_KERNEL << VRN_SHIFT) | VIO_OFFSET
     
    9797        movl r10 = (KERNEL_TRANSLATION_VIO)
    9898        itr.d dtr[r7] = r10
    99 
     99       
    100100        mov r11 = cr.itir
    101101        movl r10 = ~0xfc
     
    104104        or r10 = r10, r11
    105105        mov cr.itir = r10
    106 
     106       
    107107        movl r7 = 2
    108108        movl r8 = (VRN_KERNEL << VRN_SHIFT) | IO_OFFSET
     
    110110        movl r10 = (KERNEL_TRANSLATION_IO)
    111111        itr.d dtr[r7] = r10
    112 
    113         # Setup mapping for fimware arrea (also SAPIC)
    114 
     112       
     113        # Setup mapping for firmware area (also SAPIC)
     114       
    115115        mov r11 = cr.itir
    116116        movl r10 = ~0xfc
     
    119119        or r10 = r10, r11
    120120        mov cr.itir = r10
    121 
     121       
    122122        movl r7 = 3
    123123        movl r8 = (VRN_KERNEL << VRN_SHIFT) | FW_OFFSET
     
    125125        movl r10 = (KERNEL_TRANSLATION_FW)
    126126        itr.d dtr[r7] = r10
    127 
     127       
     128        # Initialize DSR
     129       
     130        movl r10 = (DCR_DP_MASK | DCR_DK_MASK | DCR_DX_MASK | DCR_DR_MASK | DCR_DA_MASK | DCR_DD_MASK | DCR_LC_MASK)
     131        mov r9 = cr.dcr
     132        or r10 = r10, r9
     133        mov cr.dcr = r10
     134       
    128135        # Initialize PSR
    129 
     136       
    130137        movl r10 = (PSR_DT_MASK | PSR_RT_MASK | PSR_IT_MASK | PSR_IC_MASK)  /* Enable paging */
    131138        mov r9 = psr
    132 
     139       
    133140        or r10 = r10, r9
    134141        mov cr.ipsr = r10
     
    138145        srlz.d
    139146        srlz.i
    140 
     147       
    141148        .explicit
    142 
     149       
    143150        /*
    144151         * Return From Interrupt is the only way to
     
    147154        rfi ;;
    148155
    149 
    150156.global paging_start
    151157paging_start:
    152 
     158       
    153159        /*
    154160         * Now we are paging.
    155161         */
    156 
     162       
    157163        # Switch to register bank 1
    158164        bsw.1
    159 
     165       
    160166#ifdef CONFIG_SMP
    161167        # Am I BSP or AP?
     
    164170        cmp.eq p3, p2 = r20, r0 ;;
    165171#else
    166         cmp.eq p3, p2 = r0, r0 ;;       /* you are BSP */
    167 #endif  /* CONFIG_SMP */
     172        cmp.eq p3, p2 = r0, r0 ;;  /* you are BSP */
     173#endif  /* CONFIG_SMP */
    168174       
    169175        # Initialize register stack
     
    172178        mov ar.bspstore = r8
    173179        loadrs
    174 
     180       
    175181        # Initialize memory stack to some sane value
    176182        movl r12 = stack0 ;;
    177         add r12 = -16, r12      /* allocate a scratch area on the stack */
    178 
     183        add r12 = -16, r12  /* allocate a scratch area on the stack */
     184       
    179185        # Initialize gp (Global Pointer) register
    180         movl r20 = (VRN_KERNEL << VRN_SHIFT);;
    181         or r20 = r20,r1;;
     186        movl r20 = (VRN_KERNEL << VRN_SHIFT) ;;
     187        or r20 = r20, r1 ;;
    182188        movl r1 = _hardcoded_load_address
    183189       
     
    192198(p3)    addl r19 = @gprel(hardcoded_load_address), gp
    193199(p3)    addl r21 = @gprel(bootinfo), gp
    194         ;;
     200                ;;
    195201(p3)    st8 [r17] = r14
    196202(p3)    st8 [r18] = r15
    197203(p3)    st8 [r19] = r16
    198204(p3)    st8 [r21] = r20
    199 
     205       
    200206        ssm (1 << 19) ;; /* Disable f32 - f127 */
    201207        srlz.i
    202208        srlz.d ;;
    203 
     209       
    204210#ifdef CONFIG_SMP
    205211(p2)    movl r18 = main_ap ;;
    206 (p2)    mov b1 = r18 ;;
     212(p2)    mov b1 = r18 ;;
    207213(p2)    br.call.sptk.many b0 = b1
    208 
     214       
    209215        # Mark that BSP is on
     216       
    210217        mov r20 = 1 ;;
    211218        movl r21 = bsp_started ;;
    212219        st8 [r21] = r20 ;;
    213220#endif
    214 
     221       
    215222        br.call.sptk.many b0 = arch_pre_main
    216 
     223       
    217224        movl r18 = main_bsp ;;
    218225        mov b1 = r18 ;;
     
    227234kernel_image_ap_start:
    228235        .auto
    229 
     236       
    230237        # Identify self(CPU) in OS structures by ID / EID
    231 
     238       
    232239        mov r9 = cr64
    233240        mov r10 = 1
     
    240247       
    241248        # Wait for wakeup synchro signal (#3 in cpu_by_id_eid_list)
    242        
     249
    243250kernel_image_ap_start_loop:
    244251        movl r11 = kernel_image_ap_start_loop
    245252        and r11 = r11, r12
    246         mov b1 = r11
    247 
    248         ld1 r20 = [r8] ;;
    249         movl r21 = 3 ;;
    250         cmp.eq p2, p3 = r20, r21 ;;
     253        mov b1 = r11
     254       
     255        ld1 r20 = [r8]
     256        movl r21 = 3
     257        cmp.eq p2, p3 = r20, r21
    251258(p3)    br.call.sptk.many b0 = b1
    252 
     259       
    253260        movl r11 = kernel_image_start
    254261        and r11 = r11, r12
    255         mov b1 = r11 
     262        mov b1 = r11
    256263        br.call.sptk.many b0 = b1
    257264
     
    259266.global bsp_started
    260267bsp_started:
    261 .space 8
     268        .space 8
    262269
    263270.align 4096
    264271.global cpu_by_id_eid_list
    265272cpu_by_id_eid_list:
    266 .space 65536
    267 
    268 #endif  /* CONFIG_SMP */
     273        .space 65536
     274
     275#endif  /* CONFIG_SMP */
Note: See TracChangeset for help on using the changeset viewer.