Subject: Re: amd64 alignment problem - gcc's fault or libpthread's?
To: Frank van der Linden <>
From: Matthias Drochner <>
List: port-amd64
Date: 02/27/2004 20:08:51
This is a multipart MIME message.

Content-Type: text/plain; charset=us-ascii said:
> If the libpthread regression tests work with this change, go ahead and
> check it in.. 

libpthread is happy, but since it affects makecontext() in general,
I'd like to try a test using it directly.
Now I've found the following: the context returned by getcontext()
is wrong - the ds is set to 0x3f (should be 0x17). setcontext()
complains about that.
The reason is obviously that the old int0x80 syscall path is used
by getmcontext(). If I just add a
movw    $(LSEL(LUDATA_SEL, SEL_UPL)),TF_DS(%rsp)
to the osyscall entry in locore.S, it works much better.
(this also helps for debugging with gdb btw - I can start
a program within gdb now)
Well, this doesn't look like a clean solution -- what is the reason
that getcontext() uses OSYSCALL?
(Is there a need to expose segment registers to the user-visible
mcontext at all? They are pretty meaningless in 64-bit mode.)

I'll append the test program I've used.

best regards

Content-Type: text/plain ; name="mctest.c"; charset=us-ascii
Content-Description: mctest.c
Content-Disposition: attachment; filename="mctest.c"

#include <stdio.h>
#include <malloc.h>
#include <ucontext.h>
#include <err.h>

char buf[100];

thr(int a)

	sprintf(buf, "%.*g\n", 12, 1.234);
	printf("called with %d\n", a);

dumpmc(ucontext_t *p)
	mcontext_t *m = &p->uc_mcontext;
	__greg_t *g = m->__gregs;

	printf("fl=%x\n", g[_REG_RFL]);
	printf("es=%x\n", g[_REG_ES]);
	printf("fs=%x\n", g[_REG_FS]);
	printf("gs=%x\n", g[_REG_GS]);
	printf("ds=%x\n", g[_REG_DS]);
#if 0
	printf("ss=%x\n", g[_REG_SS]);
	printf("cs=%x\n", g[_REG_CS]);
	printf("ip=%x\n", g[_REG_RIP]);

	ucontext_t uc;
	char *stack;
	int res;

	stack = malloc(10*4096);
	uc.uc_stack.ss_sp = stack;
	uc.uc_stack.ss_size = 10*4096;
	makecontext(&uc, thr, 1, 77);
	res = setcontext(&uc);
	if (res)
		err(1, "setcontext");