Skip to content

Commit

Permalink
Use greg_t and uintptr_t in x86-64 __makecontext
Browse files Browse the repository at this point in the history
  • Loading branch information
H.J. Lu committed Mar 16, 2012
1 parent f1a77b0 commit 6b6cd74
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 16 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2012-03-16 H.J. Lu <hongjiu.lu@intel.com>

* sysdeps/unix/sysv/linux/x86_64/makecontext.c (__makecontext):
Use greg_t on sp. Use unsigned int on idx_uc_link. Cast
adresses to uintptr_t. Replace "long int" and "unsigned long
int" with "greg_t" on va_arg.

2012-03-16 H.J. Lu <hongjiu.lu@intel.com>

* sysdeps/generic/ldconfig.h (FLAG_X8664_LIBX32): New macro.
Expand Down
33 changes: 17 additions & 16 deletions sysdeps/unix/sysv/linux/x86_64/makecontext.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,29 +52,30 @@ void
__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
{
extern void __start_context (void);
unsigned long int *sp, idx_uc_link;
greg_t *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 = (greg_t *) ((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 = (greg_t *) ((((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] = (uintptr_t) 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] = (uintptr_t) &sp[idx_uc_link];
ucp->uc_mcontext.gregs[REG_RSP] = (uintptr_t) sp;

/* Setup stack. */
sp[0] = (unsigned long int) &__start_context;
sp[idx_uc_link] = (unsigned long int) ucp->uc_link;
sp[0] = (uintptr_t) &__start_context;
sp[idx_uc_link] = (uintptr_t) ucp->uc_link;

va_start (ap, argc);
/* Handle arguments.
Expand All @@ -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, greg_t);
break;
case 1:
ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, long int);
ucp->uc_mcontext.gregs[REG_RSI] = va_arg (ap, greg_t);
break;
case 2:
ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, long int);
ucp->uc_mcontext.gregs[REG_RDX] = va_arg (ap, greg_t);
break;
case 3:
ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, long int);
ucp->uc_mcontext.gregs[REG_RCX] = va_arg (ap, greg_t);
break;
case 4:
ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, long int);
ucp->uc_mcontext.gregs[REG_R8] = va_arg (ap, greg_t);
break;
case 5:
ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, long int);
ucp->uc_mcontext.gregs[REG_R9] = va_arg (ap, greg_t);
break;
default:
/* Put value on stack. */
sp[i - 5] = va_arg (ap, unsigned long int);
sp[i - 5] = va_arg (ap, greg_t);
break;
}
va_end (ap);
Expand Down

0 comments on commit 6b6cd74

Please sign in to comment.