📄 tlb.lst
字号:
GAS LISTING /tmp/ccLt6UhX.s page 1 1 .section .mdebug.abi32 2 .previous 3 .section .debug_abbrev,"",@progbits 4 $Ldebug_abbrev0: 5 .section .debug_info,"",@progbits 6 $Ldebug_info0: 7 .section .debug_line,"",@progbits 8 $Ldebug_line0: 9 0000 2F010000 .text 9 02009600 9 00000101 9 FB0E0A00 9 01010101 10 $Ltext0: 11 .data 12 .align 2 13 .type lastVA, @object 14 .size lastVA, 4 15 lastVA: 16 0000 00000050 .word 1342177280 17 0004 00000000 .text 17 00000000 17 00000000 18 .align 2 19 .globl tlbInit 20 .ent tlbInit 21 .type tlbInit, @function 22 tlbInit: 23 $LFB2: 24 .file 1 "/mnt/hgfs/boot/booter/source/tlb.c" 1:/mnt/hgfs/boot/booter/source/tlb.c **** /* 2:/mnt/hgfs/boot/booter/source/tlb.c **** * Sample code to demonstrate TLB manipulation 3:/mnt/hgfs/boot/booter/source/tlb.c **** */ 4:/mnt/hgfs/boot/booter/source/tlb.c **** #include "example.h" 5:/mnt/hgfs/boot/booter/source/tlb.c **** 6:/mnt/hgfs/boot/booter/source/tlb.c **** /********************************************************************/ 7:/mnt/hgfs/boot/booter/source/tlb.c **** 8:/mnt/hgfs/boot/booter/source/tlb.c **** typedef struct PTE 9:/mnt/hgfs/boot/booter/source/tlb.c **** { 10:/mnt/hgfs/boot/booter/source/tlb.c **** uint32 EntryLo0; 11:/mnt/hgfs/boot/booter/source/tlb.c **** uint32 EntryLo1; 12:/mnt/hgfs/boot/booter/source/tlb.c **** 13:/mnt/hgfs/boot/booter/source/tlb.c **** } PTE; 14:/mnt/hgfs/boot/booter/source/tlb.c **** 15:/mnt/hgfs/boot/booter/source/tlb.c **** /* 16:/mnt/hgfs/boot/booter/source/tlb.c **** * Level 1 Page Table, array of pointers to real PTEs 17:/mnt/hgfs/boot/booter/source/tlb.c **** */ 18:/mnt/hgfs/boot/booter/source/tlb.c **** PTE *L1PTE[256]; 19:/mnt/hgfs/boot/booter/source/tlb.c **** 20:/mnt/hgfs/boot/booter/source/tlb.c **** /* 21:/mnt/hgfs/boot/booter/source/tlb.c **** * Level 2 Page Table, array of PTEs 22:/mnt/hgfs/boot/booter/source/tlb.c **** */ 23:/mnt/hgfs/boot/booter/source/tlb.c **** PTE L2PTE[4096]; 24:/mnt/hgfs/boot/booter/source/tlb.c **** 25:/mnt/hgfs/boot/booter/source/tlb.c **** /* Simple virtual alloc scheme...arbitrary, just stay out of KSEG0,1 */ 26:/mnt/hgfs/boot/booter/source/tlb.c **** static char *lastVA = (char *)0x50000000; 27:/mnt/hgfs/boot/booter/source/tlb.c **** GAS LISTING /tmp/ccLt6UhX.s page 2 28:/mnt/hgfs/boot/booter/source/tlb.c **** /********************************************************************/ 29:/mnt/hgfs/boot/booter/source/tlb.c **** void 30:/mnt/hgfs/boot/booter/source/tlb.c **** tlbInit (void) 31:/mnt/hgfs/boot/booter/source/tlb.c **** { 25 .loc 1 31 0 26 .frame $sp,24,$31 # vars= 0, regs= 1/0, args= 16, gp= 0 27 .mask 0x80000000,-8 28 .fmask 0x00000000,0 29 .set noreorder 30 .set nomacro 31 32 0000 E8FFBD27 addiu $sp,$sp,-24 33 $LCFI0: 32:/mnt/hgfs/boot/booter/source/tlb.c **** extern void asmTlbInit (void); 33:/mnt/hgfs/boot/booter/source/tlb.c **** extern uint32 asmTlbRefillHandler[]; 34:/mnt/hgfs/boot/booter/source/tlb.c **** extern uint32 asmTlbRefillHandlerEnd[]; 35:/mnt/hgfs/boot/booter/source/tlb.c **** uint32 va; 36:/mnt/hgfs/boot/booter/source/tlb.c **** int i; 37:/mnt/hgfs/boot/booter/source/tlb.c **** 38:/mnt/hgfs/boot/booter/source/tlb.c **** uint32 *v = (uint32 *)0x80000000; 39:/mnt/hgfs/boot/booter/source/tlb.c **** uint32 *p, *q; 40:/mnt/hgfs/boot/booter/source/tlb.c **** 41:/mnt/hgfs/boot/booter/source/tlb.c **** /* 42:/mnt/hgfs/boot/booter/source/tlb.c **** * Install TLB Refill handler. 43:/mnt/hgfs/boot/booter/source/tlb.c **** */ 44:/mnt/hgfs/boot/booter/source/tlb.c **** p = asmTlbRefillHandler; 34 .loc 1 44 0 35 0004 0000023C lui $2,%hi(asmTlbRefillHandler) 45:/mnt/hgfs/boot/booter/source/tlb.c **** q = asmTlbRefillHandlerEnd; 36 .loc 1 45 0 37 0008 0000033C lui $3,%hi(asmTlbRefillHandlerEnd) 38 .loc 1 31 0 39 000c 1000BFAF sw $31,16($sp) 40 $LCFI1: 41 .loc 1 44 0 42 0010 00004524 addiu $5,$2,%lo(asmTlbRefillHandler) 43 .loc 1 45 0 44 0014 00006624 addiu $6,$3,%lo(asmTlbRefillHandlerEnd) 45 .loc 1 38 0 46 0018 0080043C li $4,-2147483648 # 0xffffffff80000000 47 $L2: 46:/mnt/hgfs/boot/booter/source/tlb.c **** do 47:/mnt/hgfs/boot/booter/source/tlb.c **** { 48:/mnt/hgfs/boot/booter/source/tlb.c **** *v++ = *p++; 48 .loc 1 48 0 49 001c 0000A28C lw $2,0($5) 50 0020 0400A524 addiu $5,$5,4 49:/mnt/hgfs/boot/booter/source/tlb.c **** } while (p < q); 51 .loc 1 49 0 52 0024 2B18A600 sltu $3,$5,$6 53 .loc 1 48 0 54 0028 000082AC sw $2,0($4) 55 .loc 1 49 0 56 002c FBFF6014 bne $3,$0,$L2 57 0030 04008424 addiu $4,$4,4 58 50:/mnt/hgfs/boot/booter/source/tlb.c **** dcacheFlush();GAS LISTING /tmp/ccLt6UhX.s page 3 59 .loc 1 50 0 60 0034 0000000C jal dcacheFlush 61 0038 00000000 nop 62 51:/mnt/hgfs/boot/booter/source/tlb.c **** icacheFlush(); 63 .loc 1 51 0 64 003c 0000000C jal icacheFlush 65 0040 00000000 nop 66 52:/mnt/hgfs/boot/booter/source/tlb.c **** 53:/mnt/hgfs/boot/booter/source/tlb.c **** /* 54:/mnt/hgfs/boot/booter/source/tlb.c **** * Clear Status[EXL, ERL] 55:/mnt/hgfs/boot/booter/source/tlb.c **** */ 56:/mnt/hgfs/boot/booter/source/tlb.c **** cp0WrStatus(cp0RdStatus() & ~(STATUS_EXL | STATUS_ERL)); 67 .loc 1 56 0 68 0044 0000000C jal cp0RdStatus 69 0048 00000000 nop 70 71 004c F9FF0424 li $4,-7 # 0xfffffffffffffff9 72 0050 0000000C jal cp0WrStatus 73 0054 24204400 and $4,$2,$4 74 57:/mnt/hgfs/boot/booter/source/tlb.c **** 58:/mnt/hgfs/boot/booter/source/tlb.c **** asmTlbInit(); 75 .loc 1 58 0 76 0058 0000000C jal asmTlbInit 77 005c 00000000 nop 78 59:/mnt/hgfs/boot/booter/source/tlb.c **** 60:/mnt/hgfs/boot/booter/source/tlb.c **** cp0WrPageMask(0x00000000); /* 4KB pages */ 79 .loc 1 60 0 80 0060 0000000C jal cp0WrPageMask 81 0064 21200000 move $4,$0 82 83 0068 0000043C lui $4,%hi(L1PTE) 84 006c 00008224 addiu $2,$4,%lo(L1PTE) 85 0070 FF000324 li $3,255 # 0xff 86 $L8: 61:/mnt/hgfs/boot/booter/source/tlb.c **** #define PAGE_SIZE 4096 62:/mnt/hgfs/boot/booter/source/tlb.c **** 63:/mnt/hgfs/boot/booter/source/tlb.c **** /* 64:/mnt/hgfs/boot/booter/source/tlb.c **** * Initialize L1PTE and L2PTE 65:/mnt/hgfs/boot/booter/source/tlb.c **** */ 66:/mnt/hgfs/boot/booter/source/tlb.c **** for (i = 0; i < 256; ++i) 87 .loc 1 66 0 88 0074 FFFF6324 addiu $3,$3,-1 67:/mnt/hgfs/boot/booter/source/tlb.c **** L1PTE[i] = NULL; 89 .loc 1 67 0 90 0078 000040AC sw $0,0($2) 91 007c FDFF6104 bgez $3,$L8 92 0080 04004224 addiu $2,$2,4 93 94 0084 0000023C lui $2,%hi(L2PTE) 95 0088 00004524 addiu $5,$2,%lo(L2PTE) 96 008c 2110A000 move $2,$5 97 0090 FF0F0324 li $3,4095 # 0xfff 98 $L12:GAS LISTING /tmp/ccLt6UhX.s page 4 68:/mnt/hgfs/boot/booter/source/tlb.c **** for (i = 0; i < 4096; ++i) 99 .loc 1 68 0 100 0094 FFFF6324 addiu $3,$3,-1 69:/mnt/hgfs/boot/booter/source/tlb.c **** { 70:/mnt/hgfs/boot/booter/source/tlb.c **** L2PTE[i].EntryLo0 = NULL; 101 .loc 1 70 0 102 0098 000040AC sw $0,0($2) 71:/mnt/hgfs/boot/booter/source/tlb.c **** L2PTE[i].EntryLo1 = NULL; 103 .loc 1 71 0 104 009c 040040AC sw $0,4($2) 105 00a0 FCFF6104 bgez $3,$L12 106 00a4 08004224 addiu $2,$2,8 107 72:/mnt/hgfs/boot/booter/source/tlb.c **** } 73:/mnt/hgfs/boot/booter/source/tlb.c **** 74:/mnt/hgfs/boot/booter/source/tlb.c **** /* Connect L2PTE */ 75:/mnt/hgfs/boot/booter/source/tlb.c **** va = (uint32)lastVA; 76:/mnt/hgfs/boot/booter/source/tlb.c **** va >>= 24; 108 .loc 1 76 0 109 00a8 0000023C lui $2,%hi(lastVA) 110 00ac 03004390 lbu $3,%lo(lastVA+3)($2) 77:/mnt/hgfs/boot/booter/source/tlb.c **** L1PTE[(int)va] = L2PTE; 111 .loc 1 77 0 112 00b0 1000BF8F lw $31,16($sp) 113 00b4 00008424 addiu $4,$4,%lo(L1PTE) 114 00b8 80180300 sll $3,$3,2 115 00bc 21186400 addu $3,$3,$4 116 00c0 1800BD27 addiu $sp,$sp,24 117 00c4 0800E003 j $31 118 00c8 000065AC sw $5,0($3) 119 120 .set macro 121 .set reorder 122 $LFE2: 123 .end tlbInit 124 .section .rodata.str1.4,"aMS",@progbits,1 125 .align 2 126 $LC0: 127 0000 4552524F .ascii "ERROR: must walk PTE array\n\000" 127 523A206D 127 75737420 127 77616C6B 127 20505445 128 .text 129 .align 2 130 .globl mapVirtualToPhysical 131 .ent mapVirtualToPhysical 132 .type mapVirtualToPhysical, @function 133 mapVirtualToPhysical: 134 $LFB3: 78:/mnt/hgfs/boot/booter/source/tlb.c **** 79:/mnt/hgfs/boot/booter/source/tlb.c **** /* For test purposes only */ 80:/mnt/hgfs/boot/booter/source/tlb.c **** //L1PTE[0] = L2PTE; 81:/mnt/hgfs/boot/booter/source/tlb.c **** //L2PTE[0].EntryLo0 = (0x00000000 >> 6) | 0x17; 82:/mnt/hgfs/boot/booter/source/tlb.c **** //L2PTE[0].EntryLo1 = 0; 83:/mnt/hgfs/boot/booter/source/tlb.c **** 84:/mnt/hgfs/boot/booter/source/tlb.c **** /* FIX!!! L1PTE must meet alignment requirements firstGAS LISTING /tmp/ccLt6UhX.s page 5 85:/mnt/hgfs/boot/booter/source/tlb.c **** cp0WrContext((uint32)L1PTE); 86:/mnt/hgfs/boot/booter/source/tlb.c **** */ 87:/mnt/hgfs/boot/booter/source/tlb.c **** } 88:/mnt/hgfs/boot/booter/source/tlb.c **** 89:/mnt/hgfs/boot/booter/source/tlb.c **** /********************************************************************/ 90:/mnt/hgfs/boot/booter/source/tlb.c **** phys_t 91:/mnt/hgfs/boot/booter/source/tlb.c **** mapVirtualToPhysical (void *va) 92:/mnt/hgfs/boot/booter/source/tlb.c **** { 135 .loc 1 92 0 136 .frame $sp,32,$31 # vars= 0, regs= 3/0, args= 16, gp= 0 137 .mask 0x80030000,-8 138 .fmask 0x00000000,0 139 .set noreorder 140 .set nomacro 141 93:/mnt/hgfs/boot/booter/source/tlb.c **** phys_t pa = NULL; 94:/mnt/hgfs/boot/booter/source/tlb.c **** 95:/mnt/hgfs/boot/booter/source/tlb.c **** if ((va >= (void *)0x80000000) && (va < (void *)0xC0000000)) 142 .loc 1 95 0 143 00cc 0080023C li $2,-2147483648 # 0xffffffff80000000 144 00d0 FF3F033C li $3,1073676288 # 0x3fff0000 145 00d4 21108200 addu $2,$4,$2 146 00d8 FFFF6334 ori $3,$3,0xffff 147 .loc 1 92 0 148 00dc E0FFBD27 addiu $sp,$sp,-32 149 $LCFI2: 150 00e0 21288000 move $5,$4 151 .loc 1 95 0 152 00e4 2B186200 sltu $3,$3,$2 96:/mnt/hgfs/boot/booter/source/tlb.c **** { 97:/mnt/hgfs/boot/booter/source/tlb.c **** pa = (phys_t)((uint32)va & ~0xE0000000); 98:/mnt/hgfs/boot/booter/source/tlb.c **** } 99:/mnt/hgfs/boot/booter/source/tlb.c **** else 100:/mnt/hgfs/boot/booter/source/tlb.c **** printf("ERROR: must walk PTE array\n"); 153 .loc 1 100 0 154 00e8 0000043C lui $4,%hi($LC0) 155 .loc 1 92 0 156 00ec 1400B1AF sw $17,20($sp) 157 $LCFI3: 158 00f0 1000B0AF sw $16,16($sp) 159 $LCFI4: 160 00f4 1800BFAF sw $31,24($sp) 161 $LCFI5: 162 .loc 1 100 0 163 00f8 00008424 addiu $4,$4,%lo($LC0) 164 .loc 1 93 0 165 00fc 21800000 move $16,$0 166 .loc 1 95 0 167 0100 0C006014 bne $3,$0,$L19 168 0104 21880000 move $17,$0 169 170 .loc 1 97 0 171 0108 FF1F023C li $2,536805376 # 0x1fff0000 172 010c FFFF4234 ori $2,$2,0xffff 173 0110 2480A200 and $16,$5,$2 174 0114 21880000 move $17,$0 101:/mnt/hgfs/boot/booter/source/tlb.c **** GAS LISTING /tmp/ccLt6UhX.s page 6 102:/mnt/hgfs/boot/booter/source/tlb.c **** return pa; 103:/mnt/hgfs/boot/booter/source/tlb.c **** } 175 .loc 1 103 0 176 0118 21100002 move $2,$16 177 011c 21182002 move $3,$17 178 0120 1800BF8F lw $31,24($sp) 179 0124 1400B18F lw $17,20($sp) 180 0128 1000B08F lw $16,16($sp) 181 012c 0800E003 j $31 182 0130 2000BD27 addiu $sp,$sp,32 183 184 $L19: 185 .loc 1 100 0 186 0134 0000000C jal printf 187 0138 00000000 nop 188 189 .loc 1 103 0 190 013c 21100002 move $2,$16 191 0140 21182002 move $3,$17 192 0144 1800BF8F lw $31,24($sp) 193 0148 1400B18F lw $17,20($sp) 194 014c 1000B08F lw $16,16($sp) 195 0150 0800E003 j $31 196 0154 2000BD27 addiu $sp,$sp,32 197 198 .set macro 199 .set reorder 200 $LFE3: 201 .end mapVirtualToPhysical 202 .align 2 203 .globl valloc 204 .ent valloc 205 .type valloc, @function 206 valloc: 207 $LFB4: 104:/mnt/hgfs/boot/booter/source/tlb.c **** 105:/mnt/hgfs/boot/booter/source/tlb.c **** /********************************************************************/ 106:/mnt/hgfs/boot/booter/source/tlb.c **** void * 107:/mnt/hgfs/boot/booter/source/tlb.c **** valloc (unsigned long size, unsigned long flags) 108:/mnt/hgfs/boot/booter/source/tlb.c **** { 208 .loc 1 108 0 209 .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 210 .mask 0x00000000,0 211 .fmask 0x00000000,0 212 .set noreorder 213 .set nomacro 214 109:/mnt/hgfs/boot/booter/source/tlb.c **** /* 110:/mnt/hgfs/boot/booter/source/tlb.c **** * Allocate a chunk of virtual address space 111:/mnt/hgfs/boot/booter/source/tlb.c **** * FIX Someday let flags specify an alignment? 112:/mnt/hgfs/boot/booter/source/tlb.c **** */ 113:/mnt/hgfs/boot/booter/source/tlb.c **** void *va; 114:/mnt/hgfs/boot/booter/source/tlb.c **** 115:/mnt/hgfs/boot/booter/source/tlb.c **** /* NOTE: There is no check for overflow of the single L2PTE */ 116:/mnt/hgfs/boot/booter/source/tlb.c ****
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -