1. Let's first look at couple of pages (from 700 pages):



 The pages tell how to make TLB-translation virtual/physical

   Link 1 to Systems programming manual page

 
    //An assembly example to set up TLB- transaltion

    .macro set_tlb_translation TBL_INDEX PG_SZ VIRT_PG PHYS_PG PR_KEY CPL AR // Setup ITIR (Interruption TLB Insertion Register)
        movl r3 = ( ( \PG_SZ << 2 ) | ( \PR_KEY << 8 )); // 64 kb & protection key
        movl r15 = \VIRT_PG ; // Virt page
        mov r4 = \TBL_INDEX;
        mov cr.itir = r3; // Now setup the general register to use with itr (insert translation //register)
        movl r5 = ( (1 << 52 ) | ( \PHYS_PG << 12 ) | (\CPL << 7) |
        (\AR << 9 )|(1 << 6) | ( 1 << 5 ) | (1 << 0)) ;//ar 3<<9
        mov cr.ifa = r15; ; // Faulting virtual address
        itr.d dtr[r4] = r5; // Insert translation register data
        itr.i itr[r4] = r5; // Insert translation register instruction fa
        srlz.i
    .endm

    //Usage
    set_tlb_translation TBL_INDEX=0 PG_SZ=17 VIRT_PG=0x0000000000000000 PHYS_PG=0x0000 PR_KEY=0xc01 CPL=0 AR=3 //kernel
    set_tlb_translation TBL_INDEX=1 PG_SZ=TASK_PZ VIRT_PG=0x0000000000020000 PHYS_PG=0x0020 PR_KEY=0xc02 CPL=0 AR=7 //epc-gate



     // A C- code example to set up TLB_-translation from TLB fault handler (code execution fault)

    extern long   IFA,PHYS_code[MAXPAGES],found ;

long ifa_v , itir_v;
long itrd_v, index_v ;
void k_tlb_fault_code(void) {
   
    __asm__("mov r16=pr;;mov ar.k1=r16;;mov r16=b0;;mov ar.k6=r16;;mov r16=ar.lc;;mov ar.k2=r16;;");
    __asm__("mov r16=cr.ifa;;"); //Save user pr lc abd b0 get cr.ifa
    __asm__("add r17=@gprel(ifa_v),gp;;st8 [r17]=r16;;");
 
      if ((ifa_v & 0xffffffffffff0000) != IFA  ) //Allowed access?
            __asm__ (" add r29=  @gprel(fault_handler),gp;;mov b0=r29;br.sptk.few b0;");//No
      else {     
           itir_v=(TASK_KEY<<8)|(12<<2);     
           itrd_v   =   0x0010000000000000| (3 << 7) | (3 << 9 )|(1 << 6) | ( 1 << 5 ) | (1 << 0) | PHYS_code[ ((ifa_v & 0xf000) >> 12)  ];         
      }
        __asm__("add r17=@gprel(itir_v),gp;;ld8 r18=[r17];;");
        __asm__("mov cr.itir=r18");
        __asm__("add r17=@gprel(itrd_v),gp;;ld8 r18=[r17];;");
        __asm__("movl r19=4;;");
        __asm__("itr.i  itr[r19]   = r18; srlz.d");//Set up transaltion registers
        __asm__("mov r16=ar.k6;;mov b0=r16;;mov r16=ar.k1;");
        __asm__("mov pr=r16;;mov r16=ar.k2;; mov ar.lc=r16;;movl r31=0x4000000000000000;;or r1=r1,r31;;bsw.1;;rfi");
        //__asm__("mov gp=r31; bsw.1;rfi"); //Restore user gp (saved in the assembly entry)
    }