metag: ptrace: Implement NT_METAG_TLS
authorPaul Clothier <Paul.Clothier@imgtec.com>
Tue, 19 Mar 2013 12:04:43 +0000 (12:04 +0000)
committerJames Hogan <james.hogan@imgtec.com>
Wed, 27 Mar 2013 14:37:47 +0000 (14:37 +0000)
Implement functionality to get the TLS pointer for the metag
architecture using regsets.

This provides multi-threaded debug support for GDB.

Signed-off-by: Paul Clothier <Paul.Clothier@imgtec.com>
Signed-off-by: James Hogan <james.hogan@imgtec.com>
arch/metag/kernel/ptrace.c
include/uapi/linux/elf.h

index 47a8828615a5acdcdbcdf7e6f5d16d8bfa249dd7..7563628822bdf638a708816bf4abe8ccb1b2a4db 100644 (file)
@@ -288,10 +288,36 @@ static int metag_rp_state_set(struct task_struct *target,
        return metag_rp_state_copyin(regs, pos, count, kbuf, ubuf);
 }
 
+static int metag_tls_get(struct task_struct *target,
+                       const struct user_regset *regset,
+                       unsigned int pos, unsigned int count,
+                       void *kbuf, void __user *ubuf)
+{
+       void __user *tls = target->thread.tls_ptr;
+       return user_regset_copyout(&pos, &count, &kbuf, &ubuf, &tls, 0, -1);
+}
+
+static int metag_tls_set(struct task_struct *target,
+                       const struct user_regset *regset,
+                       unsigned int pos, unsigned int count,
+                       const void *kbuf, const void __user *ubuf)
+{
+       int ret;
+       void __user *tls;
+
+       ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &tls, 0, -1);
+       if (ret)
+               return ret;
+
+       target->thread.tls_ptr = tls;
+       return ret;
+}
+
 enum metag_regset {
        REGSET_GENERAL,
        REGSET_CBUF,
        REGSET_READPIPE,
+       REGSET_TLS,
 };
 
 static const struct user_regset metag_regsets[] = {
@@ -319,6 +345,14 @@ static const struct user_regset metag_regsets[] = {
                .get = metag_rp_state_get,
                .set = metag_rp_state_set,
        },
+       [REGSET_TLS] = {
+               .core_note_type = NT_METAG_TLS,
+               .n = 1,
+               .size = sizeof(void *),
+               .align = sizeof(void *),
+               .get = metag_tls_get,
+               .set = metag_tls_set,
+       },
 };
 
 static const struct user_regset_view user_metag_view = {
index 8072d352b98f53b1b0ddc08d2e5dc2aa71e416dc..ef6103bf1f9bb3ade18268a639cc784dcc695b95 100644 (file)
@@ -397,6 +397,7 @@ typedef struct elf64_shdr {
 #define NT_ARM_HW_WATCH        0x403           /* ARM hardware watchpoint registers */
 #define NT_METAG_CBUF  0x500           /* Metag catch buffer registers */
 #define NT_METAG_RPIPE 0x501           /* Metag read pipeline state */
+#define NT_METAG_TLS   0x502           /* Metag TLS pointer */
 
 
 /* Note header in a PT_NOTE section */