From 60d21cc041d171e12e16f07d2fda006b62e50f30 Mon Sep 17 00:00:00 2001 From: nickysn Date: Mon, 18 Mar 2019 19:08:22 +0000 Subject: [PATCH] * converted _FPC_proc___start in the OpenBSD x86_64 nonlibc startup code to Pascal git-svn-id: trunk@41736 - --- rtl/openbsd/x86_64/si_prc.inc | 108 +++++++++------------------------- 1 file changed, 29 insertions(+), 79 deletions(-) diff --git a/rtl/openbsd/x86_64/si_prc.inc b/rtl/openbsd/x86_64/si_prc.inc index 46e1a0db5c..fa3eb0a698 100644 --- a/rtl/openbsd/x86_64/si_prc.inc +++ b/rtl/openbsd/x86_64/si_prc.inc @@ -16,7 +16,7 @@ {$asmmode gas} -procedure _FPC_proc___start; forward; +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); forward; procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start'; asm @@ -35,84 +35,34 @@ procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public procedure _FPC_proc_haltproc; forward; function _strrchr(str: PChar; character: LongInt): PChar; forward; -procedure _FPC_proc___start; assembler; nostackframe; public name '___start'; - asm - pushq %rbp - movq %rsp, %rbp - subq $64, %rsp - movl %edi, -20(%rbp) { argc } - movq %rsi, -32(%rbp) { argv } - movq %rdx, -40(%rbp) { environment } - movq %rcx, -48(%rbp) { ??? } - movq %r8, -56(%rbp) { ??? } - movq %r9, -64(%rbp) { ??? } - movq -40(%rbp), %rax - movq %rax, environ(%rip) - movq %rax,operatingsystem_parameter_envp(%rip) - movq -32(%rbp), %rax - movq (%rax), %rax - movq %rax, -8(%rbp) - cmpq $0, -8(%rbp) - je .L2 - movq -8(%rbp), %rdi - movl $47, %esi - call _strrchr - movq %rax, __progname(%rip) - movq __progname(%rip), %rax - testq %rax, %rax - jne .L4 - movq -8(%rbp), %rax - movq %rax, __progname(%rip) - jmp .L6 -.L4: - movq __progname(%rip), %rax - addq $1, %rax - movq %rax, __progname(%rip) -.L6: - leaq __progname_storage(%rip), %rax - movq %rax, -16(%rbp) - jmp .L7 -.L8: - movq __progname(%rip), %rcx - movzbl (%rcx), %edx - movq -16(%rbp), %rax - movb %dl, (%rax) - addq $1, -16(%rbp) - leaq 1(%rcx), %rax - movq %rax, __progname(%rip) -.L7: - movq __progname(%rip), %rax - movzbl (%rax), %eax - testb %al, %al - je .L9 - leaq __progname_storage+255(%rip), %rax - cmpq %rax, -16(%rbp) - jb .L8 -.L9: - leaq __progname_storage(%rip), %rax - movq %rax, __progname(%rip) - movq -16(%rbp), %rax - movb $0, (%rax) -.L2: - // movl $_mcleanup, %edi - // call atexit - // movl $_etext, %eax - // movq %rax, %rsi - // movl $_eprol, %eax - // movq %rax, %rdi - // call monstartup - // movl $0, %eax - // call __init - movq environ(%rip), %rdx - movq -32(%rbp), %rsi - movl -20(%rbp), %edi - movq %rdi,operatingsystem_parameter_argc(%rip) - movq %rsi,operatingsystem_parameter_argv(%rip) - movl $0, %eax - call PASCALMAIN - // movl %eax, %edi - // call exit - jmp _FPC_proc_haltproc +procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); public name '___start'; + var + I: SizeUInt; + begin + environ:=envp; + operatingsystem_parameter_envp:=envp; + operatingsystem_parameter_argc:=argc; + operatingsystem_parameter_argv:=argv; + if argv[0]<>nil then + begin + __progname:=_strrchr(argv[0], Ord('/')); + if __progname<>nil then + Inc(__progname) + else + __progname:=argv[0]; + I:=Low(__progname_storage); + while (I#0) do + begin + __progname_storage[I]:=__progname[I]; + Inc(I); + end; + __progname_storage[I]:=#0; + __progname:=@__progname_storage; + end; + PascalMain; + asm + jmp _FPC_proc_haltproc + end; end; procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';