diff options
| author | Anshuman Khandual <khandual@linux.vnet.ibm.com> | 2016-07-27 22:57:43 -0400 |
|---|---|---|
| committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-07-31 21:15:23 -0400 |
| commit | cf89d4e1b181bda27a5d52f4afd239ea07e84eb0 (patch) | |
| tree | 0e3bfda868eb78f5c26d9645a57a53d322f1bedc | |
| parent | fa439810cc1b3c927ec24ede17d02467e1b143a1 (diff) | |
powerpc/ptrace: Enable support for EBB registers
This patch enables support for EBB state registers related
ELF core note NT_PPC_EBB based ptrace requests through
PTRACE_GETREGSET, PTRACE_SETREGSET calls. This is achieved
through adding one new register sets REGSET_EBB in powerpc
corresponding to the ELF core note sections added in this
regard. It also implements the get, set and active functions
for this new register sets added.
Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
Signed-off-by: Simon Guo <wei.guo.simon@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
| -rw-r--r-- | arch/powerpc/include/uapi/asm/elf.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/kernel/ptrace.c | 75 |
2 files changed, 76 insertions, 0 deletions
diff --git a/arch/powerpc/include/uapi/asm/elf.h b/arch/powerpc/include/uapi/asm/elf.h index e703c646163b..8c4d71a59259 100644 --- a/arch/powerpc/include/uapi/asm/elf.h +++ b/arch/powerpc/include/uapi/asm/elf.h | |||
| @@ -94,6 +94,7 @@ | |||
| 94 | #define ELF_NVMX 34 /* includes all vector registers */ | 94 | #define ELF_NVMX 34 /* includes all vector registers */ |
| 95 | #define ELF_NVSX 32 /* includes all VSX registers */ | 95 | #define ELF_NVSX 32 /* includes all VSX registers */ |
| 96 | #define ELF_NTMSPRREG 3 /* include tfhar, tfiar, texasr */ | 96 | #define ELF_NTMSPRREG 3 /* include tfhar, tfiar, texasr */ |
| 97 | #define ELF_NEBB 3 /* includes ebbrr, ebbhr, bescr */ | ||
| 97 | 98 | ||
| 98 | typedef unsigned long elf_greg_t64; | 99 | typedef unsigned long elf_greg_t64; |
| 99 | typedef elf_greg_t64 elf_gregset_t64[ELF_NGREG]; | 100 | typedef elf_greg_t64 elf_gregset_t64[ELF_NGREG]; |
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index a1e166ae4b14..7942f9c575ef 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
| @@ -1760,6 +1760,70 @@ static int tar_set(struct task_struct *target, | |||
| 1760 | &target->thread.tar, 0, sizeof(u64)); | 1760 | &target->thread.tar, 0, sizeof(u64)); |
| 1761 | return ret; | 1761 | return ret; |
| 1762 | } | 1762 | } |
| 1763 | |||
| 1764 | static int ebb_active(struct task_struct *target, | ||
| 1765 | const struct user_regset *regset) | ||
| 1766 | { | ||
| 1767 | if (!cpu_has_feature(CPU_FTR_ARCH_207S)) | ||
| 1768 | return -ENODEV; | ||
| 1769 | |||
| 1770 | if (target->thread.used_ebb) | ||
| 1771 | return regset->n; | ||
| 1772 | |||
| 1773 | return 0; | ||
| 1774 | } | ||
| 1775 | |||
| 1776 | static int ebb_get(struct task_struct *target, | ||
| 1777 | const struct user_regset *regset, | ||
| 1778 | unsigned int pos, unsigned int count, | ||
| 1779 | void *kbuf, void __user *ubuf) | ||
| 1780 | { | ||
| 1781 | /* Build tests */ | ||
| 1782 | BUILD_BUG_ON(TSO(ebbrr) + sizeof(unsigned long) != TSO(ebbhr)); | ||
| 1783 | BUILD_BUG_ON(TSO(ebbhr) + sizeof(unsigned long) != TSO(bescr)); | ||
| 1784 | |||
| 1785 | if (!cpu_has_feature(CPU_FTR_ARCH_207S)) | ||
| 1786 | return -ENODEV; | ||
| 1787 | |||
| 1788 | if (!target->thread.used_ebb) | ||
| 1789 | return -ENODATA; | ||
| 1790 | |||
| 1791 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | ||
| 1792 | &target->thread.ebbrr, 0, 3 * sizeof(unsigned long)); | ||
| 1793 | } | ||
| 1794 | |||
| 1795 | static int ebb_set(struct task_struct *target, | ||
| 1796 | const struct user_regset *regset, | ||
| 1797 | unsigned int pos, unsigned int count, | ||
| 1798 | const void *kbuf, const void __user *ubuf) | ||
| 1799 | { | ||
| 1800 | int ret = 0; | ||
| 1801 | |||
| 1802 | /* Build tests */ | ||
| 1803 | BUILD_BUG_ON(TSO(ebbrr) + sizeof(unsigned long) != TSO(ebbhr)); | ||
| 1804 | BUILD_BUG_ON(TSO(ebbhr) + sizeof(unsigned long) != TSO(bescr)); | ||
| 1805 | |||
| 1806 | if (!cpu_has_feature(CPU_FTR_ARCH_207S)) | ||
| 1807 | return -ENODEV; | ||
| 1808 | |||
| 1809 | if (target->thread.used_ebb) | ||
| 1810 | return -ENODATA; | ||
| 1811 | |||
| 1812 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | ||
| 1813 | &target->thread.ebbrr, 0, sizeof(unsigned long)); | ||
| 1814 | |||
| 1815 | if (!ret) | ||
| 1816 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | ||
| 1817 | &target->thread.ebbhr, sizeof(unsigned long), | ||
| 1818 | 2 * sizeof(unsigned long)); | ||
| 1819 | |||
| 1820 | if (!ret) | ||
| 1821 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | ||
| 1822 | &target->thread.bescr, | ||
| 1823 | 2 * sizeof(unsigned long), 3 * sizeof(unsigned long)); | ||
| 1824 | |||
| 1825 | return ret; | ||
| 1826 | } | ||
| 1763 | #endif | 1827 | #endif |
| 1764 | /* | 1828 | /* |
| 1765 | * These are our native regset flavors. | 1829 | * These are our native regset flavors. |
| @@ -1792,6 +1856,7 @@ enum powerpc_regset { | |||
| 1792 | #endif | 1856 | #endif |
| 1793 | #ifdef CONFIG_PPC_BOOK3S_64 | 1857 | #ifdef CONFIG_PPC_BOOK3S_64 |
| 1794 | REGSET_TAR, /* TAR register */ | 1858 | REGSET_TAR, /* TAR register */ |
| 1859 | REGSET_EBB, /* EBB registers */ | ||
| 1795 | #endif | 1860 | #endif |
| 1796 | }; | 1861 | }; |
| 1797 | 1862 | ||
| @@ -1887,6 +1952,11 @@ static const struct user_regset native_regsets[] = { | |||
| 1887 | .size = sizeof(u64), .align = sizeof(u64), | 1952 | .size = sizeof(u64), .align = sizeof(u64), |
| 1888 | .get = tar_get, .set = tar_set | 1953 | .get = tar_get, .set = tar_set |
| 1889 | }, | 1954 | }, |
| 1955 | [REGSET_EBB] = { | ||
| 1956 | .core_note_type = NT_PPC_EBB, .n = ELF_NEBB, | ||
| 1957 | .size = sizeof(u64), .align = sizeof(u64), | ||
| 1958 | .active = ebb_active, .get = ebb_get, .set = ebb_set | ||
| 1959 | }, | ||
| 1890 | #endif | 1960 | #endif |
| 1891 | }; | 1961 | }; |
| 1892 | 1962 | ||
| @@ -2173,6 +2243,11 @@ static const struct user_regset compat_regsets[] = { | |||
| 2173 | .size = sizeof(u64), .align = sizeof(u64), | 2243 | .size = sizeof(u64), .align = sizeof(u64), |
| 2174 | .get = tar_get, .set = tar_set | 2244 | .get = tar_get, .set = tar_set |
| 2175 | }, | 2245 | }, |
| 2246 | [REGSET_EBB] = { | ||
| 2247 | .core_note_type = NT_PPC_EBB, .n = ELF_NEBB, | ||
| 2248 | .size = sizeof(u64), .align = sizeof(u64), | ||
| 2249 | .active = ebb_active, .get = ebb_get, .set = ebb_set | ||
| 2250 | }, | ||
| 2176 | #endif | 2251 | #endif |
| 2177 | }; | 2252 | }; |
| 2178 | 2253 | ||
