• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: ucontext.h changes between 10.4 and 10.5?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ucontext.h changes between 10.4 and 10.5?


  • Subject: Re: ucontext.h changes between 10.4 and 10.5?
  • From: Rick Mann <email@hidden>
  • Date: Wed, 12 Aug 2009 17:55:08 -0700

Thanks for the info, Terry. It's very helpful. I finally found the right engineer here to talk to, and it looks like we only use that information for crash logging, so a) it's okay if the info changes in a new release, and b) we're going to use OS X's crash reporting anyway, so we'll be yanking all this.

Sorry to make you go to the effort of explaining it, but it's very educational, anyway, and I'll keep it around for future reference.

Thanks!

On Aug 12, 2009, at 17:49:17, Terry Lambert wrote:

On Aug 12, 2009, at 3:25 PM, Rick Mann wrote:
I'm guessing I'm going to need to change this code. It uses ucontext to get the sigcontext, and then uses that to save off some registers and optionally deal with some error state.

Is there a way to do that without relying on a fragile API?

Can you get chip vendors to stop making new chips with new features that might need information saved on a context switch?


POSIX pretty much nails us to a non-opaque cross for all time for the ucontext_t and mcontext_t because it mandates that we expose the ucontext_t elements directly off a cast pointer, and it mandates that getcontext() take a ucontext_t that might have been statically declared, instead of treating it opaquely, and there's no corresponding destroycontext() (a pointer to a pointer would have been ideal for the ucontext_t type, with accessor and mutator functions which could be vendor defined, the way it's possible to implement posix_spawn()).


I can (probably) post some of our code if it helps. But we basically do this:

#if defined( HAVE_BSD_STYLE_SIGNALS )
#define SIGCONTEXT_MEMBER(x, y) ( static_cast< unsigned long >( x- >sc_##y ) )
#endif


void Global_sigaction_handler( int signum, siginfo_t *sinfo, void *arg )
{
struct ucontext * uc = reinterpret_cast<struct ucontext *>( arg );
struct sigcontext * context = (struct sigcontext *)&uc- >uc_mcontext;


  ...

  HAL_SavedRegisters	regs;

  regs.edi = SIGCONTEXT_MEMBER( context, edi );
  regs.esi = SIGCONTEXT_MEMBER( context, esi );

  ...etc...
}

Is there an alternative way to implement this?


Realize the code will not necessarily be portable between versions of the OS (POSIX is what added the __'s to endure against namespace pollution), and the binaries will not necessarily be portable between software updates, since we reserve the right to plop down pretty much any modified version of a context structure on the user stack we need to in order to support a hardware platform, and then pass a pointer to that as the new ucontext_t/mcontext_t type.

Also realize that mcontext_t is implementation defined, and we've defined it as a pointer that points someplace on the stack after the ucontext_t, without definition anything about packing or anything else it'd be convenient to nail down, if you didn't want to have to rev your product on software updates, just like we potentially have to rev gdb, Java, and our other tools that know about the internals of these things on software updates.

This cruft is NOT API. If you break on an SU because we change it, you fix it.

-- Terry
///////////////////////////////////
#define _XOPEN_SOURCE 600L /* This is pretty clearly documented in <ucontexh.h> */


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

/*
* some fake data so I don't really have to write a signal handler and make it fire
* to demonstrate successfully accessing structure members of the mcontext...
*/
ucontext_t foo;
char *buf[1024];
mcontext_t fee = (void *)buf;;


/* A small program that proves we actually accessed them */
int
main(int ac, char *av[])
{
#if __LP64
	unsigned long long save_rdi = fee->__ss.__rdi;
#else
	unsigned long save_edi = fee->__ss.__edi;
#endif

	printf("I compiled with the definition in scope\n");
	return 0;
}
///////////////////////////////////


_______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-dev mailing list (email@hidden) Help/Unsubscribe/Update your Subscription: This email sent to email@hidden
References: 
 >ucontext.h changes between 10.4 and 10.5? (From: Rick Mann <email@hidden>)
 >Re: ucontext.h changes between 10.4 and 10.5? (From: Rick Mann <email@hidden>)
 >Re: ucontext.h changes between 10.4 and 10.5? (From: Terry Lambert <email@hidden>)

  • Prev by Date: Re: ucontext.h changes between 10.4 and 10.5?
  • Next by Date: RE: dns_lookup returns NULL?
  • Previous by thread: Re: ucontext.h changes between 10.4 and 10.5?
  • Next by thread: Re: ucontext.h changes between 10.4 and 10.5?
  • Index(es):
    • Date
    • Thread