Changeset fbb8b2b in mainline


Ignore:
Timestamp:
2006-06-17T17:26:14Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8e3bf3e2
Parents:
74b22cc5
Message:

ppc32: more generic page hash table handling
(preliminary code, will be fixed properly later)

Location:
arch/ppc32
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/include/mm/page.h

    r74b22cc5 rfbb8b2b  
    2727 */
    2828
    29  /** @addtogroup ppc32mm       
     29/** @addtogroup ppc32mm
    3030 * @{
    3131 */
     
    133133extern void page_arch_init(void);
    134134
    135 #define PHT_BITS        16
    136 #define PHT_ORDER       4
    137 
    138135typedef struct {
    139136        unsigned v : 1;          /**< Valid */
     
    151148
    152149extern void pht_refill(int n, istate_t *istate);
     150extern bool pht_real_refill(int n, istate_t *istate) __attribute__ ((section("K_UNMAPPED_TEXT_START")));
    153151extern void pht_init(void);
    154152
     
    159157#endif
    160158
    161  /** @}
     159/** @}
    162160 */
    163 
  • arch/ppc32/src/exception.S

    r74b22cc5 rfbb8b2b  
    122122        CONTEXT_STORE
    123123       
    124         lis r12, exc_dispatch@ha
    125         addi r12, r12, exc_dispatch@l
    126         mtsrr0 r12
    127        
    128124        li r3, 0
    129125        b jump_to_kernel
     
    134130        CONTEXT_STORE
    135131       
    136         lis r12, exc_dispatch@ha
    137         addi r12, r12, exc_dispatch@l
    138         mtsrr0 r12
    139        
    140132        li r3, 1
    141133        b jump_to_kernel
     
    146138        CONTEXT_STORE
    147139       
    148         lis r12, exc_dispatch@ha
    149         addi r12, r12, exc_dispatch@l
    150         mtsrr0 r12
     140#       li r3, 2
     141#       mr r4, sp
     142#       addi r4, r4, 8
     143#       bl pht_real_refill
     144       
     145#       cmpwi r3, 0
     146#       bne iret_real
    151147       
    152148        li r3, 2
     
    158154        CONTEXT_STORE
    159155       
    160         lis r12, exc_dispatch@ha
    161         addi r12, r12, exc_dispatch@l
    162         mtsrr0 r12
    163        
     156#       li r3, 3
     157#       mr r4, sp
     158#       addi r4, r4, 8
     159#       bl pht_real_refill
     160       
     161#       cmpwi r3, 0
     162#       bne iret_real
     163
    164164        li r3, 3
    165165        b jump_to_kernel
     
    170170        CONTEXT_STORE
    171171       
    172         lis r12, exc_dispatch@ha
    173         addi r12, r12, exc_dispatch@l
    174         mtsrr0 r12
    175        
    176172        li r3, 4
    177173        b jump_to_kernel
     
    182178        CONTEXT_STORE
    183179       
    184         lis r12, exc_dispatch@ha
    185         addi r12, r12, exc_dispatch@l
    186         mtsrr0 r12
    187        
    188180        li r3, 5
    189181        b jump_to_kernel
     
    194186        CONTEXT_STORE
    195187       
    196         lis r12, exc_dispatch@ha
    197         addi r12, r12, exc_dispatch@l
    198         mtsrr0 r12
    199        
    200188        li r3, 6
    201189        b jump_to_kernel
     
    206194        CONTEXT_STORE
    207195       
    208         lis r12, exc_dispatch@ha
    209         addi r12, r12, exc_dispatch@l
    210         mtsrr0 r12
    211        
    212196        li r3, 7
    213197        b jump_to_kernel
     
    217201exc_decrementer:
    218202        CONTEXT_STORE
    219 
    220         lis r12, exc_dispatch@ha
    221         addi r12, r12, exc_dispatch@l
    222         mtsrr0 r12
    223203       
    224204        li r3, 8
     
    230210        CONTEXT_STORE
    231211       
    232         lis r12, exc_dispatch@ha
    233         addi r12, r12, exc_dispatch@l
    234         mtsrr0 r12
    235        
    236212        li r3, 9
    237213        b jump_to_kernel
     
    241217exc_reserved1:
    242218        CONTEXT_STORE
    243        
    244         lis r12, exc_dispatch@ha
    245         addi r12, r12, exc_dispatch@l
    246         mtsrr0 r12
    247219       
    248220        li r3, 10
     
    260232exc_trace:
    261233        CONTEXT_STORE
    262        
    263         lis r12, exc_dispatch@ha
    264         addi r12, r12, exc_dispatch@l
    265         mtsrr0 r12
    266234       
    267235        li r3, 12
     
    273241        addi r12, r12, iret@l
    274242        mtlr r12
    275 
     243       
     244        lis r12, exc_dispatch@ha
     245        addi r12, r12, exc_dispatch@l
     246        mtsrr0 r12
     247       
    276248        mfmsr r12
    277249        ori r12, r12, (msr_ir | msr_dr)@l
     
    292264        addi r12, r12, iret_syscall@l
    293265        mtlr r12
    294 
     266       
    295267        mfmsr r12
    296268        ori r12, r12, (msr_ir | msr_dr)@l
     
    299271        addis sp, sp, 0x8000
    300272        rfi
     273
     274iret_real:
     275       
     276        lwz r0, 8(sp)
     277        lwz r2, 12(sp)
     278        lwz r3, 16(sp)
     279        lwz r4, 20(sp)
     280        lwz r5, 24(sp)
     281        lwz r6, 28(sp)
     282        lwz r7, 32(sp)
     283        lwz r8, 36(sp)
     284        lwz r9, 40(sp)
     285        lwz r10, 44(sp)
     286        lwz r11, 48(sp)
     287        lwz r13, 52(sp)
     288        lwz r14, 56(sp)
     289        lwz r15, 60(sp)
     290        lwz r16, 64(sp)
     291        lwz r17, 68(sp)
     292        lwz r18, 72(sp)
     293        lwz r19, 76(sp)
     294        lwz r20, 80(sp)
     295        lwz r21, 84(sp)
     296        lwz r22, 88(sp)
     297        lwz r23, 92(sp)
     298        lwz r24, 96(sp)
     299        lwz r25, 100(sp)
     300        lwz r26, 104(sp)
     301        lwz r27, 108(sp)
     302        lwz r28, 112(sp)
     303        lwz r29, 116(sp)
     304        lwz r30, 120(sp)
     305        lwz r31, 124(sp)
     306       
     307        lwz r12, 128(sp)
     308        mtcr r12
     309       
     310        lwz r12, 132(sp)
     311        mtsrr0 r12
     312       
     313        lwz r12, 136(sp)
     314        mtsrr1 r12
     315       
     316        lwz r12, 140(sp)
     317        mtlr r12
     318       
     319        lwz r12, 144(sp)
     320        mtctr r12
     321       
     322        lwz r12, 148(sp)
     323        mtxer r12
     324       
     325        lwz r12, 152(sp)
     326        lwz sp, 156(sp)
     327       
     328        rfi
  • arch/ppc32/src/mm/as.c

    r74b22cc5 rfbb8b2b  
    2727 */
    2828
    29  /** @addtogroup ppc32mm
     29/** @addtogroup ppc32mm
    3030 * @{
    3131 */
     
    4242}
    4343
    44  /** @}
     44/** @}
    4545 */
    46 
  • arch/ppc32/src/mm/frame.c

    r74b22cc5 rfbb8b2b  
    2727 */
    2828
    29  /** @addtogroup ppc32mm       
     29/** @addtogroup ppc32mm
    3030 * @{
    3131 */
     
    6969}
    7070
    71  /** @}
     71/** @}
    7272 */
    73 
  • arch/ppc32/src/mm/page.c

    r74b22cc5 rfbb8b2b  
    2727 */
    2828
    29  /** @addtogroup ppc32mm       
     29/** @addtogroup ppc32mm
    3030 * @{
    3131 */
     
    4949#include <symtab.h>
    5050
    51 static phte_t *phte;
    52 
    5351
    5452/** Try to find PTE for faulting address
     
    6765 *
    6866 */
    69 static pte_t *find_mapping_and_check(as_t *as, bool lock, __address badvaddr, int access,
    70                                      istate_t *istate, int *pfrc)
     67static pte_t *find_mapping_and_check(as_t *as, bool lock, __address badvaddr, int access, istate_t *istate, int *pfrc)
    7168{
    7269        /*
     
    133130        __u32 page = (vaddr >> 12) & 0xffff;
    134131        __u32 api = (vaddr >> 22) & 0x3f;
     132       
    135133        __u32 vsid;
    136        
    137134        asm volatile (
    138135                "mfsrin %0, %1\n"
     
    140137                : "r" (vaddr)
    141138        );
     139       
     140        __u32 sdr1;
     141        asm volatile (
     142                "mfsdr1 %0\n"
     143                : "=r" (sdr1)
     144        );
     145        phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000);
    142146       
    143147        /* Primary hash (xor) */
     
    186190        phte[base + i].c = 0;
    187191        phte[base + i].pp = 2; // FIXME
     192}
     193
     194
     195static void pht_real_insert(const __address vaddr, const pfn_t pfn)
     196{
     197        __u32 page = (vaddr >> 12) & 0xffff;
     198        __u32 api = (vaddr >> 22) & 0x3f;
     199       
     200        __u32 vsid;
     201        asm volatile (
     202                "mfsrin %0, %1\n"
     203                : "=r" (vsid)
     204                : "r" (vaddr)
     205        );
     206       
     207        __u32 sdr1;
     208        asm volatile (
     209                "mfsdr1 %0\n"
     210                : "=r" (sdr1)
     211        );
     212        phte_t *phte_physical = (phte_t *) (sdr1 & 0xffff0000);
     213       
     214        /* Primary hash (xor) */
     215        __u32 h = 0;
     216        __u32 hash = vsid ^ page;
     217        __u32 base = (hash & 0x3ff) << 3;
     218        __u32 i;
     219        bool found = false;
     220       
     221        /* Find unused or colliding
     222           PTE in PTEG */
     223        for (i = 0; i < 8; i++) {
     224                if ((!phte_physical[base + i].v) || ((phte_physical[base + i].vsid == vsid) && (phte_physical[base + i].api == api))) {
     225                        found = true;
     226                        break;
     227                }
     228        }
     229       
     230        if (!found) {
     231                /* Secondary hash (not) */
     232                __u32 base2 = (~hash & 0x3ff) << 3;
     233               
     234                /* Find unused or colliding
     235                   PTE in PTEG */
     236                for (i = 0; i < 8; i++) {
     237                        if ((!phte_physical[base2 + i].v) || ((phte_physical[base2 + i].vsid == vsid) && (phte_physical[base2 + i].api == api))) {
     238                                found = true;
     239                                base = base2;
     240                                h = 1;
     241                                break;
     242                        }
     243                }
     244               
     245                if (!found) {
     246                        // TODO: A/C precedence groups
     247                        i = page % 8;
     248                }
     249        }
     250       
     251        phte_physical[base + i].v = 1;
     252        phte_physical[base + i].vsid = vsid;
     253        phte_physical[base + i].h = h;
     254        phte_physical[base + i].api = api;
     255        phte_physical[base + i].rpn = pfn;
     256        phte_physical[base + i].r = 0;
     257        phte_physical[base + i].c = 0;
     258        phte_physical[base + i].pp = 2; // FIXME
    188259}
    189260
     
    251322
    252323
     324/** Process Instruction/Data Storage Interrupt in Real Mode
     325 *
     326 * @param n Interrupt vector number.
     327 * @param istate Interrupted register context.
     328 *
     329 */
     330bool pht_real_refill(int n, istate_t *istate)
     331{
     332        __address badvaddr;
     333       
     334        if (n == VECTOR_DATA_STORAGE) {
     335                asm volatile (
     336                        "mfdar %0\n"
     337                        : "=r" (badvaddr)
     338                );
     339        } else
     340                badvaddr = istate->pc;
     341       
     342        __u32 physmem;
     343        asm volatile (
     344                "mfsprg3 %0\n"
     345                : "=r" (physmem)
     346        );
     347       
     348        if ((badvaddr >= PA2KA(0)) && (badvaddr <= PA2KA(physmem))) {
     349                pht_real_insert(badvaddr, KA2PA(badvaddr) >> 12);
     350                return true;
     351        }
     352       
     353        return false;
     354}
     355
     356
    253357void pht_init(void)
    254358{
    255         memsetb((__address) phte, 1 << PHT_BITS, 0);
     359        // FIXME
     360       
     361        __u32 sdr1;
     362        asm volatile (
     363                "mfsdr1 %0\n"
     364                : "=r" (sdr1)
     365        );
     366        phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000);
     367       
     368        memsetb((__address) phte, 65536, 0);
    256369}
    257370
     
    259372void page_arch_init(void)
    260373{
    261         if (config.cpu_active == 1) {
     374        if (config.cpu_active == 1)
    262375                page_mapping_operations = &pt_mapping_operations;
    263                
    264                 __address cur;
    265                 int flags;
    266                
    267                 /* Frames below 128 MB are mapped using BAT,
    268                    map rest of the physical memory */
    269                 for (cur = 128 << 20; cur < last_frame; cur += FRAME_SIZE) {
    270                         flags = PAGE_CACHEABLE;
    271                         if ((PA2KA(cur) >= config.base) && (PA2KA(cur) < config.base + config.kernel_size))
    272                                 flags |= PAGE_GLOBAL;
    273                         page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
    274                 }
    275                
    276                 /* Allocate page hash table */
    277                 phte_t *physical_phte = (phte_t *) PFN2ADDR(frame_alloc(PHT_ORDER, FRAME_KA | FRAME_PANIC));
    278                 phte = (phte_t *) PA2KA((__address) physical_phte);
    279                
    280                 ASSERT((__address) physical_phte % (1 << PHT_BITS) == 0);
    281                 pht_init();
    282                
    283                 asm volatile (
    284                         "mtsdr1 %0\n"
    285                         :
    286                         : "r" ((__address) physical_phte)
    287                 );
    288         }
    289376}
    290377
     
    305392}
    306393
    307  /** @}
    308  */
    309 
     394/** @}
     395 */
Note: See TracChangeset for help on using the changeset viewer.