cpt_upgrader.py (9959:ad4564da49b5) | cpt_upgrader.py (10037:5cac77888310) |
---|---|
1#!/usr/bin/env python 2 3# Copyright (c) 2012-2013 ARM Limited 4# All rights reserved 5# 6# The license below extends only to copyright in the software and shall 7# not be construed as granting a license to any other intellectual 8# property including but not limited to intellectual property relating --- 211 unchanged lines hidden (view full) --- 220# Version 8 of the checkpoint adds an ARM MISCREG 221def from_7(cpt): 222 if cpt.get('root','isa') == 'arm': 223 for sec in cpt.sections(): 224 import re 225 # Search for all ISA sections 226 if re.search('.*sys.*\.cpu.*\.isa', sec): 227 mr = cpt.get(sec, 'miscRegs').split() | 1#!/usr/bin/env python 2 3# Copyright (c) 2012-2013 ARM Limited 4# All rights reserved 5# 6# The license below extends only to copyright in the software and shall 7# not be construed as granting a license to any other intellectual 8# property including but not limited to intellectual property relating --- 211 unchanged lines hidden (view full) --- 220# Version 8 of the checkpoint adds an ARM MISCREG 221def from_7(cpt): 222 if cpt.get('root','isa') == 'arm': 223 for sec in cpt.sections(): 224 import re 225 # Search for all ISA sections 226 if re.search('.*sys.*\.cpu.*\.isa', sec): 227 mr = cpt.get(sec, 'miscRegs').split() |
228 # Add dummy value for MISCREG_TEEHBR 229 mr.insert(51,0); 230 cpt.set(sec, 'miscRegs', ' '.join(str(x) for x in mr)) | 228 if len(mr) == 161: 229 print "MISCREG_TEEHBR already seems to be inserted." 230 else: 231 # Add dummy value for MISCREG_TEEHBR 232 mr.insert(51,0); 233 cpt.set(sec, 'miscRegs', ' '.join(str(x) for x in mr)) |
231 | 234 |
235# Version 9 of the checkpoint adds an all ARMv8 state 236def from_8(cpt): 237 if cpt.get('root','isa') != 'arm': 238 return 239 import re 240 print "Warning: The size of the FP register file has changed. "\ 241 "To get similar results you need to adjust the number of "\ 242 "physical registers in the CPU you're restoring into by "\ 243 "NNNN." 244 # Find the CPU context's and upgrade their registers 245 for sec in cpt.sections(): 246 re_xc_match = re.match('^.*?sys.*?\.cpu(\d+)*\.xc\.*', sec) 247 if not re_xc_match: 248 continue |
|
232 | 249 |
250 # Update floating point regs 251 fpr = cpt.get(sec, 'floatRegs.i').split() 252 # v8 has 128 normal fp and 32 special fp regs compared 253 # to v7's 64 normal fp and 8 special fp regs. 254 # Insert the extra normal fp registers at end of v7 normal fp regs 255 for x in xrange(64): 256 fpr.insert(64, "0") 257 # Append the extra special registers 258 for x in xrange(24): 259 fpr.append("0") 260 cpt.set(sec, 'floatRegs.i', ' '.join(str(x) for x in fpr)) 261 262 ir = cpt.get(sec, 'intRegs').split() 263 # Add in v8 int reg state 264 # Splice in R13_HYP 265 ir.insert(20, "0") 266 # Splice in INTREG_DUMMY and SP0 - SP3 267 ir.extend(["0", "0", "0", "0", "0"]) 268 cpt.set(sec, 'intRegs', ' '.join(str(x) for x in ir)) 269 270 # Update the cpu interrupt field 271 for sec in cpt.sections(): 272 re_int_match = re.match("^.*?sys.*?\.cpu(\d+)*$", sec) 273 if not re_int_match: 274 continue 275 276 irqs = cpt.get(sec, "interrupts").split() 277 irqs.append("false") 278 irqs.append("false") 279 cpt.set(sec, "interrupts", ' '.join(str(x) for x in irqs)) 280 281 # Update the per cpu interrupt structure 282 for sec in cpt.sections(): 283 re_int_match = re.match("^.*?sys.*?\.cpu(\d+)*\.interrupts$", sec) 284 if not re_int_match: 285 continue 286 287 irqs = cpt.get(sec, "interrupts").split() 288 irqs.append("false") 289 irqs.append("false") 290 cpt.set(sec, "interrupts", ' '.join(str(x) for x in irqs)) 291 292 # Update the misc regs and add in new isa specific fields 293 for sec in cpt.sections(): 294 re_isa_match = re.match("^.*?sys.*?\.cpu(\d+)*\.isa$", sec) 295 if not re_isa_match: 296 continue 297 298 cpt.set(sec, 'haveSecurity', 'false') 299 cpt.set(sec, 'haveLPAE', 'false') 300 cpt.set(sec, 'haveVirtualization', 'false') 301 cpt.set(sec, 'haveLargeAsid64', 'false') 302 cpt.set(sec, 'physAddrRange64', '40') 303 304 # splice in the new misc registers, ~200 -> 605 registers, 305 # ordering does not remain consistent 306 mr_old = cpt.get(sec, 'miscRegs').split() 307 mr_new = [ '0' for x in xrange(605) ] 308 309 # map old v7 miscRegs to new v8 miscRegs 310 mr_new[0] = mr_old[0] # CPSR 311 mr_new[16] = mr_old[1] # CPSR_Q 312 mr_new[1] = mr_old[2] # SPSR 313 mr_new[2] = mr_old[3] # SPSR_FIQ 314 mr_new[3] = mr_old[4] # SPSR_IRQ 315 mr_new[4] = mr_old[5] # SPSR_SVC 316 mr_new[5] = mr_old[6] # SPSR_MON 317 mr_new[8] = mr_old[7] # SPSR_UND 318 mr_new[6] = mr_old[8] # SPSR_ABT 319 mr_new[432] = mr_old[9] # FPSR 320 mr_new[10] = mr_old[10] # FPSID 321 mr_new[11] = mr_old[11] # FPSCR 322 mr_new[18] = mr_old[12] # FPSCR_QC 323 mr_new[17] = mr_old[13] # FPSCR_EXC 324 mr_new[14] = mr_old[14] # FPEXC 325 mr_new[13] = mr_old[15] # MVFR0 326 mr_new[12] = mr_old[16] # MVFR1 327 mr_new[28] = mr_old[17] # SCTLR_RST, 328 mr_new[29] = mr_old[18] # SEV_MAILBOX, 329 mr_new[30] = mr_old[19] # DBGDIDR 330 mr_new[31] = mr_old[20] # DBGDSCR_INT, 331 mr_new[33] = mr_old[21] # DBGDTRRX_INT, 332 mr_new[34] = mr_old[22] # DBGTRTX_INT, 333 mr_new[35] = mr_old[23] # DBGWFAR, 334 mr_new[36] = mr_old[24] # DBGVCR, 335 #mr_new[] = mr_old[25] # DBGECR -> UNUSED, 336 #mr_new[] = mr_old[26] # DBGDSCCR -> UNUSED, 337 #mr_new[] = mr_old[27] # DBGSMCR -> UNUSED, 338 mr_new[37] = mr_old[28] # DBGDTRRX_EXT, 339 mr_new[38] = mr_old[29] # DBGDSCR_EXT, 340 mr_new[39] = mr_old[30] # DBGDTRTX_EXT, 341 #mr_new[] = mr_old[31] # DBGDRCR -> UNUSED, 342 mr_new[41] = mr_old[32] # DBGBVR, 343 mr_new[47] = mr_old[33] # DBGBCR, 344 #mr_new[] = mr_old[34] # DBGBVR_M -> UNUSED, 345 #mr_new[] = mr_old[35] # DBGBCR_M -> UNUSED, 346 mr_new[61] = mr_old[36] # DBGDRAR, 347 #mr_new[] = mr_old[37] # DBGBXVR_M -> UNUSED, 348 mr_new[64] = mr_old[38] # DBGOSLAR, 349 #mr_new[] = mr_old[39] # DBGOSSRR -> UNUSED, 350 mr_new[66] = mr_old[40] # DBGOSDLR, 351 mr_new[67] = mr_old[41] # DBGPRCR, 352 #mr_new[] = mr_old[42] # DBGPRSR -> UNUSED, 353 mr_new[68] = mr_old[43] # DBGDSAR, 354 #mr_new[] = mr_old[44] # DBGITCTRL -> UNUSED, 355 mr_new[69] = mr_old[45] # DBGCLAIMSET, 356 mr_new[70] = mr_old[46] # DBGCLAIMCLR, 357 mr_new[71] = mr_old[47] # DBGAUTHSTATUS, 358 mr_new[72] = mr_old[48] # DBGDEVID2, 359 mr_new[73] = mr_old[49] # DBGDEVID1, 360 mr_new[74] = mr_old[50] # DBGDEVID, 361 mr_new[77] = mr_old[51] # TEEHBR, 362 mr_new[109] = mr_old[52] # v7 SCTLR -> aarc32 SCTLR_NS 363 mr_new[189] = mr_old[53] # DCCISW, 364 mr_new[188] = mr_old[54] # DCCIMVAC, 365 mr_new[183] = mr_old[55] # DCCMVAC, 366 mr_new[271] = mr_old[56] # v7 CONTEXTIDR -> aarch32 CONTEXTIDR_NS, 367 mr_new[274] = mr_old[57] # v7 TPIDRURW -> aarch32 TPIDRURW_NS, 368 mr_new[277] = mr_old[58] # v7 TPIDRURO -> aarch32 TPIDRURO_NS, 369 mr_new[280] = mr_old[59] # v7 TPIDRPRW -> aarch32 TPIDRPRW_NS, 370 mr_new[170] = mr_old[60] # CP15ISB, 371 mr_new[185] = mr_old[61] # CP15DSB, 372 mr_new[186] = mr_old[62] # CP15DMB, 373 mr_new[114] = mr_old[63] # CPACR, 374 mr_new[101] = mr_old[64] # CLIDR, 375 mr_new[100] = mr_old[65] # CCSIDR, 376 mr_new[104] = mr_old[66] # v7 CSSELR -> aarch32 CSSELR_NS, 377 mr_new[163] = mr_old[67] # ICIALLUIS, 378 mr_new[168] = mr_old[68] # ICIALLU, 379 mr_new[169] = mr_old[69] # ICIMVAU, 380 mr_new[172] = mr_old[70] # BPIMVA, 381 mr_new[164] = mr_old[71] # BPIALLIS, 382 mr_new[171] = mr_old[72] # BPIALL, 383 mr_new[80] = mr_old[73] # MIDR, 384 mr_new[126] = mr_old[74] # v7 TTBR0 -> aarch32 TTBR0_NS, 385 mr_new[129] = mr_old[75] # v7 TTBR1 -> aarch32 TTBR1_NS, 386 mr_new[83] = mr_old[76] # TLBTR, 387 mr_new[137] = mr_old[77] # v7 DACR -> aarch32 DACR_NS, 388 mr_new[192] = mr_old[78] # TLBIALLIS, 389 mr_new[193] = mr_old[79] # TLBIMVAIS, 390 mr_new[194] = mr_old[80] # TLBIASIDIS, 391 mr_new[195] = mr_old[81] # TLBIMVAAIS, 392 mr_new[198] = mr_old[82] # ITLBIALL, 393 mr_new[199] = mr_old[83] # ITLBIMVA, 394 mr_new[200] = mr_old[84] # ITLBIASID, 395 mr_new[201] = mr_old[85] # DTLBIALL, 396 mr_new[202] = mr_old[86] # DTLBIMVA, 397 mr_new[203] = mr_old[87] # DTLBIASID, 398 mr_new[204] = mr_old[88] # TLBIALL, 399 mr_new[205] = mr_old[89] # TLBIMVA, 400 mr_new[206] = mr_old[90] # TLBIASID, 401 mr_new[207] = mr_old[91] # TLBIMVAA, 402 mr_new[140] = mr_old[92] # v7 DFSR -> aarch32 DFSR_NS, 403 mr_new[143] = mr_old[93] # v7 IFSR -> aarch32 IFSR_NS, 404 mr_new[155] = mr_old[94] # v7 DFAR -> aarch32 DFAR_NS, 405 mr_new[158] = mr_old[95] # v7 IFAR -> aarch32 IFAR_NS, 406 mr_new[84] = mr_old[96] # MPIDR, 407 mr_new[241] = mr_old[97] # v7 PRRR -> aarch32 PRRR_NS, 408 mr_new[247] = mr_old[98] # v7 NMRR -> aarch32 NMRR_NS, 409 mr_new[131] = mr_old[99] # TTBCR, 410 mr_new[86] = mr_old[100] # ID_PFR0, 411 mr_new[81] = mr_old[101] # CTR, 412 mr_new[115] = mr_old[102] # SCR, 413 # Set the non-secure bit 414 scr = int(mr_new[115]) 415 scr = scr | 0x1 416 mr_new[115] = str(scr) 417 ### 418 mr_new[116] = mr_old[103] # SDER, 419 mr_new[165] = mr_old[104] # PAR, 420 mr_new[175] = mr_old[105] # V2PCWPR -> ATS1CPR, 421 mr_new[176] = mr_old[106] # V2PCWPW -> ATS1CPW, 422 mr_new[177] = mr_old[107] # V2PCWUR -> ATS1CUR, 423 mr_new[178] = mr_old[108] # V2PCWUW -> ATS1CUW, 424 mr_new[179] = mr_old[109] # V2POWPR -> ATS12NSOPR, 425 mr_new[180] = mr_old[110] # V2POWPW -> ATS12NSOPW, 426 mr_new[181] = mr_old[111] # V2POWUR -> ATS12NSOUR, 427 mr_new[182] = mr_old[112] # V2POWUW -> ATS12NWOUW, 428 mr_new[90] = mr_old[113] # ID_MMFR0, 429 mr_new[92] = mr_old[114] # ID_MMFR2, 430 mr_new[93] = mr_old[115] # ID_MMFR3, 431 mr_new[112] = mr_old[116] # v7 ACTLR -> aarch32 ACTLR_NS 432 mr_new[222] = mr_old[117] # PMCR, 433 mr_new[230] = mr_old[118] # PMCCNTR, 434 mr_new[223] = mr_old[119] # PMCNTENSET, 435 mr_new[224] = mr_old[120] # PMCNTENCLR, 436 mr_new[225] = mr_old[121] # PMOVSR, 437 mr_new[226] = mr_old[122] # PMSWINC, 438 mr_new[227] = mr_old[123] # PMSELR, 439 mr_new[228] = mr_old[124] # PMCEID0, 440 mr_new[229] = mr_old[125] # PMCEID1, 441 mr_new[231] = mr_old[126] # PMXEVTYPER, 442 mr_new[233] = mr_old[127] # PMXEVCNTR, 443 mr_new[234] = mr_old[128] # PMUSERENR, 444 mr_new[235] = mr_old[129] # PMINTENSET, 445 mr_new[236] = mr_old[130] # PMINTENCLR, 446 mr_new[94] = mr_old[131] # ID_ISAR0, 447 mr_new[95] = mr_old[132] # ID_ISAR1, 448 mr_new[96] = mr_old[133] # ID_ISAR2, 449 mr_new[97] = mr_old[134] # ID_ISAR3, 450 mr_new[98] = mr_old[135] # ID_ISAR4, 451 mr_new[99] = mr_old[136] # ID_ISAR5, 452 mr_new[20] = mr_old[137] # LOCKFLAG, 453 mr_new[19] = mr_old[138] # LOCKADDR, 454 mr_new[87] = mr_old[139] # ID_PFR1, 455 # Set up the processor features register 456 pfr = int(mr_new[87]) 457 pfr = pfr | 0x1011 458 mr_new[87] = str(pfr) 459 ### 460 mr_new[238] = mr_old[140] # L2CTLR, 461 mr_new[82] = mr_old[141] # TCMTR 462 mr_new[88] = mr_old[142] # ID_DFR0, 463 mr_new[89] = mr_old[143] # ID_AFR0, 464 mr_new[91] = mr_old[144] # ID_MMFR1, 465 mr_new[102] = mr_old[145] # AIDR, 466 mr_new[146] = mr_old[146] # v7 ADFSR -> aarch32 ADFSR_NS, 467 mr_new[148] = mr_old[147] # AIFSR, 468 mr_new[173] = mr_old[148] # DCIMVAC, 469 mr_new[174] = mr_old[149] # DCISW, 470 mr_new[184] = mr_old[150] # MCCSW -> DCCSW, 471 mr_new[187] = mr_old[151] # DCCMVAU, 472 mr_new[117] = mr_old[152] # NSACR, 473 mr_new[262] = mr_old[153] # VBAR, 474 mr_new[265] = mr_old[154] # MVBAR, 475 mr_new[267] = mr_old[155] # ISR, 476 mr_new[269] = mr_old[156] # FCEIDR -> FCSEIDR, 477 #mr_new[] = mr_old[157] # L2LATENCY -> UNUSED, 478 #mr_new[] = mr_old[158] # CRN15 -> UNUSED, 479 mr_new[599] = mr_old[159] # NOP 480 mr_new[600] = mr_old[160] # RAZ, 481 482 # Set the new miscRegs structure 483 cpt.set(sec, 'miscRegs', ' '.join(str(x) for x in mr_new)) 484 485 cpu_prefix = {} 486 # Add in state for ITB/DTB 487 for sec in cpt.sections(): 488 re_tlb_match = re.match('(^.*?sys.*?\.cpu(\d+)*)\.(dtb|itb)$', sec) 489 if not re_tlb_match: 490 continue 491 492 cpu_prefix[re_tlb_match.group(1)] = True # Save off prefix to add 493 # Set the non-secure bit (bit 9) to 1 for attributes 494 attr = int(cpt.get(sec, '_attr')) 495 attr = attr | 0x200 496 cpt.set(sec, '_attr', str(attr)) 497 cpt.set(sec, 'haveLPAE', 'false') 498 cpt.set(sec, 'directToStage2', 'false') 499 cpt.set(sec, 'stage2Req', 'false') 500 cpt.set(sec, 'bootUncacheability', 'true') 501 502 # Add in extra state for the new TLB Entries 503 for sec in cpt.sections(): 504 re_tlbentry_match = re.match('(^.*?sys.*?\.cpu(\d+)*)\.(dtb|itb).TlbEntry\d+$', sec) 505 if not re_tlbentry_match: 506 continue 507 508 # Add in the new entries 509 cpt.set(sec, 'longDescFormat', 'false') 510 cpt.set(sec, 'vmid', '0') 511 cpt.set(sec, 'isHyp', 'false') 512 valid = cpt.get(sec, 'valid') 513 if valid == 'true': 514 cpt.set(sec, 'ns', 'true') 515 cpt.set(sec, 'nstid', 'true') 516 cpt.set(sec, 'pxn', 'true') 517 cpt.set(sec, 'hap', '3') 518 # All v7 code used 2 level page tables 519 cpt.set(sec, 'lookupLevel', '2') 520 attr = int(cpt.get(sec, 'attributes')) 521 # set the non-secure bit (bit 9) to 1 522 # as no previous v7 code used secure code 523 attr = attr | 0x200 524 cpt.set(sec, 'attributes', str(attr)) 525 else: 526 cpt.set(sec, 'ns', 'false') 527 cpt.set(sec, 'nstid', 'false') 528 cpt.set(sec, 'pxn', 'false') 529 cpt.set(sec, 'hap', '0') 530 cpt.set(sec, 'lookupLevel', '0') 531 cpt.set(sec, 'outerShareable', 'false') 532 533 # Add d/istage2_mmu and d/istage2_mmu.stage2_tlb 534 for key in cpu_prefix: 535 for suffix in ['.istage2_mmu', '.dstage2_mmu']: 536 new_sec = key + suffix 537 cpt.add_section(new_sec) 538 new_sec = key + suffix + ".stage2_tlb" 539 cpt.add_section(new_sec) 540 # Fill in tlb info with some defaults 541 cpt.set(new_sec, '_attr', '0') 542 cpt.set(new_sec, 'haveLPAE', 'false') 543 cpt.set(new_sec, 'directToStage2', 'false') 544 cpt.set(new_sec, 'stage2Req', 'false') 545 cpt.set(new_sec, 'bootUncacheability', 'false') 546 cpt.set(new_sec, 'num_entries', '0') 547 548 |
|
233migrations = [] 234migrations.append(from_0) 235migrations.append(from_1) 236migrations.append(from_2) 237migrations.append(from_3) 238migrations.append(from_4) 239migrations.append(from_5) 240migrations.append(from_6) 241migrations.append(from_7) | 549migrations = [] 550migrations.append(from_0) 551migrations.append(from_1) 552migrations.append(from_2) 553migrations.append(from_3) 554migrations.append(from_4) 555migrations.append(from_5) 556migrations.append(from_6) 557migrations.append(from_7) |
558migrations.append(from_8) |
|
242 243verbose_print = False 244 245def verboseprint(*args): 246 if not verbose_print: 247 return 248 for arg in args: 249 print arg, --- 95 unchanged lines hidden --- | 559 560verbose_print = False 561 562def verboseprint(*args): 563 if not verbose_print: 564 return 565 for arg in args: 566 print arg, --- 95 unchanged lines hidden --- |