|
34 | 34 | REGISTERS_MIPS_O32,
|
35 | 35 | REGISTERS_MIPS_NEWABI,
|
36 | 36 | REGISTERS_SPARC,
|
| 37 | + REGISTERS_HEXAGON, |
37 | 38 | REGISTERS_RISCV,
|
38 | 39 | };
|
39 | 40 |
|
@@ -3528,6 +3529,187 @@ inline const char *Registers_sparc::getRegisterName(int regNum) {
|
3528 | 3529 | }
|
3529 | 3530 | #endif // _LIBUNWIND_TARGET_SPARC
|
3530 | 3531 |
|
| 3532 | +#if defined(_LIBUNWIND_TARGET_HEXAGON) |
| 3533 | +/// Registers_hexagon holds the register state of a thread in a Hexagon QDSP6 |
| 3534 | +/// process. |
| 3535 | +class _LIBUNWIND_HIDDEN Registers_hexagon { |
| 3536 | +public: |
| 3537 | + Registers_hexagon(); |
| 3538 | + Registers_hexagon(const void *registers); |
| 3539 | + |
| 3540 | + bool validRegister(int num) const; |
| 3541 | + uint32_t getRegister(int num) const; |
| 3542 | + void setRegister(int num, uint32_t value); |
| 3543 | + bool validFloatRegister(int num) const; |
| 3544 | + double getFloatRegister(int num) const; |
| 3545 | + void setFloatRegister(int num, double value); |
| 3546 | + bool validVectorRegister(int num) const; |
| 3547 | + v128 getVectorRegister(int num) const; |
| 3548 | + void setVectorRegister(int num, v128 value); |
| 3549 | + const char *getRegisterName(int num); |
| 3550 | + void jumpto(); |
| 3551 | + static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON; } |
| 3552 | + static int getArch() { return REGISTERS_HEXAGON; } |
| 3553 | + |
| 3554 | + uint32_t getSP() const { return _registers.__r[UNW_HEXAGON_R29]; } |
| 3555 | + void setSP(uint32_t value) { _registers.__r[UNW_HEXAGON_R29] = value; } |
| 3556 | + uint32_t getIP() const { return _registers.__r[UNW_HEXAGON_PC]; } |
| 3557 | + void setIP(uint32_t value) { _registers.__r[UNW_HEXAGON_PC] = value; } |
| 3558 | + |
| 3559 | +private: |
| 3560 | + struct hexagon_thread_state_t { |
| 3561 | + unsigned int __r[35]; |
| 3562 | + }; |
| 3563 | + |
| 3564 | + hexagon_thread_state_t _registers; |
| 3565 | +}; |
| 3566 | + |
| 3567 | +inline Registers_hexagon::Registers_hexagon(const void *registers) { |
| 3568 | + static_assert((check_fit<Registers_hexagon, unw_context_t>::does_fit), |
| 3569 | + "hexagon registers do not fit into unw_context_t"); |
| 3570 | + memcpy(&_registers, static_cast<const uint8_t *>(registers), |
| 3571 | + sizeof(_registers)); |
| 3572 | +} |
| 3573 | + |
| 3574 | +inline Registers_hexagon::Registers_hexagon() { |
| 3575 | + memset(&_registers, 0, sizeof(_registers)); |
| 3576 | +} |
| 3577 | + |
| 3578 | +inline bool Registers_hexagon::validRegister(int regNum) const { |
| 3579 | + if (regNum <= UNW_HEXAGON_R31) |
| 3580 | + return true; |
| 3581 | + return false; |
| 3582 | +} |
| 3583 | + |
| 3584 | +inline uint32_t Registers_hexagon::getRegister(int regNum) const { |
| 3585 | + if (regNum >= UNW_HEXAGON_R0 && regNum <= UNW_HEXAGON_R31) |
| 3586 | + return _registers.__r[regNum - UNW_HEXAGON_R0]; |
| 3587 | + |
| 3588 | + switch (regNum) { |
| 3589 | + case UNW_REG_IP: |
| 3590 | + return _registers.__r[UNW_HEXAGON_PC]; |
| 3591 | + case UNW_REG_SP: |
| 3592 | + return _registers.__r[UNW_HEXAGON_R29]; |
| 3593 | + } |
| 3594 | + _LIBUNWIND_ABORT("unsupported hexagon register"); |
| 3595 | +} |
| 3596 | + |
| 3597 | +inline void Registers_hexagon::setRegister(int regNum, uint32_t value) { |
| 3598 | + if (regNum >= UNW_HEXAGON_R0 && regNum <= UNW_HEXAGON_R31) { |
| 3599 | + _registers.__r[regNum - UNW_HEXAGON_R0] = value; |
| 3600 | + return; |
| 3601 | + } |
| 3602 | + |
| 3603 | + switch (regNum) { |
| 3604 | + case UNW_REG_IP: |
| 3605 | + _registers.__r[UNW_HEXAGON_PC] = value; |
| 3606 | + return; |
| 3607 | + case UNW_REG_SP: |
| 3608 | + _registers.__r[UNW_HEXAGON_R29] = value; |
| 3609 | + return; |
| 3610 | + } |
| 3611 | + _LIBUNWIND_ABORT("unsupported hexagon register"); |
| 3612 | +} |
| 3613 | + |
| 3614 | +inline bool Registers_hexagon::validFloatRegister(int /* regNum */) const { |
| 3615 | + return false; |
| 3616 | +} |
| 3617 | + |
| 3618 | +inline double Registers_hexagon::getFloatRegister(int /* regNum */) const { |
| 3619 | + _LIBUNWIND_ABORT("hexagon float support not implemented"); |
| 3620 | +} |
| 3621 | + |
| 3622 | +inline void Registers_hexagon::setFloatRegister(int /* regNum */, |
| 3623 | + double /* value */) { |
| 3624 | + _LIBUNWIND_ABORT("hexagon float support not implemented"); |
| 3625 | +} |
| 3626 | + |
| 3627 | +inline bool Registers_hexagon::validVectorRegister(int /* regNum */) const { |
| 3628 | + return false; |
| 3629 | +} |
| 3630 | + |
| 3631 | +inline v128 Registers_hexagon::getVectorRegister(int /* regNum */) const { |
| 3632 | + _LIBUNWIND_ABORT("hexagon vector support not implemented"); |
| 3633 | +} |
| 3634 | + |
| 3635 | +inline void Registers_hexagon::setVectorRegister(int /* regNum */, v128 /* value */) { |
| 3636 | + _LIBUNWIND_ABORT("hexagon vector support not implemented"); |
| 3637 | +} |
| 3638 | + |
| 3639 | +inline const char *Registers_hexagon::getRegisterName(int regNum) { |
| 3640 | + switch (regNum) { |
| 3641 | + case UNW_HEXAGON_R0: |
| 3642 | + return "r0"; |
| 3643 | + case UNW_HEXAGON_R1: |
| 3644 | + return "r1"; |
| 3645 | + case UNW_HEXAGON_R2: |
| 3646 | + return "r2"; |
| 3647 | + case UNW_HEXAGON_R3: |
| 3648 | + return "r3"; |
| 3649 | + case UNW_HEXAGON_R4: |
| 3650 | + return "r4"; |
| 3651 | + case UNW_HEXAGON_R5: |
| 3652 | + return "r5"; |
| 3653 | + case UNW_HEXAGON_R6: |
| 3654 | + return "r6"; |
| 3655 | + case UNW_HEXAGON_R7: |
| 3656 | + return "r7"; |
| 3657 | + case UNW_HEXAGON_R8: |
| 3658 | + return "r8"; |
| 3659 | + case UNW_HEXAGON_R9: |
| 3660 | + return "r9"; |
| 3661 | + case UNW_HEXAGON_R10: |
| 3662 | + return "r10"; |
| 3663 | + case UNW_HEXAGON_R11: |
| 3664 | + return "r11"; |
| 3665 | + case UNW_HEXAGON_R12: |
| 3666 | + return "r12"; |
| 3667 | + case UNW_HEXAGON_R13: |
| 3668 | + return "r13"; |
| 3669 | + case UNW_HEXAGON_R14: |
| 3670 | + return "r14"; |
| 3671 | + case UNW_HEXAGON_R15: |
| 3672 | + return "r15"; |
| 3673 | + case UNW_HEXAGON_R16: |
| 3674 | + return "r16"; |
| 3675 | + case UNW_HEXAGON_R17: |
| 3676 | + return "r17"; |
| 3677 | + case UNW_HEXAGON_R18: |
| 3678 | + return "r18"; |
| 3679 | + case UNW_HEXAGON_R19: |
| 3680 | + return "r19"; |
| 3681 | + case UNW_HEXAGON_R20: |
| 3682 | + return "r20"; |
| 3683 | + case UNW_HEXAGON_R21: |
| 3684 | + return "r21"; |
| 3685 | + case UNW_HEXAGON_R22: |
| 3686 | + return "r22"; |
| 3687 | + case UNW_HEXAGON_R23: |
| 3688 | + return "r23"; |
| 3689 | + case UNW_HEXAGON_R24: |
| 3690 | + return "r24"; |
| 3691 | + case UNW_HEXAGON_R25: |
| 3692 | + return "r25"; |
| 3693 | + case UNW_HEXAGON_R26: |
| 3694 | + return "r26"; |
| 3695 | + case UNW_HEXAGON_R27: |
| 3696 | + return "r27"; |
| 3697 | + case UNW_HEXAGON_R28: |
| 3698 | + return "r28"; |
| 3699 | + case UNW_HEXAGON_R29: |
| 3700 | + return "r29"; |
| 3701 | + case UNW_HEXAGON_R30: |
| 3702 | + return "r30"; |
| 3703 | + case UNW_HEXAGON_R31: |
| 3704 | + return "r31"; |
| 3705 | + default: |
| 3706 | + return "unknown register"; |
| 3707 | + } |
| 3708 | + |
| 3709 | +} |
| 3710 | +#endif // _LIBUNWIND_TARGET_HEXAGON |
| 3711 | + |
| 3712 | + |
3531 | 3713 | #if defined(_LIBUNWIND_TARGET_RISCV)
|
3532 | 3714 | /// Registers_riscv holds the register state of a thread in a 64-bit RISC-V
|
3533 | 3715 | /// process.
|
|
0 commit comments