diff --git a/.gitattributes b/.gitattributes index 928142d94c..1bfff28196 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8606,6 +8606,7 @@ rtl/haiku/classes.pp svneol=native#text/plain rtl/haiku/errno.inc svneol=native#text/plain rtl/haiku/errnostr.inc svneol=native#text/plain rtl/haiku/i386/cprt0.as svneol=native#text/plain +rtl/haiku/i386/dllcprt0.as svneol=native#text/plain rtl/haiku/i386/dllprt.as svneol=native#text/plain rtl/haiku/i386/dllprt.cpp svneol=native#text/plain rtl/haiku/i386/func.as svneol=native#text/plain diff --git a/rtl/haiku/i386/dllcprt0.as b/rtl/haiku/i386/dllcprt0.as new file mode 100644 index 0000000000..dcab46070a --- /dev/null +++ b/rtl/haiku/i386/dllcprt0.as @@ -0,0 +1,207 @@ + .file "dllcprt0.as" +.data + .align 4 +default_environ: + .long 0 +.text +.globl initialize_after + .type initialize_after,@function +initialize_after: + .globl FPC_SHARED_LIB_START + .type FPC_SHARED_LIB_START,@function +FPC_SHARED_LIB_START: + /* We are in a library if we link something against this code */ + movb $1,operatingsystem_islibrary + /* Initialize freepascal variables in the shared object so they + can be used as expected. + + As we link with libroot (our libc), just copy values from the + corresponding external variables in the Freepascal ones. + They are already initialized by libroot initialization. + + Inspired by /haiku/src/system/glue/start_dyn.c + and /haiku/src/system/libroot/libroot_init.c + */ + movl __libc_argc,%eax + movl %eax,operatingsystem_parameter_argc + movl __libc_argv,%eax + movl %eax,operatingsystem_parameter_argv + movl environ,%eax + movl %eax,operatingsystem_parameter_envp + xorl %ebp,%ebp + call PASCALMAIN + +.globl _haltproc +.type _haltproc,@function +_haltproc: + call _thread_do_exit_notification + xorl %ebx,%ebx + movw operatingsystem_result,%bx + pushl %ebx + call exit + + +/* int sys_open (int=0xFF000000, char * name, int mode, int=0, int close_on_exec=0); */ +.globl sys_open +.type sys_open,@function +sys_open: +xorl %eax,%eax +int $0x25 +ret + +/* int sys_close (int handle) */ +.globl sys_close +.type sys_close,@function +sys_close: +mov $0x01,%eax +int $0x25 +ret + +/* int sys_read (int handle, void * buffer, int length) */ +.globl sys_read +.type sys_read,@function +sys_read: +movl $0x02,%eax +int $0x25 +ret + +/* int sys_write (int handle, void * buffer, int length) */ +.globl sys_write +.type sys_write,@function +sys_write: +movl $0x3,%eax +int $0x25 +ret + +/* int sys_lseek (int handle, long long pos, int whence) */ +.globl sys_lseek +.type sys_lseek,@function +sys_lseek: +movl $0x5,%eax +int $0x25 +ret + +/* int sys_time(void) */ +.globl sys_time +.type sys_time,@function +sys_time: +movl $0x7,%eax +int $0x25 +ret + +/* int sys_resize_area */ +.globl sys_resize_area +.type sys_resize_area,@function +sys_resize_area: +movl $0x8,%eax +int $0x25 +ret + +/* int sys_opendir (0xFF000000, chra * name, 0) */ +.globl sys_opendir +.type sys_opendir,@function +sys_opendir: +movl $0xC,%eax +int $0x25 +ret + + +/* int sys_create_area */ +.globl sys_create_area +.type sys_create_area,@function +sys_create_area: +movl $0x14,%eax +int $0x25 +ret + +/* int sys_readdir (int handle, void * dirent, 0x11C, 0x01000000) */ +.globl sys_readdir +.type sys_readdir,@function +sys_readdir: +movl $0x1C,%eax +int $0x25 +ret + +/* int sys_mkdir (char=0xFF, char * name, int mode) */ +.globl sys_mkdir +.type sys_mkdir,@function +sys_mkdir: +movl $0x1E,%eax +int $0x25 +ret + +/* int sys_wait_for_thread */ +.globl sys_wait_for_thread +.type sys_wait_for_thread,@function +sys_wait_for_thread: +movl $0x22,%eax +int $0x25 +ret + +/* int sys_rename (int=0xFF000000, char * name, int=0xFF000000, char * newname) */ +.globl sys_rename +.type sys_rename,@function +sys_rename: +movl $0x26,%eax +int $0x25 +ret + +/* int sys_unlink (int=0xFF000000, char * name) */ +.globl sys_unlink +.type sys_unlink,@function +sys_unlink: +movl $0x27,%eax +int $0x25 +ret + +/* int sys_stat (int=0xFF000000, char * name, struct stat * s, int=0) */ +.globl sys_stat +.type sys_stat,@function +sys_stat: +movl $0x30,%eax +int $0x25 +ret + +/* int sys_load_image */ +.globl sys_load_image +.type sys_load_image,@function +sys_load_image: +movl $0x34,%eax +int $0x25 +ret + +/* void sys_exit (int exitcode) */ +.globl sys_exit +.type sys_exit,@function +sys_exit: +movl $0x3F,%eax +int $0x25 + +/* void sys_chdir (char 0xFF, char * name) */ +.globl sys_chdir +.type sys_chdir,@function +sys_chdir: +movl $0x57,%eax +int $0x25 +ret + +/* void sys_rmdir (char 0xFF, char * name) */ +.globl sys_rmdir +.type sys_rmdir,@function +sys_rmdir: +movl $0x60,%eax +int $0x25 +ret + +/* actual syscall */ +.globl sys_call +.type sys_call,@function +sys_call: +int $0x25 +ret + +.bss + .comm operatingsystem_parameter_envp,4 + .comm operatingsystem_parameter_argc,4 + .comm operatingsystem_parameter_argv,4 +