Changeset c2b95d3 in mainline for arch/ia64/src


Ignore:
Timestamp:
2006-01-26T22:52:00Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
849386a
Parents:
2a003d5b
Message:

ia64 work.
Add nice wrappers for thash and ttag instructions.
Add nice wrappers for accessing reion registers and PTA.
Fix set_vhpt_environment().
Allocate and initialize page_ht (a.k.a. VHPT).

Add missing header to sparc64.
Remove excessive header from debug.h.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ia64/src/mm/page.c

    r2a003d5b rc2b95d3  
    11/*
    22 * Copyright (C) 2006 Jakub Jermar
     3 * Copyright (C) 2006 Jakub Vana
    34 * All rights reserved.
    45 *
     
    2829
    2930#include <arch/mm/page.h>
     31#include <genarch/mm/page_ht.h>
     32#include <mm/asid.h>
    3033#include <arch/types.h>
    31 #include <genarch/mm/page_ht.h>
    3234#include <print.h>
    3335#include <mm/page.h>
     36#include <mm/frame.h>
    3437#include <config.h>
    3538#include <panic.h>
    3639#include <arch/asm.h>
     40#include <arch/barrier.h>
    3741
    38 __u64 thash(__u64 va);
    39 __u64 thash(__u64 va)
     42/** Initialize VHPT and region registers. */
     43static void set_vhpt_environment(void)
    4044{
    41         __u64 ret;
    42         asm
    43         (
    44                 "thash %0=%1;;"
    45                 :"=r"(ret)
    46                 :"r" (va)
    47         );
     45        region_register rr;
     46        pta_register pta;       
     47        int i;
    4848       
    49         return ret;
     49        /*
     50         * First set up kernel region register.
     51         */
     52        rr.word = rr_read(VRN_KERNEL);
     53        rr.map.ve = 0;                  /* disable VHPT walker */
     54        rr.map.ps = PAGE_WIDTH;
     55        rr.map.rid = ASID_KERNEL;
     56        rr_write(VRN_KERNEL, rr.word);
     57        srlz_i();
     58        srlz_d();
     59       
     60        /*
     61         * And invalidate the rest of region register.
     62         */
     63        for(i = 0; i < REGION_REGISTERS; i++) {
     64                /* skip kernel rr */
     65                if (i == VRN_KERNEL)
     66                        continue;
     67       
     68                rr.word == rr_read(i);
     69                rr.map.rid = ASID_INVALID;
     70                rr_write(i, rr.word);
     71                srlz_i();
     72                srlz_d();
     73        }
     74
     75        /*
     76         * Allocate VHPT and invalidate all its entries.
     77         */
     78        page_ht = (pte_t *) frame_alloc(FRAME_KA, VHPT_WIDTH - FRAME_WIDTH, NULL);
     79        ht_invalidate_all();
     80       
     81        /*
     82         * Set up PTA register.
     83         */
     84        pta.word = pta_read();
     85        pta.map.ve = 0;                   /* disable VHPT walker */
     86        pta.map.vf = 1;                   /* large entry format */
     87        pta.map.size = VHPT_WIDTH;
     88        pta.map.base = (__address) page_ht;
     89        pta_write(pta.word);
     90        srlz_i();
     91        srlz_d();
    5092}
    5193
    52 __u64 ttag(__u64 va);
    53 __u64 ttag(__u64 va)
    54 {
    55         __u64 ret;
    56         asm
    57         (
    58                 "ttag %0=%1;;"
    59                 :"=r"(ret)
    60                 :"r" (va)
    61         );
    62        
    63         return ret;
    64 }
    65 
    66 
    67 static void set_VHPT_environment(void)
    68 {
    69        
    70 
    71         /*
    72         TODO:
    73         */
    74        
    75         int i;
    76        
    77         /* First set up REGION REGISTER 0 */
    78        
    79         region_register rr;
    80         rr.map.ve=0;                  /*Disable Walker*/
    81         rr.map.ps=PAGE_WIDTH;
    82         rr.map.rid=REGION_RID_MAIN;
    83        
    84         asm
    85         (
    86                 ";;\n"
    87                 "srlz.i;;\n"
    88                 "srlz.d;;\n"
    89                 "{mov rr[r0]=%0};;\n"
    90                 "srlz.i;;\n"
    91                 "srlz.d;;\n"
    92                 ";;\n"
    93                 :
    94                 :"r"(rr.word)
    95         );
    96 
    97                        
    98         /* And Invalidate the rest of REGION REGISTERS */
    99         for(i=1;i<REGION_REGISTERS;i++)
    100         {
    101                 rr.map.rid=REGION_RID_FIRST_INVALID+i-1;
    102                 asm
    103                 (
    104                         ";;\n"
    105 /*                      "mov r8=%1;;\n"*/
    106 /*                      "mov rr[r8]=%0;;\n"*/
    107                         "srlz.i;;\n"
    108                         "srlz.d;;\n"
    109                         "{mov rr[%1]=%0};;\n"
    110                         "srlz.i;;\n"
    111                         "srlz.d;;\n"
    112                         :
    113                         :"r"(rr.word),"r"(i)
    114                         :"r8"
    115                 );
    116         };
    117 
    118        
    119 
    120         PTA_register pta;
    121         pta.map.ve=0;                   /*Disable Walker*/
    122         pta.map.vf=1;                   /*Large entry format*/
    123         pta.map.size=VHPT_WIDTH;
    124         pta.map.base=VHPT_BASE;
    125        
    126         return ;
    127        
    128         printf("pta struct size:%d\n",sizeof(pta));
    129        
    130         /*Write PTA*/
    131         asm
    132         (
    133                 "mov cr8=%0;;"
    134                 :
    135                 :"r"(pta.word)
    136         );     
    137         return ;
    138 }       
    139 
    140 
     94/** Initialize ia64 virtual address translation subsystem. */
    14195void page_arch_init(void)
    14296{
    14397        page_operations = &page_ht_operations;
    14498        pk_disable();
    145         set_VHPT_environment();
     99        set_vhpt_environment();
    146100}
Note: See TracChangeset for help on using the changeset viewer.