From: erik quanstrom <quanstro@quanstro.net>
To: 9fans@9fans.net
Subject: Re: [9fans] a jmp_buf in APE question
Date: Mon, 7 Jan 2013 05:31:44 -0500 [thread overview]
Message-ID: <d9ae669115c31ca37f15264abd6b9d4e@kw.quanstro.net> (raw)
In-Reply-To: <1752877.EVzC7FFEmr@krypton>
On Mon Jan 7 00:47:14 EST 2013, staal1978@gmail.com wrote:
> Hi all. Perhaps I have been looking at completely the wrong places and perhaps
> I am just not grasping it at all.
>
> For a package that I want to build under APE, I need to put in the stack
> pointer (sp) and the program counter (pc) part of jmp_buf specific for Plan9
> (since APE does not expose any stack-related functions that could have been
> used)
>
> according to /sys/include/ape/setjmp.h, jmp_buf is an array of 10 int:s.
>
> I then went to check out /sys/src/ape/lib/ap/$objtype/setjmp.s
> but I could not really understand anything in those files
as you point out, the interface is opaque.
but if you look under the covers, PC and SP are stored in first two
"entries" of the jmp_buf blob. obviously PC and SP are not properly
ints, but rather uintptrs, so the absolute offset will depend on the
pointer size (0 and 4 for 386). a better definition of jmp_buf might be
typedef uchar jmp_buf[4 * sizeof uintptr];
note, a structure will not do, since a structure would be passed in by
value and therefore any values set would disappear on return from setjmp.
for amd64 the setjmp code is (comments changed assuming that jmp_buf is an
array of uintptrs)
TEXT setjmp(SB), $0 /* RARG is set to &jmp_buf[0] */
MOVQ SP, 0(RARG) /* store sp in RARG offset 0; jmp_buf[0] = SP */
MOVQ 0(SP), BX /* return pc */
MOVQ BX, 8(RARG) /* stored at offset 8; jmp_buf[1] = PC */
MOVL $0, AX /* return 0 */
RET
note that in this case the absolute offsets are 0 and 8, since pointers on
amd64 take 8 bytes.
> The second question would be, is the position of those two values in jmp_buf
> architecture-specific so that I should make a note of that it is working on
> i386 only?
the structure within jmp_buf is entirely determined by the code in setjmp.s
i don't think it would be wise to rely on the structure of jmp_buf. it's
not exposing any structure, so it seems unwise to assume it. the typical
way around this would be to create $objtype.s for each $objtype you wish
to support and store the PC and SP as you like them. i think what you want
is
enum {
Spidx,
Pcidx,
Nregsave,
};
typedef uintptr myjmpbuf[Nregsave];
then it should be a simple matter of reappropriating the code from setjmp.
- erik
next prev parent reply other threads:[~2013-01-07 10:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-07 5:45 Jens Staal
2013-01-07 10:31 ` erik quanstrom [this message]
2013-01-07 11:05 ` Jens Staal
2013-01-07 11:15 ` erik quanstrom
2013-01-07 16:43 ` Jens Staal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d9ae669115c31ca37f15264abd6b9d4e@kw.quanstro.net \
--to=quanstro@quanstro.net \
--cc=9fans@9fans.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).