From: Cyrus H. <sl...@us...> - 2006-03-06 10:03:57
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15810/src/runtime Added Files: x86-darwin-mkrospace.c Log Message: 0.9.10.16: x86/Darwin support ... Add Config support and ape the darwin/ppc space fixup stuff. ... Align stack to 16-bytes as per ABI in %alien-funcall, c-call and show. ... Add darwin space params. ... Use an altstack for handling signals in hopes of giving signal handlers properly aligned stacks. ... Get registers and flags out of the mcontext properly. Needed to play some games to get sys/_types included in order to get the full definition of the mcontext struct which Apple tries to hide from us. ... Moved os_get_runtime_executable_path from ppc-darwin-os.c to new file darwin-os.c. ... Fix debugging #ifdefs in runtime.h ... #define hacks to x86-assem.S to keep Apple's brain-dead assembler happy. In particular, it doesn't like things like $NIL, so I had to play some games with the precompiler to make it happy, and it wants .globl instead of .global. Also fixed a couple raw .aligns that should have used the macros ... Align stack in ppc-assem.S:call_into_c ... Added x86-darwin-os.h ... #- out debug.impure test that causes bad things to happen on darwin/ppc as it seems to cause bad things on x86/darwin as well. ... adjust fails for float tests ... LDSO stubs for x86/darwin --- NEW FILE: x86-darwin-mkrospace.c --- /* x86-darwin-mkrospace.c - write a .o which makes sure we get our desired address range */ #include <stdlib.h> #include <string.h> #include <mach-o/loader.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include "sbcl.h" #include "runtime.h" #include "x86-darwin-spacelist.h" struct simple_object_file { struct segment_command thesegment; struct section thesection; }; int main(int argc, char** argv) { struct mach_header *theheader; struct simple_object_file *theobj; int fd, i; /* Produce the mach header */ theheader = (struct mach_header*) malloc(sizeof(struct mach_header)); theheader->magic = MH_MAGIC; theheader->cputype = CPU_TYPE_X86; theheader->cpusubtype = CPU_SUBTYPE_I386_ALL; theheader->filetype = MH_OBJECT; theheader->ncmds = N_SEGMENTS_TO_PRODUCE; theheader->sizeofcmds = N_SEGMENTS_TO_PRODUCE * (sizeof(struct segment_command) + sizeof(struct section)); theheader->flags = MH_NOUNDEFS; printf("-Wl"); fd = open("x86-darwin-rospace.o", O_WRONLY | O_CREAT, 0644); write(fd, theheader, sizeof(struct mach_header)); for (i = 0; i < N_SEGMENTS_TO_PRODUCE; i++) { theobj = (struct simple_object_file*) malloc(sizeof(struct simple_object_file)); theobj->thesegment.cmd = LC_SEGMENT; theobj->thesegment.cmdsize = sizeof(struct segment_command) + sizeof(struct section); snprintf(theobj->thesegment.segname, 7, "SBCL%d", i); theobj->thesegment.fileoff = sizeof(struct mach_header) + i * (sizeof(struct segment_command) + sizeof(struct section)); theobj->thesegment.vmaddr = space_start_locations[i]; theobj->thesegment.vmsize = 0; theobj->thesegment.maxprot = VM_PROT_ALL; theobj->thesegment.initprot = VM_PROT_ALL; theobj->thesegment.nsects = 1; theobj->thesegment.flags = 0; snprintf(theobj->thesection.sectname, 7, "sect%d", i); snprintf(theobj->thesection.segname, 7, "SBCL%d", i); theobj->thesection.addr = space_start_locations[i]; theobj->thesection.size = 0; theobj->thesection.offset = 0; theobj->thesection.align = 0; theobj->thesection.reloff = 0; theobj->thesection.nreloc = 0; theobj->thesection.flags = S_ZEROFILL | S_REGULAR | S_ATTR_SOME_INSTRUCTIONS; theobj->thesection.reserved1 = 0; theobj->thesection.reserved2 = 0; write(fd, theobj, sizeof(struct simple_object_file)); printf(",-segaddr,SBCL%d,0x%x", i, space_start_locations[i]); free(theobj); } printf("\n"); close(fd); return 0; } |