Changeset c2b95d3 in mainline for arch/ia64/src
- Timestamp:
- 2006-01-26T22:52:00Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 849386a
- Parents:
- 2a003d5b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia64/src/mm/page.c
r2a003d5b rc2b95d3 1 1 /* 2 2 * Copyright (C) 2006 Jakub Jermar 3 * Copyright (C) 2006 Jakub Vana 3 4 * All rights reserved. 4 5 * … … 28 29 29 30 #include <arch/mm/page.h> 31 #include <genarch/mm/page_ht.h> 32 #include <mm/asid.h> 30 33 #include <arch/types.h> 31 #include <genarch/mm/page_ht.h>32 34 #include <print.h> 33 35 #include <mm/page.h> 36 #include <mm/frame.h> 34 37 #include <config.h> 35 38 #include <panic.h> 36 39 #include <arch/asm.h> 40 #include <arch/barrier.h> 37 41 38 __u64 thash(__u64 va); 39 __u64 thash(__u64 va)42 /** Initialize VHPT and region registers. */ 43 static void set_vhpt_environment(void) 40 44 { 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; 48 48 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(); 50 92 } 51 93 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. */ 141 95 void page_arch_init(void) 142 96 { 143 97 page_operations = &page_ht_operations; 144 98 pk_disable(); 145 set_ VHPT_environment();99 set_vhpt_environment(); 146 100 }
Note:
See TracChangeset
for help on using the changeset viewer.