This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
PATCH: Use "unsigned long long int" in x86-64 __makecontext
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Fri, 16 Mar 2012 10:56:25 -0700
- Subject: PATCH: Use "unsigned long long int" in x86-64 __makecontext
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
All registers are 64bit for x32. This patches replace "unsigned long
int" with "unsigned long long int" in x86-64 __makecontext.
idx_uc_link is only used for array index. I changed it to unsigned int.
It is computed from argc, which is int. OK to install?
Thanks.
H.J.
---
2012-03-16 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/unix/sysv/linux/x86_64/makecontext.c (__makecontext):
Use "unsigned long long int" instead of "unsigned long int". Use
unsigned int on idx_uc_link.
diff --git a/sysdeps/unix/sysv/linux/x86_64/makecontext.c b/sysdeps/unix/sysv/linux/x86_64/makecontext.c
index 860925f..62fa422 100644
--- a/sysdeps/unix/sysv/linux/x86_64/makecontext.c
+++ b/sysdeps/unix/sysv/linux/x86_64/makecontext.c
@@ -52,25 +52,26 @@ void
__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
{
extern void __start_context (void);
- unsigned long int *sp, idx_uc_link;
+ unsigned long long int *sp;
+ unsigned int idx_uc_link;
va_list ap;
int i;
/* Generate room on stack for parameter if needed and uc_link. */
- sp = (unsigned long int *) ((uintptr_t) ucp->uc_stack.ss_sp
- + ucp->uc_stack.ss_size);
+ sp = (unsigned long long int *) ((uintptr_t) ucp->uc_stack.ss_sp
+ + ucp->uc_stack.ss_size);
sp -= (argc > 6 ? argc - 6 : 0) + 1;
/* Align stack and make space for trampoline address. */
- sp = (unsigned long int *) ((((uintptr_t) sp) & -16L) - 8);
+ sp = (unsigned long long int *) ((((uintptr_t) sp) & -16L) - 8);
idx_uc_link = (argc > 6 ? argc - 6 : 0) + 1;
/* Setup context ucp. */
/* Address to jump to. */
- ucp->uc_mcontext.gregs[REG_RIP] = (long int) func;
+ ucp->uc_mcontext.gregs[REG_RIP] = (unsigned long int) func;
/* Setup rbx.*/
- ucp->uc_mcontext.gregs[REG_RBX] = (long int) &sp[idx_uc_link];
- ucp->uc_mcontext.gregs[REG_RSP] = (long int) sp;
+ ucp->uc_mcontext.gregs[REG_RBX] = (unsigned long int) &sp[idx_uc_link];
+ ucp->uc_mcontext.gregs[REG_RSP] = (unsigned long int) sp;
/* Setup stack. */
sp[0] = (unsigned long int) &__start_context;
@@ -90,26 +91,26 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
switch (i)
{
case 0:
- ucp->uc_mcontext.gregs[REG_RDI] = va_arg (ap, long int);
+ ucp->uc_mcontext.gregs[REG_RDI] = va_arg (ap, long long int);
break;
case 1:
- ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, long int);
+ ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, long long int);
break;
case 2:
- ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, long int);
+ ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, long long int);
break;
case 3:
- ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, long int);
+ ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, long long int);
break;
case 4:
- ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, long int);
+ ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, long long int);
break;
case 5:
- ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, long int);
+ ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, long long int);
break;
default:
/* Put value on stack. */
- sp[i - 5] = va_arg (ap, unsigned long int);
+ sp[i - 5] = va_arg (ap, unsigned long long int);
break;
}
va_end (ap);
--
1.7.6.5