Dan Strick <[EMAIL PROTECTED]> writes:
> Thanks for the pointer to /usr/src/lib/libc/i386/SYS.h.  It contains
> precisely the "secret macro instructions invoking undocumented gnu
> C-compiler asm() features" that I suspected but could not find.
>
> I still don't understand all the details but I do understand enough
> to realize that I don't want to understand any more.

I don't see what's so hard to understand:

#define SYSCALL(x)      2: PIC_PROLOGUE; jmp PIC_PLT(HIDENAME(cerror)); \
                        ENTRY(__CONCAT(__sys_,x));                      \
                        .weak CNAME(x);                                 \
                        .set CNAME(x),CNAME(__CONCAT(__sys_,x));        \
                        .weak CNAME(__CONCAT(_,x));                     \
                        .set CNAME(__CONCAT(_,x)),CNAME(__CONCAT(__sys_,x)); \
                        mov __CONCAT($SYS_,x),%eax; KERNCALL; jb 2b

the important part is the beginning of the last line, which for open()
corresponds to:

        mov SYS_open, %eax
        int $0x80

(where SYS_open is the syscall number for open(), normally 5)

the rest is just error handling ('jb 2b' jumps back to the 'jmp
cerror' if the system call returns an error) and namespace management
(the .weak and .set stuff create two weak aliases, _open and open, for
the real syscall name which is __sys_open)

most of the complexity comes from the use of macros to hide
differences between relocatable and non-relocatable code so that the
same definition can be used for both.

DES
-- 
Dag-Erling Smørgrav - [EMAIL PROTECTED]
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to