set_thread_area.2: csky architecture undocumented
Hi Michael,
SYNOPSIS
#include <linux/unistd.h>
#if defined __i386__ || defined __x86_64__
# include <asm/ldt.h>
int get_thread_area(struct user_desc *u_info);
int set_thread_area(struct user_desc *u_info);
#elif defined __m68k__
int get_thread_area(void);
int set_thread_area(unsigned long tp);
#elif defined __mips__
int set_thread_area(unsigned long addr);
#endif
Note: There are no glibc wrappers for these system calls; see
NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)
See kernel commit 4859bfca11c7d63d55175bcd85a75d6cee4b7184
I'd change
- #elif defined __mips__
+ #elif defined(__mips__ || __csky__)
and then change the rest of the text to add csky when appropriate. Am I correct?
Thanks,
Alex
Hello Alex,
Quoted 49 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)
Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
As far as I can tell, you are correct.
Thanks,
Michael
Signature · 3 lines
Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/
Hi Alex,
Quoted 48 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)
Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
AFAICT, you are correct. I think the reason that csky is missing is that the architecture was added after this manual pages was added.
Thanks,
Michael
Signature · 3 lines
Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/
Guo Ren
maintainerThx Michael & Alejandro,
Yes, the man page has no csky's.
C-SKY have abiv1 and abiv2
For abiv1: There is no register for tls saving, We use trap 3 to got tls and use set_thread_area to init ti->tp_value.
For abiv2: The r31 is the tls register. We could directly read r31 to got r31 and use set_thread_area to init reg->tls value.
In glibc:
# ifdef __CSKYABIV2__
/* Define r31 as thread pointer register. */
# define READ_THREAD_POINTER() \
mov r0, r31;
# else
# define READ_THREAD_POINTER() \
trap 3;
# endif/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp) \
({ INTERNAL_SYSCALL_DECL (err); \
long result_var; \
result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \
(char *) (tcbp) + TLS_TCB_OFFSET); \
INTERNAL_SYSCALL_ERROR_P (result_var, err) \
? "unknown error" : NULL; })In kernel:SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
{
struct thread_info *ti = task_thread_info(current);
struct pt_regs *reg = current_pt_regs();
reg->tls = addr;
ti->tp_value = addr;
return 0;
}Any comments are welcome :)
Quoted 60 lines · Michael Kerrisk (man-pages)
Hi Alex,
Quoted 48 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
AFAICT, you are correct. I think the reason that csky is missing is that the architecture was added after this manual pages was added.
Thanks,
Quoted 7 lines
Michael
--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/
--
Best Regards
Guo Ren
Hi Guo,
Thanks for the details!
I'll try to add csky to the man page, and if I have any doubts I'll ask you. Anyway, I'll CC you in any change I propose.
Cheers,
Alex
Quoted 124 lines · Guo Ren
Thx Michael & Alejandro,
Yes, the man page has no csky's.
C-SKY have abiv1 and abiv2
For abiv1: There is no register for tls saving, We use trap 3 to got tls and useset_thread_areato initti->tp_value.
For abiv2: The r31 is the tls register. We could directly read r31 to got r31 and useset_thread_areato initreg->tlsvalue.In glibc:
# ifdef __CSKYABIV2__ /* Define r31 as thread pointer register. */ # define READ_THREAD_POINTER() \ mov r0, r31; # else # define READ_THREAD_POINTER() \ trap 3; # endif/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */# define TLS_INIT_TP(tcbp) \ ({ INTERNAL_SYSCALL_DECL (err); \ long result_var; \ result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \ (char *) (tcbp) + TLS_TCB_OFFSET); \ INTERNAL_SYSCALL_ERROR_P (result_var, err) \ ? "unknown error" : NULL; })In kernel:
SYSCALL_DEFINE1(set_thread_area, unsigned long, addr){ struct thread_info *ti = task_thread_info(current); struct pt_regs *reg = current_pt_regs(); reg->tls = addr; ti->tp_value = addr; return 0; }Any comments are welcome :)
Quoted 60 lines · Michael Kerrisk (man-pages)
Hi Alex,
Quoted 48 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
AFAICT, you are correct. I think the reason that csky is missing is that the architecture was added after this manual pages was added.
Thanks,
Quoted 7 lines
Michael
--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/--
Best Regards
Guo Ren
Alejandro Colomar
maintainerHi Guo,
On Tue, Nov 24, 2020 at 08:07:07PM +0800, Guo Ren wrote:
Huh, 3 years already! I've had this in my head for all this time; just didn't find the energy to act on it.
Quoted 3 lines
Thx Michael & Alejandro,
Yes, the man page has no csky's.
I've applied a patch to add initial documentation for it:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=a63979eb24aaf73f4be5799cc9579f84a3874b7d>
Quoted 40 lines
C-SKY have abiv1 and abiv2
For abiv1: There is no register for tls saving, We use trap 3 to got tls and useset_thread_areato initti->tp_value.
For abiv2: The r31 is the tls register. We could directly read r31 to got r31 and useset_thread_areato initreg->tlsvalue.In glibc:
# ifdef __CSKYABIV2__ /* Define r31 as thread pointer register. */ # define READ_THREAD_POINTER() \ mov r0, r31; # else # define READ_THREAD_POINTER() \ trap 3; # endif/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */# define TLS_INIT_TP(tcbp) \ ({ INTERNAL_SYSCALL_DECL (err); \ long result_var; \ result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \ (char *) (tcbp) + TLS_TCB_OFFSET); \ INTERNAL_SYSCALL_ERROR_P (result_var, err) \ ? "unknown error" : NULL; })In kernel:
SYSCALL_DEFINE1(set_thread_area, unsigned long, addr){ struct thread_info *ti = task_thread_info(current); struct pt_regs *reg = current_pt_regs(); reg->tls = addr; ti->tp_value = addr; return 0; }
Quoted 1 line
Any comments are welcome :)
I'm sorry, but I have little understanding of this syscall, and that shounds like gibberish to me :)
Feel free to send a patch to improve the documentation for csky.
Cheers,
Alex
Quoted 79 lines
Quoted 60 lines · Michael Kerrisk (man-pages)
Hi Alex,
Quoted 48 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
AFAICT, you are correct. I think the reason that csky is missing is that the architecture was added after this manual pages was added.
Thanks,
Quoted 7 lines
Michael
--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/--
Best Regards
Guo Ren
Signature · 1 line
<https://www.alejandro-colomar.es/>
Guo Ren
maintainerQuoted 54 lines · Alejandro Colomar
Hi Guo,
On Tue, Nov 24, 2020 at 08:07:07PM +0800, Guo Ren wrote:
Huh, 3 years already! I've had this in my head for all this time; just didn't find the energy to act on it.
Quoted 3 lines
Thx Michael & Alejandro,
Yes, the man page has no csky's.
I've applied a patch to add initial documentation for it:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=a63979eb24aaf73f4be5799cc9579f84a3874b7d>Quoted 40 lines
C-SKY have abiv1 and abiv2
For abiv1: There is no register for tls saving, We use trap 3 to got tls and useset_thread_areato initti->tp_value.
For abiv2: The r31 is the tls register. We could directly read r31 to got r31 and useset_thread_areato initreg->tlsvalue.In glibc:
# ifdef __CSKYABIV2__ /* Define r31 as thread pointer register. */ # define READ_THREAD_POINTER() \ mov r0, r31; # else # define READ_THREAD_POINTER() \ trap 3; # endif/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the operation can cause a failure 'errno' must not be touched. */# define TLS_INIT_TP(tcbp) \ ({ INTERNAL_SYSCALL_DECL (err); \ long result_var; \ result_var = INTERNAL_SYSCALL (set_thread_area, err, 1, \ (char *) (tcbp) + TLS_TCB_OFFSET); \ INTERNAL_SYSCALL_ERROR_P (result_var, err) \ ? "unknown error" : NULL; })In kernel:
SYSCALL_DEFINE1(set_thread_area, unsigned long, addr){ struct thread_info *ti = task_thread_info(current); struct pt_regs *reg = current_pt_regs(); reg->tls = addr; ti->tp_value = addr; return 0; }
Quoted 6 lines
Quoted 1 line
Any comments are welcome :)
I'm sorry, but I have little understanding of this syscall, and that shounds like gibberish to me :)
Feel free to send a patch to improve the documentation for csky.
Yeah, I've sent a patch for it; please review:
https://lore.kernel.org/linux-csky/[email protected]/
Quoted 86 lines
Cheers,
AlexQuoted 79 lines
Quoted 60 lines · Michael Kerrisk (man-pages)
Hi Alex,
Quoted 48 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
AFAICT, you are correct. I think the reason that csky is missing is that the architecture was added after this manual pages was added.
Thanks,
Quoted 7 lines
Michael
--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/--
Best Regards
Guo RenSignature · 1 line
<https://www.alejandro-colomar.es/>
HI Michael,
Quoted 51 lines · Michael Kerrisk (man-pages)
Hi Alex,
Quoted 48 lines · Alejandro Colomar (man-pages)
Hi Michael,
SYNOPSIS
#include <linux/unistd.h> #if defined __i386__ || defined __x86_64__ # include <asm/ldt.h> int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info); #elif defined __m68k__ int get_thread_area(void); int set_thread_area(unsigned long tp); #elif defined __mips__ int set_thread_area(unsigned long addr); #endif Note: There are no glibc wrappers for these system calls; see NOTES.$ grep -rn 'SYSCALL_DEFINE.*et_thread_area' arch/csky/kernel/syscall.c:6: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/mips/kernel/syscall.c:86: SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) arch/x86/kernel/tls.c:191: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) arch/x86/kernel/tls.c:243: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) arch/x86/um/tls_32.c:277: SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) arch/x86/um/tls_32.c:325: SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)See kernel commit
4859bfca11c7d63d55175bcd85a75d6cee4b7184I'd change
(quoted diff) +1
-1- #elif defined __mips__ + #elif defined(__mips__ || __csky__)
Quoted 5 lines
Quoted 2 lines
and then change the rest of the text to add csky when appropriate. Am I correct?
AFAICT, you are correct. I think the reason that csky is missing is that the architecture was added after this manual pages was added.
Yep, I guessed it was that :)
Thanks,
Alex
Quoted 6 lines
Thanks,
Michael