diff options
| -rw-r--r-- | arch/powerpc/kernel/exceptions-64e.S | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S index 0204c39f438e..2beb5bd0728b 100644 --- a/arch/powerpc/kernel/exceptions-64e.S +++ b/arch/powerpc/kernel/exceptions-64e.S | |||
| @@ -148,10 +148,8 @@ | |||
| 148 | std r15,PACA_EXMC+EX_R15(r13) | 148 | std r15,PACA_EXMC+EX_R15(r13) |
| 149 | 149 | ||
| 150 | 150 | ||
| 151 | /* Core exception code for all exceptions except TLB misses. | 151 | /* Core exception code for all exceptions except TLB misses. */ |
| 152 | * XXX: Needs to make SPRN_SPRG_GEN depend on exception type | 152 | #define EXCEPTION_COMMON_LVL(n, scratch, excf) \ |
| 153 | */ | ||
| 154 | #define EXCEPTION_COMMON(n, excf) \ | ||
| 155 | exc_##n##_common: \ | 153 | exc_##n##_common: \ |
| 156 | std r0,GPR0(r1); /* save r0 in stackframe */ \ | 154 | std r0,GPR0(r1); /* save r0 in stackframe */ \ |
| 157 | std r2,GPR2(r1); /* save r2 in stackframe */ \ | 155 | std r2,GPR2(r1); /* save r2 in stackframe */ \ |
| @@ -164,7 +162,7 @@ exc_##n##_common: \ | |||
| 164 | ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ | 162 | ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ |
| 165 | 2: ld r3,excf+EX_R10(r13); /* get back r10 */ \ | 163 | 2: ld r3,excf+EX_R10(r13); /* get back r10 */ \ |
| 166 | ld r4,excf+EX_R11(r13); /* get back r11 */ \ | 164 | ld r4,excf+EX_R11(r13); /* get back r11 */ \ |
| 167 | mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \ | 165 | mfspr r5,scratch; /* get back r13 */ \ |
| 168 | std r12,GPR12(r1); /* save r12 in stackframe */ \ | 166 | std r12,GPR12(r1); /* save r12 in stackframe */ \ |
| 169 | ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ | 167 | ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ |
| 170 | mflr r6; /* save LR in stackframe */ \ | 168 | mflr r6; /* save LR in stackframe */ \ |
| @@ -190,6 +188,15 @@ exc_##n##_common: \ | |||
| 190 | std r3,_TRAP(r1); /* set trap number */ \ | 188 | std r3,_TRAP(r1); /* set trap number */ \ |
| 191 | std r0,RESULT(r1); /* clear regs->result */ | 189 | std r0,RESULT(r1); /* clear regs->result */ |
| 192 | 190 | ||
| 191 | #define EXCEPTION_COMMON(n) \ | ||
| 192 | EXCEPTION_COMMON_LVL(n, SPRN_SPRG_GEN_SCRATCH, PACA_EXGEN) | ||
| 193 | #define EXCEPTION_COMMON_CRIT(n) \ | ||
| 194 | EXCEPTION_COMMON_LVL(n, SPRN_SPRG_CRIT_SCRATCH, PACA_EXCRIT) | ||
| 195 | #define EXCEPTION_COMMON_MC(n) \ | ||
| 196 | EXCEPTION_COMMON_LVL(n, SPRN_SPRG_MC_SCRATCH, PACA_EXMC) | ||
| 197 | #define EXCEPTION_COMMON_DBG(n) \ | ||
| 198 | EXCEPTION_COMMON_LVL(n, SPRN_SPRG_DBG_SCRATCH, PACA_EXDBG) | ||
| 199 | |||
| 193 | /* | 200 | /* |
| 194 | * This is meant for exceptions that don't immediately hard-enable. We | 201 | * This is meant for exceptions that don't immediately hard-enable. We |
| 195 | * set a bit in paca->irq_happened to ensure that a subsequent call to | 202 | * set a bit in paca->irq_happened to ensure that a subsequent call to |
| @@ -259,7 +266,7 @@ exc_##n##_bad_stack: \ | |||
| 259 | #define MASKABLE_EXCEPTION(trapnum, intnum, label, hdlr, ack) \ | 266 | #define MASKABLE_EXCEPTION(trapnum, intnum, label, hdlr, ack) \ |
| 260 | START_EXCEPTION(label); \ | 267 | START_EXCEPTION(label); \ |
| 261 | NORMAL_EXCEPTION_PROLOG(trapnum, intnum, PROLOG_ADDITION_MASKABLE)\ | 268 | NORMAL_EXCEPTION_PROLOG(trapnum, intnum, PROLOG_ADDITION_MASKABLE)\ |
| 262 | EXCEPTION_COMMON(trapnum, PACA_EXGEN) \ | 269 | EXCEPTION_COMMON(trapnum) \ |
| 263 | INTS_DISABLE; \ | 270 | INTS_DISABLE; \ |
| 264 | ack(r8); \ | 271 | ack(r8); \ |
| 265 | CHECK_NAPPING(); \ | 272 | CHECK_NAPPING(); \ |
| @@ -315,7 +322,7 @@ interrupt_end_book3e: | |||
| 315 | START_EXCEPTION(critical_input); | 322 | START_EXCEPTION(critical_input); |
| 316 | CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL, | 323 | CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL, |
| 317 | PROLOG_ADDITION_NONE) | 324 | PROLOG_ADDITION_NONE) |
| 318 | // EXCEPTION_COMMON(0x100, PACA_EXCRIT) | 325 | // EXCEPTION_COMMON_CRIT(0x100) |
| 319 | // INTS_DISABLE | 326 | // INTS_DISABLE |
| 320 | // bl special_reg_save_crit | 327 | // bl special_reg_save_crit |
| 321 | // CHECK_NAPPING(); | 328 | // CHECK_NAPPING(); |
| @@ -328,7 +335,7 @@ interrupt_end_book3e: | |||
| 328 | START_EXCEPTION(machine_check); | 335 | START_EXCEPTION(machine_check); |
| 329 | MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK, | 336 | MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK, |
| 330 | PROLOG_ADDITION_NONE) | 337 | PROLOG_ADDITION_NONE) |
| 331 | // EXCEPTION_COMMON(0x000, PACA_EXMC) | 338 | // EXCEPTION_COMMON_MC(0x000) |
| 332 | // INTS_DISABLE | 339 | // INTS_DISABLE |
| 333 | // bl special_reg_save_mc | 340 | // bl special_reg_save_mc |
| 334 | // addi r3,r1,STACK_FRAME_OVERHEAD | 341 | // addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -343,7 +350,7 @@ interrupt_end_book3e: | |||
| 343 | PROLOG_ADDITION_2REGS) | 350 | PROLOG_ADDITION_2REGS) |
| 344 | mfspr r14,SPRN_DEAR | 351 | mfspr r14,SPRN_DEAR |
| 345 | mfspr r15,SPRN_ESR | 352 | mfspr r15,SPRN_ESR |
| 346 | EXCEPTION_COMMON(0x300, PACA_EXGEN) | 353 | EXCEPTION_COMMON(0x300) |
| 347 | INTS_DISABLE | 354 | INTS_DISABLE |
| 348 | b storage_fault_common | 355 | b storage_fault_common |
| 349 | 356 | ||
| @@ -353,7 +360,7 @@ interrupt_end_book3e: | |||
| 353 | PROLOG_ADDITION_2REGS) | 360 | PROLOG_ADDITION_2REGS) |
| 354 | li r15,0 | 361 | li r15,0 |
| 355 | mr r14,r10 | 362 | mr r14,r10 |
| 356 | EXCEPTION_COMMON(0x400, PACA_EXGEN) | 363 | EXCEPTION_COMMON(0x400) |
| 357 | INTS_DISABLE | 364 | INTS_DISABLE |
| 358 | b storage_fault_common | 365 | b storage_fault_common |
| 359 | 366 | ||
| @@ -367,7 +374,7 @@ interrupt_end_book3e: | |||
| 367 | PROLOG_ADDITION_2REGS) | 374 | PROLOG_ADDITION_2REGS) |
| 368 | mfspr r14,SPRN_DEAR | 375 | mfspr r14,SPRN_DEAR |
| 369 | mfspr r15,SPRN_ESR | 376 | mfspr r15,SPRN_ESR |
| 370 | EXCEPTION_COMMON(0x600, PACA_EXGEN) | 377 | EXCEPTION_COMMON(0x600) |
| 371 | b alignment_more /* no room, go out of line */ | 378 | b alignment_more /* no room, go out of line */ |
| 372 | 379 | ||
| 373 | /* Program Interrupt */ | 380 | /* Program Interrupt */ |
| @@ -375,7 +382,7 @@ interrupt_end_book3e: | |||
| 375 | NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM, | 382 | NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM, |
| 376 | PROLOG_ADDITION_1REG) | 383 | PROLOG_ADDITION_1REG) |
| 377 | mfspr r14,SPRN_ESR | 384 | mfspr r14,SPRN_ESR |
| 378 | EXCEPTION_COMMON(0x700, PACA_EXGEN) | 385 | EXCEPTION_COMMON(0x700) |
| 379 | INTS_DISABLE | 386 | INTS_DISABLE |
| 380 | std r14,_DSISR(r1) | 387 | std r14,_DSISR(r1) |
| 381 | addi r3,r1,STACK_FRAME_OVERHEAD | 388 | addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -389,7 +396,7 @@ interrupt_end_book3e: | |||
| 389 | NORMAL_EXCEPTION_PROLOG(0x800, BOOKE_INTERRUPT_FP_UNAVAIL, | 396 | NORMAL_EXCEPTION_PROLOG(0x800, BOOKE_INTERRUPT_FP_UNAVAIL, |
| 390 | PROLOG_ADDITION_NONE) | 397 | PROLOG_ADDITION_NONE) |
| 391 | /* we can probably do a shorter exception entry for that one... */ | 398 | /* we can probably do a shorter exception entry for that one... */ |
| 392 | EXCEPTION_COMMON(0x800, PACA_EXGEN) | 399 | EXCEPTION_COMMON(0x800) |
| 393 | ld r12,_MSR(r1) | 400 | ld r12,_MSR(r1) |
| 394 | andi. r0,r12,MSR_PR; | 401 | andi. r0,r12,MSR_PR; |
| 395 | beq- 1f | 402 | beq- 1f |
| @@ -406,7 +413,7 @@ interrupt_end_book3e: | |||
| 406 | NORMAL_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL, | 413 | NORMAL_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL, |
| 407 | PROLOG_ADDITION_NONE) | 414 | PROLOG_ADDITION_NONE) |
| 408 | /* we can probably do a shorter exception entry for that one... */ | 415 | /* we can probably do a shorter exception entry for that one... */ |
| 409 | EXCEPTION_COMMON(0x200, PACA_EXGEN) | 416 | EXCEPTION_COMMON(0x200) |
| 410 | #ifdef CONFIG_ALTIVEC | 417 | #ifdef CONFIG_ALTIVEC |
| 411 | BEGIN_FTR_SECTION | 418 | BEGIN_FTR_SECTION |
| 412 | ld r12,_MSR(r1) | 419 | ld r12,_MSR(r1) |
| @@ -428,7 +435,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 428 | NORMAL_EXCEPTION_PROLOG(0x220, | 435 | NORMAL_EXCEPTION_PROLOG(0x220, |
| 429 | BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST, | 436 | BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST, |
| 430 | PROLOG_ADDITION_NONE) | 437 | PROLOG_ADDITION_NONE) |
| 431 | EXCEPTION_COMMON(0x220, PACA_EXGEN) | 438 | EXCEPTION_COMMON(0x220) |
| 432 | INTS_DISABLE | 439 | INTS_DISABLE |
| 433 | bl .save_nvgprs | 440 | bl .save_nvgprs |
| 434 | addi r3,r1,STACK_FRAME_OVERHEAD | 441 | addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -454,7 +461,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 454 | START_EXCEPTION(watchdog); | 461 | START_EXCEPTION(watchdog); |
| 455 | CRIT_EXCEPTION_PROLOG(0x9f0, BOOKE_INTERRUPT_WATCHDOG, | 462 | CRIT_EXCEPTION_PROLOG(0x9f0, BOOKE_INTERRUPT_WATCHDOG, |
| 456 | PROLOG_ADDITION_NONE) | 463 | PROLOG_ADDITION_NONE) |
| 457 | // EXCEPTION_COMMON(0x9f0, PACA_EXCRIT) | 464 | // EXCEPTION_COMMON_CRIT(0x9f0) |
| 458 | // INTS_DISABLE | 465 | // INTS_DISABLE |
| 459 | // bl special_reg_save_crit | 466 | // bl special_reg_save_crit |
| 460 | // CHECK_NAPPING(); | 467 | // CHECK_NAPPING(); |
| @@ -475,7 +482,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 475 | START_EXCEPTION(ap_unavailable); | 482 | START_EXCEPTION(ap_unavailable); |
| 476 | NORMAL_EXCEPTION_PROLOG(0xf20, BOOKE_INTERRUPT_AP_UNAVAIL, | 483 | NORMAL_EXCEPTION_PROLOG(0xf20, BOOKE_INTERRUPT_AP_UNAVAIL, |
| 477 | PROLOG_ADDITION_NONE) | 484 | PROLOG_ADDITION_NONE) |
| 478 | EXCEPTION_COMMON(0xf20, PACA_EXGEN) | 485 | EXCEPTION_COMMON(0xf20) |
| 479 | INTS_DISABLE | 486 | INTS_DISABLE |
| 480 | bl .save_nvgprs | 487 | bl .save_nvgprs |
| 481 | addi r3,r1,STACK_FRAME_OVERHEAD | 488 | addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -532,10 +539,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 532 | /* Now we mash up things to make it look like we are coming on a | 539 | /* Now we mash up things to make it look like we are coming on a |
| 533 | * normal exception | 540 | * normal exception |
| 534 | */ | 541 | */ |
| 535 | mfspr r15,SPRN_SPRG_CRIT_SCRATCH | ||
| 536 | mtspr SPRN_SPRG_GEN_SCRATCH,r15 | ||
| 537 | mfspr r14,SPRN_DBSR | 542 | mfspr r14,SPRN_DBSR |
| 538 | EXCEPTION_COMMON(0xd00, PACA_EXCRIT) | 543 | EXCEPTION_COMMON_CRIT(0xd00) |
| 539 | INTS_DISABLE | 544 | INTS_DISABLE |
| 540 | std r14,_DSISR(r1) | 545 | std r14,_DSISR(r1) |
| 541 | addi r3,r1,STACK_FRAME_OVERHEAD | 546 | addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -599,10 +604,8 @@ kernel_dbg_exc: | |||
| 599 | /* Now we mash up things to make it look like we are coming on a | 604 | /* Now we mash up things to make it look like we are coming on a |
| 600 | * normal exception | 605 | * normal exception |
| 601 | */ | 606 | */ |
| 602 | mfspr r15,SPRN_SPRG_DBG_SCRATCH | ||
| 603 | mtspr SPRN_SPRG_GEN_SCRATCH,r15 | ||
| 604 | mfspr r14,SPRN_DBSR | 607 | mfspr r14,SPRN_DBSR |
| 605 | EXCEPTION_COMMON(0xd08, PACA_EXDBG) | 608 | EXCEPTION_COMMON_DBG(0xd08) |
| 606 | INTS_DISABLE | 609 | INTS_DISABLE |
| 607 | std r14,_DSISR(r1) | 610 | std r14,_DSISR(r1) |
| 608 | addi r3,r1,STACK_FRAME_OVERHEAD | 611 | addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -616,7 +619,7 @@ kernel_dbg_exc: | |||
| 616 | START_EXCEPTION(perfmon); | 619 | START_EXCEPTION(perfmon); |
| 617 | NORMAL_EXCEPTION_PROLOG(0x260, BOOKE_INTERRUPT_PERFORMANCE_MONITOR, | 620 | NORMAL_EXCEPTION_PROLOG(0x260, BOOKE_INTERRUPT_PERFORMANCE_MONITOR, |
| 618 | PROLOG_ADDITION_NONE) | 621 | PROLOG_ADDITION_NONE) |
| 619 | EXCEPTION_COMMON(0x260, PACA_EXGEN) | 622 | EXCEPTION_COMMON(0x260) |
| 620 | INTS_DISABLE | 623 | INTS_DISABLE |
| 621 | CHECK_NAPPING() | 624 | CHECK_NAPPING() |
| 622 | addi r3,r1,STACK_FRAME_OVERHEAD | 625 | addi r3,r1,STACK_FRAME_OVERHEAD |
| @@ -631,7 +634,7 @@ kernel_dbg_exc: | |||
| 631 | START_EXCEPTION(doorbell_crit); | 634 | START_EXCEPTION(doorbell_crit); |
| 632 | CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL, | 635 | CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL, |
| 633 | PROLOG_ADDITION_NONE) | 636 | PROLOG_ADDITION_NONE) |
| 634 | // EXCEPTION_COMMON(0x2a0, PACA_EXCRIT) | 637 | // EXCEPTION_COMMON_CRIT(0x2a0) |
| 635 | // INTS_DISABLE | 638 | // INTS_DISABLE |
| 636 | // bl special_reg_save_crit | 639 | // bl special_reg_save_crit |
| 637 | // CHECK_NAPPING(); | 640 | // CHECK_NAPPING(); |
| @@ -647,7 +650,7 @@ kernel_dbg_exc: | |||
| 647 | START_EXCEPTION(guest_doorbell); | 650 | START_EXCEPTION(guest_doorbell); |
| 648 | GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL, | 651 | GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL, |
| 649 | PROLOG_ADDITION_NONE) | 652 | PROLOG_ADDITION_NONE) |
| 650 | EXCEPTION_COMMON(0x2c0, PACA_EXGEN) | 653 | EXCEPTION_COMMON(0x2c0) |
| 651 | addi r3,r1,STACK_FRAME_OVERHEAD | 654 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 652 | bl .save_nvgprs | 655 | bl .save_nvgprs |
| 653 | INTS_RESTORE_HARD | 656 | INTS_RESTORE_HARD |
| @@ -658,7 +661,7 @@ kernel_dbg_exc: | |||
| 658 | START_EXCEPTION(guest_doorbell_crit); | 661 | START_EXCEPTION(guest_doorbell_crit); |
| 659 | CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT, | 662 | CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT, |
| 660 | PROLOG_ADDITION_NONE) | 663 | PROLOG_ADDITION_NONE) |
| 661 | // EXCEPTION_COMMON(0x2e0, PACA_EXCRIT) | 664 | // EXCEPTION_COMMON_CRIT(0x2e0) |
| 662 | // INTS_DISABLE | 665 | // INTS_DISABLE |
| 663 | // bl special_reg_save_crit | 666 | // bl special_reg_save_crit |
| 664 | // CHECK_NAPPING(); | 667 | // CHECK_NAPPING(); |
| @@ -671,7 +674,7 @@ kernel_dbg_exc: | |||
| 671 | START_EXCEPTION(hypercall); | 674 | START_EXCEPTION(hypercall); |
| 672 | NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL, | 675 | NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL, |
| 673 | PROLOG_ADDITION_NONE) | 676 | PROLOG_ADDITION_NONE) |
| 674 | EXCEPTION_COMMON(0x310, PACA_EXGEN) | 677 | EXCEPTION_COMMON(0x310) |
| 675 | addi r3,r1,STACK_FRAME_OVERHEAD | 678 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 676 | bl .save_nvgprs | 679 | bl .save_nvgprs |
| 677 | INTS_RESTORE_HARD | 680 | INTS_RESTORE_HARD |
| @@ -682,7 +685,7 @@ kernel_dbg_exc: | |||
| 682 | START_EXCEPTION(ehpriv); | 685 | START_EXCEPTION(ehpriv); |
| 683 | NORMAL_EXCEPTION_PROLOG(0x320, BOOKE_INTERRUPT_HV_PRIV, | 686 | NORMAL_EXCEPTION_PROLOG(0x320, BOOKE_INTERRUPT_HV_PRIV, |
| 684 | PROLOG_ADDITION_NONE) | 687 | PROLOG_ADDITION_NONE) |
| 685 | EXCEPTION_COMMON(0x320, PACA_EXGEN) | 688 | EXCEPTION_COMMON(0x320) |
| 686 | addi r3,r1,STACK_FRAME_OVERHEAD | 689 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 687 | bl .save_nvgprs | 690 | bl .save_nvgprs |
| 688 | INTS_RESTORE_HARD | 691 | INTS_RESTORE_HARD |
| @@ -693,7 +696,7 @@ kernel_dbg_exc: | |||
| 693 | START_EXCEPTION(lrat_error); | 696 | START_EXCEPTION(lrat_error); |
| 694 | NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR, | 697 | NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR, |
| 695 | PROLOG_ADDITION_NONE) | 698 | PROLOG_ADDITION_NONE) |
| 696 | EXCEPTION_COMMON(0x340, PACA_EXGEN) | 699 | EXCEPTION_COMMON(0x340) |
| 697 | addi r3,r1,STACK_FRAME_OVERHEAD | 700 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 698 | bl .save_nvgprs | 701 | bl .save_nvgprs |
| 699 | INTS_RESTORE_HARD | 702 | INTS_RESTORE_HARD |
