* converted the i386 OpenBSD startup code to Pascal

git-svn-id: trunk@41764 -
This commit is contained in:
nickysn 2019-03-22 00:54:01 +00:00
parent b4baba3454
commit 516438fd19
5 changed files with 266 additions and 1 deletions

View File

@ -352,7 +352,7 @@ interface
system_i386_linux,system_powerpc64_linux,system_sparc64_linux,system_x86_64_linux,
system_m68k_atari,system_m68k_palmos,
system_i386_haiku,system_x86_64_haiku,
system_x86_64_openbsd
system_i386_openbsd,system_x86_64_openbsd
]+systems_darwin+systems_amigalike;
{ all systems that use garbage collection for reference-counted types }

View File

@ -14,4 +14,72 @@
**********************************************************************}
{$asmmode att}
procedure __init; cdecl; external name '__init';
procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit';
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; forward;
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
asm
pushl %ebx { ps_strings }
pushl %ecx { obj }
pushl %edx { cleanup }
movl 12(%esp),%eax
leal 20(%esp,%eax,4),%ecx
leal 16(%esp),%edx
pushl %ecx
pushl %edx
pushl %eax
call _FPC_proc___start
end;
procedure _FPC_proc_haltproc; cdecl; noreturn; forward;
function _strrchr(str: PChar; character: LongInt): PChar; forward;
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl;
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<High(__progname_storage)) and (__progname[I]<>#0) do
begin
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
Inc(I);
end;
__progname_storage[I]:=#0;
__progname:=@__progname_storage;
end;
__init;
PascalMain;
c_exit(operatingsystem_result);
end;
procedure _FPC_proc_haltproc; cdecl; noreturn; public name '_haltproc';
begin
c_exit(operatingsystem_result);
end;
function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
begin
_strrchr:=nil;
repeat
if str^=Chr(character) then
_strrchr:=str;
if str^<>#0 then
Inc(str);
until str^=#0;
end;

View File

@ -14,4 +14,42 @@
**********************************************************************}
{$asmmode att}
{$ifdef VER3_0}
procedure _init; external name '_init';
{$else VER3_0}
procedure _init; weakexternal name '_init';
{$endif VER3_0}
procedure _FPC_shared_lib_start; cdecl; public name 'FPC_LIB_START';
begin
{ todo: figure out if there's any way to obtain these in OpenBSD shared libraries }
environ:=nil;
operatingsystem_parameter_envp:=nil;
operatingsystem_parameter_argc:=0;
operatingsystem_parameter_argv:=nil;
if Assigned(@_init) then
_init;
PascalMain;
end;
{ this routine is only called when the halt() routine of the RTL embedded in
the shared library is called }
procedure _FPC_shared_lib_haltproc; cdecl; public name '_haltproc';
var
ExitCode: LongInt;
begin
ExitCode:=operatingsystem_result;
asm
.Lendless:
pushl ExitCode
mov $1,%eax
call .Lactualsyscall
jmp .Lendless
.Lactualsyscall:
int $0x80
ret
end;
end;

View File

@ -14,3 +14,84 @@
**********************************************************************}
{$asmmode att}
var
_etext: Byte; external name '_etext';
_eprol: Byte; external name '_eprol';
procedure _mcleanup; cdecl; external name '_mcleanup';
function atexit(proc: TCdeclProcedure): cint; cdecl; external name 'atexit';
procedure _monstartup(lowpc, highpc: u_long); cdecl; external name '_monstartup';
procedure __init; cdecl; external name '__init';
procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit';
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; forward;
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
asm
pushl %ebx { ps_strings }
pushl %ecx { obj }
pushl %edx { cleanup }
movl 12(%esp),%eax
leal 20(%esp,%eax,4),%ecx
leal 16(%esp),%edx
pushl %ecx
pushl %edx
pushl %eax
call _FPC_proc___start
end;
procedure _FPC_proc_haltproc; cdecl; noreturn; forward;
function _strrchr(str: PChar; character: LongInt): PChar; forward;
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl;
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<High(__progname_storage)) and (__progname[I]<>#0) do
begin
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
Inc(I);
end;
__progname_storage[I]:=#0;
__progname:=@__progname_storage;
end;
atexit(@_mcleanup);
_monstartup(u_long(@_eprol),u_long(@_etext));
__init;
PascalMain;
c_exit(operatingsystem_result);
end;
procedure _FPC_proc_haltproc; cdecl; noreturn; public name '_haltproc';
begin
c_exit(operatingsystem_result);
end;
function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
begin
_strrchr:=nil;
repeat
if str^=Chr(character) then
_strrchr:=str;
if str^<>#0 then
Inc(str);
until str^=#0;
end;
procedure MD_EPROL_LABEL; assembler; nostackframe; public name '_eprol';
asm
end;

View File

@ -14,4 +14,82 @@
**********************************************************************}
{$asmmode att}
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl; forward;
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
asm
pushl %ebx { ps_strings }
pushl %ecx { obj }
pushl %edx { cleanup }
movl 12(%esp),%eax
leal 20(%esp,%eax,4),%ecx
leal 16(%esp),%edx
pushl %ecx
pushl %edx
pushl %eax
call _FPC_proc___start
end;
procedure _FPC_proc_haltproc; cdecl; noreturn; forward;
function _strrchr(str: PChar; character: LongInt): PChar; forward;
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); cdecl;
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<High(__progname_storage)) and (__progname[I]<>#0) do
begin
__progname_storage[I]:=__progname[I-Low(__progname_storage)];
Inc(I);
end;
__progname_storage[I]:=#0;
__progname:=@__progname_storage;
end;
PascalMain;
asm
jmp _FPC_proc_haltproc
end;
end;
procedure _FPC_proc_haltproc; cdecl; noreturn; public name '_haltproc';
var
ExitCode: LongInt;
begin
ExitCode:=operatingsystem_result;
asm
.Lendless:
pushl ExitCode
mov $1,%eax
call .Lactualsyscall
jmp .Lendless
.Lactualsyscall:
int $0x80
ret
end;
end;
function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
begin
_strrchr:=nil;
repeat
if str^=Chr(character) then
_strrchr:=str;
if str^<>#0 then
Inc(str);
until str^=#0;
end;