瀏覽代碼

+ Initial implementation for openbsd x86_64 cpu specific rtl code

git-svn-id: trunk@20713 -
pierre 13 年之前
父節點
當前提交
a06b2b4c02

+ 6 - 0
.gitattributes

@@ -8080,6 +8080,12 @@ rtl/openbsd/unxconst.inc svneol=native#text/plain
 rtl/openbsd/unxfunc.inc svneol=native#text/plain
 rtl/openbsd/unxsockh.inc svneol=native#text/plain
 rtl/openbsd/unxsysc.inc svneol=native#text/plain
+rtl/openbsd/x86_64/bsyscall.inc svneol=native#text/plain
+rtl/openbsd/x86_64/cprt0.as svneol=native#text/plain
+rtl/openbsd/x86_64/crt0.s svneol=native#text/plain
+rtl/openbsd/x86_64/gprt0.as svneol=native#text/plain
+rtl/openbsd/x86_64/prt0.as svneol=native#text/plain
+rtl/openbsd/x86_64/sighnd.inc svneol=native#text/plain
 rtl/os2/Makefile svneol=native#text/plain
 rtl/os2/Makefile.fpc svneol=native#text/plain
 rtl/os2/classes.pp svneol=native#text/plain

+ 14 - 0
rtl/openbsd/x86_64/bsyscall.inc

@@ -0,0 +1,14 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2005 by Michael Van Canneyt,
+    member of the Free Pascal development team.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+

+ 236 - 0
rtl/openbsd/x86_64/cprt0.as

@@ -0,0 +1,236 @@
+	.file	"crt0.c"
+	.globl	__progname
+	.section	.rodata
+.LC0:
+	.string	""
+	.data
+	.align 8
+	.type	__progname, @object
+	.size	__progname, 8
+__progname:
+	.quad	.LC0
+#APP
+	 .text				
+	.align	8			
+	.globl	__start			
+	.globl	_start			
+_start:					
+__start:				
+	movq	%rbx,%r9		
+	movq	%rcx,%r8		
+	movq	%rdx,%rcx		
+	movq	(%rsp),%rdi		
+	leaq	16(%rsp,%rdi,8),%rdx	
+	leaq	8(%rsp),%rsi		
+	subq	$8,%rsp			
+	andq	$~15,%rsp		
+	addq	$8,%rsp			
+	jmp	___start		
+
+#NO_APP
+	.text
+	.globl	___start
+	.type	___start, @function
+___start:
+.LFB9:
+	pushq	%rbp
+.LCFI0:
+	movq	%rsp, %rbp
+.LCFI1:
+	subq	$64, %rsp
+.LCFI2:
+	movl	%edi, -20(%rbp)
+	movq	%rsi, -32(%rbp)
+	movq	%rdx, -40(%rbp)
+	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
+	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:
+	movq	$__progname_storage, -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
+	movl	$__progname_storage+255, %eax
+	cmpq	%rax, -16(%rbp)
+	jb	.L8
+.L9:
+	movq	-16(%rbp), %rax
+	movb	$0, (%rax)
+	movq	$__progname_storage, __progname(%rip)
+.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
+	movq    %rsi,operatingsystem_parameter_argv
+	movl	$0, %eax
+	call	main
+	# movl	%eax, %edi
+	# call	exit
+	jmp _haltproc
+        .p2align 2,0x90
+
+.globl _haltproc
+.type _haltproc,@function
+
+_haltproc:
+           movq $1,%rax
+           movzwq operatingsystem_result,%rbx
+           pushq   %rbx
+           call .Lactualsyscall
+           addq  $8,%rsp
+           jmp   _haltproc
+
+.Lactualsyscall:
+         int $0x80
+         jb .LErrorcode
+         xor %rbx,%rbx
+         ret
+.LErrorcode:
+         movq  %rax,%rbx
+         movq  $-1,%rax
+.LFE9:
+	.size	___start, .-___start
+	.type	_strrchr, @function
+_strrchr:
+.LFB10:
+	pushq	%rbp
+.LCFI3:
+	movq	%rsp, %rbp
+.LCFI4:
+	movq	%rdi, -24(%rbp)
+	movb	%sil, -25(%rbp)
+	movq	$0, -8(%rbp)
+.L13:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	cmpb	-25(%rbp), %al
+	jne	.L14
+	movq	-24(%rbp), %rax
+	movq	%rax, -8(%rbp)
+.L14:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	testb	%al, %al
+	jne	.L16
+	movq	-8(%rbp), %rax
+	movq	%rax, -16(%rbp)
+	jmp	.L12
+.L16:
+	addq	$1, -24(%rbp)
+	jmp	.L13
+.L12:
+	movq	-16(%rbp), %rax
+	leave
+	ret
+.LFE10:
+	.size	_strrchr, .-_strrchr
+#APP
+	  .text
+	_eprol:
+#NO_APP
+	.comm	environ,8,8
+	.comm	__progname_storage,256,32
+        .comm   operatingsystem_parameter_envp,8,8
+        .comm   operatingsystem_parameter_argc,8,8
+        .comm   operatingsystem_parameter_argv,8,8
+	.section	.eh_frame,"a",@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1
+.LSCIE1:
+	.long	0x0
+	.byte	0x1
+	.string	"zR"
+	.uleb128 0x1
+	.sleb128 -8
+	.byte	0x10
+	.uleb128 0x1
+	.byte	0x3
+	.byte	0xc
+	.uleb128 0x7
+	.uleb128 0x8
+	.byte	0x90
+	.uleb128 0x1
+	.align 8
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1
+	.long	.LFB9
+	.long	.LFE9-.LFB9
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI0-.LFB9
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE1:
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1
+	.long	.LFB10
+	.long	.LFE10-.LFB10
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI3-.LFB10
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI4-.LCFI3
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE3:
+	.ident	"GCC: (GNU) 4.2.1 20070719 "

+ 192 - 0
rtl/openbsd/x86_64/crt0.s

@@ -0,0 +1,192 @@
+	.file	"crt0.c"
+	.globl	__progname
+	.section	.rodata
+.LC0:
+	.string	""
+	.data
+	.align 8
+	.type	__progname, @object
+	.size	__progname, 8
+__progname:
+	.quad	.LC0
+#APP
+	 .text				;	.align	8			;	.globl	__start			;	.globl	_start			;_start:					;__start:				;	movq	%rbx,%r9		;	movq	%rcx,%r8		;	movq	%rdx,%rcx		;	movq	(%rsp),%rdi		;	leaq	16(%rsp,%rdi,8),%rdx	;	leaq	8(%rsp),%rsi		;	subq	$8,%rsp			;	andq	$~15,%rsp		;	addq	$8,%rsp			;	jmp	___start		;
+#NO_APP
+	.text
+	.globl	___start
+	.type	___start, @function
+___start:
+.LFB9:
+	pushq	%rbp
+.LCFI0:
+	movq	%rsp, %rbp
+.LCFI1:
+	subq	$64, %rsp
+.LCFI2:
+	movl	%edi, -20(%rbp)
+	movq	%rsi, -32(%rbp)
+	movq	%rdx, -40(%rbp)
+	movq	%rcx, -48(%rbp)
+	movq	%r8, -56(%rbp)
+	movq	%r9, -64(%rbp)
+	movq	-40(%rbp), %rax
+	movq	%rax, environ(%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:
+	movq	$__progname_storage, -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
+	movl	$__progname_storage+255, %eax
+	cmpq	%rax, -16(%rbp)
+	jb	.L8
+.L9:
+	movq	-16(%rbp), %rax
+	movb	$0, (%rax)
+	movq	$__progname_storage, __progname(%rip)
+.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
+	movl	$0, %eax
+	call	main
+	movl	%eax, %edi
+	call	exit
+.LFE9:
+	.size	___start, .-___start
+	.type	_strrchr, @function
+_strrchr:
+.LFB10:
+	pushq	%rbp
+.LCFI3:
+	movq	%rsp, %rbp
+.LCFI4:
+	movq	%rdi, -24(%rbp)
+	movb	%sil, -25(%rbp)
+	movq	$0, -8(%rbp)
+.L13:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	cmpb	-25(%rbp), %al
+	jne	.L14
+	movq	-24(%rbp), %rax
+	movq	%rax, -8(%rbp)
+.L14:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	testb	%al, %al
+	jne	.L16
+	movq	-8(%rbp), %rax
+	movq	%rax, -16(%rbp)
+	jmp	.L12
+.L16:
+	addq	$1, -24(%rbp)
+	jmp	.L13
+.L12:
+	movq	-16(%rbp), %rax
+	leave
+	ret
+.LFE10:
+	.size	_strrchr, .-_strrchr
+#APP
+	  .text
+	_eprol:
+#NO_APP
+	.comm	environ,8,8
+	.comm	__progname_storage,256,32
+	.section	.eh_frame,"a",@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1
+.LSCIE1:
+	.long	0x0
+	.byte	0x1
+	.string	"zR"
+	.uleb128 0x1
+	.sleb128 -8
+	.byte	0x10
+	.uleb128 0x1
+	.byte	0x3
+	.byte	0xc
+	.uleb128 0x7
+	.uleb128 0x8
+	.byte	0x90
+	.uleb128 0x1
+	.align 8
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1
+	.long	.LFB9
+	.long	.LFE9-.LFB9
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI0-.LFB9
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE1:
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1
+	.long	.LFB10
+	.long	.LFE10-.LFB10
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI3-.LFB10
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI4-.LCFI3
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE3:
+	.ident	"GCC: (GNU) 4.2.1 20070719 "

+ 236 - 0
rtl/openbsd/x86_64/gprt0.as

@@ -0,0 +1,236 @@
+	.file	"crt0.c"
+	.globl	__progname
+	.section	.rodata
+.LC0:
+	.string	""
+	.data
+	.align 8
+	.type	__progname, @object
+	.size	__progname, 8
+__progname:
+	.quad	.LC0
+#APP
+	 .text				
+	.align	8			
+	.globl	__start			
+	.globl	_start			
+_start:					
+__start:				
+	movq	%rbx,%r9		
+	movq	%rcx,%r8		
+	movq	%rdx,%rcx		
+	movq	(%rsp),%rdi		
+	leaq	16(%rsp,%rdi,8),%rdx	
+	leaq	8(%rsp),%rsi		
+	subq	$8,%rsp			
+	andq	$~15,%rsp		
+	addq	$8,%rsp			
+	jmp	___start		
+
+#NO_APP
+	.text
+	.globl	___start
+	.type	___start, @function
+___start:
+.LFB9:
+	pushq	%rbp
+.LCFI0:
+	movq	%rsp, %rbp
+.LCFI1:
+	subq	$64, %rsp
+.LCFI2:
+	movl	%edi, -20(%rbp)
+	movq	%rsi, -32(%rbp)
+	movq	%rdx, -40(%rbp)
+	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
+	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:
+	movq	$__progname_storage, -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
+	movl	$__progname_storage+255, %eax
+	cmpq	%rax, -16(%rbp)
+	jb	.L8
+.L9:
+	movq	-16(%rbp), %rax
+	movb	$0, (%rax)
+	movq	$__progname_storage, __progname(%rip)
+.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
+	movq    %rsi,operatingsystem_parameter_argv
+	movl	$0, %eax
+	call	main
+	# movl	%eax, %edi
+	# call	exit
+	jmp _haltproc
+        .p2align 2,0x90
+
+.globl _haltproc
+.type _haltproc,@function
+
+_haltproc:
+           movq $1,%rax
+           movzwq operatingsystem_result,%rbx
+           pushq   %rbx
+           call .Lactualsyscall
+           addq  $8,%rsp
+           jmp   _haltproc
+
+.Lactualsyscall:
+         int $0x80
+         jb .LErrorcode
+         xor %rbx,%rbx
+         ret
+.LErrorcode:
+         movq  %rax,%rbx
+         movq  $-1,%rax
+.LFE9:
+	.size	___start, .-___start
+	.type	_strrchr, @function
+_strrchr:
+.LFB10:
+	pushq	%rbp
+.LCFI3:
+	movq	%rsp, %rbp
+.LCFI4:
+	movq	%rdi, -24(%rbp)
+	movb	%sil, -25(%rbp)
+	movq	$0, -8(%rbp)
+.L13:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	cmpb	-25(%rbp), %al
+	jne	.L14
+	movq	-24(%rbp), %rax
+	movq	%rax, -8(%rbp)
+.L14:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	testb	%al, %al
+	jne	.L16
+	movq	-8(%rbp), %rax
+	movq	%rax, -16(%rbp)
+	jmp	.L12
+.L16:
+	addq	$1, -24(%rbp)
+	jmp	.L13
+.L12:
+	movq	-16(%rbp), %rax
+	leave
+	ret
+.LFE10:
+	.size	_strrchr, .-_strrchr
+#APP
+	  .text
+	_eprol:
+#NO_APP
+	.comm	environ,8,8
+	.comm	__progname_storage,256,32
+        .comm   operatingsystem_parameter_envp,8,8
+        .comm   operatingsystem_parameter_argc,8,8
+        .comm   operatingsystem_parameter_argv,8,8
+	.section	.eh_frame,"a",@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1
+.LSCIE1:
+	.long	0x0
+	.byte	0x1
+	.string	"zR"
+	.uleb128 0x1
+	.sleb128 -8
+	.byte	0x10
+	.uleb128 0x1
+	.byte	0x3
+	.byte	0xc
+	.uleb128 0x7
+	.uleb128 0x8
+	.byte	0x90
+	.uleb128 0x1
+	.align 8
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1
+	.long	.LFB9
+	.long	.LFE9-.LFB9
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI0-.LFB9
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE1:
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1
+	.long	.LFB10
+	.long	.LFE10-.LFB10
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI3-.LFB10
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI4-.LCFI3
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE3:
+	.ident	"GCC: (GNU) 4.2.1 20070719 "

+ 236 - 0
rtl/openbsd/x86_64/prt0.as

@@ -0,0 +1,236 @@
+	.file	"crt0.c"
+	.globl	__progname
+	.section	.rodata
+.LC0:
+	.string	""
+	.data
+	.align 8
+	.type	__progname, @object
+	.size	__progname, 8
+__progname:
+	.quad	.LC0
+#APP
+	 .text				
+	.align	8			
+	.globl	__start			
+	.globl	_start			
+_start:					
+__start:				
+	movq	%rbx,%r9		
+	movq	%rcx,%r8		
+	movq	%rdx,%rcx		
+	movq	(%rsp),%rdi		
+	leaq	16(%rsp,%rdi,8),%rdx	
+	leaq	8(%rsp),%rsi		
+	subq	$8,%rsp			
+	andq	$~15,%rsp		
+	addq	$8,%rsp			
+	jmp	___start		
+
+#NO_APP
+	.text
+	.globl	___start
+	.type	___start, @function
+___start:
+.LFB9:
+	pushq	%rbp
+.LCFI0:
+	movq	%rsp, %rbp
+.LCFI1:
+	subq	$64, %rsp
+.LCFI2:
+	movl	%edi, -20(%rbp)
+	movq	%rsi, -32(%rbp)
+	movq	%rdx, -40(%rbp)
+	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
+	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:
+	movq	$__progname_storage, -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
+	movl	$__progname_storage+255, %eax
+	cmpq	%rax, -16(%rbp)
+	jb	.L8
+.L9:
+	movq	-16(%rbp), %rax
+	movb	$0, (%rax)
+	movq	$__progname_storage, __progname(%rip)
+.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
+	movq    %rsi,operatingsystem_parameter_argv
+	movl	$0, %eax
+	call	main
+	# movl	%eax, %edi
+	# call	exit
+	jmp _haltproc
+        .p2align 2,0x90
+
+.globl _haltproc
+.type _haltproc,@function
+
+_haltproc:
+           movq $1,%rax
+           movzwq operatingsystem_result,%rbx
+           pushq   %rbx
+           call .Lactualsyscall
+           addq  $8,%rsp
+           jmp   _haltproc
+
+.Lactualsyscall:
+         int $0x80
+         jb .LErrorcode
+         xor %rbx,%rbx
+         ret
+.LErrorcode:
+         movq  %rax,%rbx
+         movq  $-1,%rax
+.LFE9:
+	.size	___start, .-___start
+	.type	_strrchr, @function
+_strrchr:
+.LFB10:
+	pushq	%rbp
+.LCFI3:
+	movq	%rsp, %rbp
+.LCFI4:
+	movq	%rdi, -24(%rbp)
+	movb	%sil, -25(%rbp)
+	movq	$0, -8(%rbp)
+.L13:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	cmpb	-25(%rbp), %al
+	jne	.L14
+	movq	-24(%rbp), %rax
+	movq	%rax, -8(%rbp)
+.L14:
+	movq	-24(%rbp), %rdx
+	movzbl	(%rdx), %eax
+	testb	%al, %al
+	jne	.L16
+	movq	-8(%rbp), %rax
+	movq	%rax, -16(%rbp)
+	jmp	.L12
+.L16:
+	addq	$1, -24(%rbp)
+	jmp	.L13
+.L12:
+	movq	-16(%rbp), %rax
+	leave
+	ret
+.LFE10:
+	.size	_strrchr, .-_strrchr
+#APP
+	  .text
+	_eprol:
+#NO_APP
+	.comm	environ,8,8
+	.comm	__progname_storage,256,32
+        .comm   operatingsystem_parameter_envp,8,8
+        .comm   operatingsystem_parameter_argc,8,8
+        .comm   operatingsystem_parameter_argv,8,8
+	.section	.eh_frame,"a",@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1
+.LSCIE1:
+	.long	0x0
+	.byte	0x1
+	.string	"zR"
+	.uleb128 0x1
+	.sleb128 -8
+	.byte	0x10
+	.uleb128 0x1
+	.byte	0x3
+	.byte	0xc
+	.uleb128 0x7
+	.uleb128 0x8
+	.byte	0x90
+	.uleb128 0x1
+	.align 8
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1
+	.long	.LFB9
+	.long	.LFE9-.LFB9
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI0-.LFB9
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE1:
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1
+	.long	.LFB10
+	.long	.LFE10-.LFB10
+	.uleb128 0x0
+	.byte	0x4
+	.long	.LCFI3-.LFB10
+	.byte	0xe
+	.uleb128 0x10
+	.byte	0x86
+	.uleb128 0x2
+	.byte	0x4
+	.long	.LCFI4-.LCFI3
+	.byte	0xd
+	.uleb128 0x6
+	.align 8
+.LEFDE3:
+	.ident	"GCC: (GNU) 4.2.1 20070719 "

+ 100 - 0
rtl/openbsd/x86_64/sighnd.inc

@@ -0,0 +1,100 @@
+{
+   This file is part of the Free Pascal run time library.
+   (c) 2000-2003 by Marco van de Voort
+   member of the Free Pascal development team.
+
+   See the file COPYING.FPC, included in this distribution,
+   for details about the copyright.
+
+   Signalhandler for FreeBSD/i386
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY;without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+CONST FPU_ALL=$7F;
+
+{$ifdef cpui386}
+function getfpustate(sininfo:psiginfo):longint; {inline;}
+begin
+  if ptruint(sininfo)> high(word) then
+    getfpustate:=sininfo^.si_code
+  else
+    getfpustate:=word(ptruint(sininfo));
+end;
+
+function getaltfpustate(sigcontext:psigcontextrec):longint; {inline;}
+begin
+  if assigned(sigcontext) then
+    getaltfpustate:=sigcontext^.sc_fpustate^.en_sw 
+  else
+    getaltfpustate:=0;
+end;
+{$endif}
+
+procedure SignalToRunerror(Sig: longint;sininfo:psiginfo; SigContext: PSigContextRec); public name '_FPC_DEFAULTSIGHANDLER'; cdecl;
+
+var
+  res,fpustate : word;
+begin
+  res:=0;
+{$ifdef BSD}
+{$ifdef cpui386}
+  fpustate:=0;
+  asm
+    fnstsw fpustate
+  end;
+{$endif cpui386}
+{$endif BSD}
+  case sig of
+    SIGFPE :
+          begin
+    { this is not allways necessary but I don't know yet
+      how to tell if it is or not PM }
+          res:=200;
+{$ifdef cpui386}
+          fpustate:=GetaltFPUState(sigcontext);
+{$else}
+          fpustate:=0;
+{$endif}
+          if (FpuState and FPU_All) <> 0 then
+            begin
+              { first check the more precise options }
+              if (FpuState and FPU_DivisionByZero)<>0 then
+                res:=200
+              else if (FpuState and FPU_Overflow)<>0 then
+                res:=205
+              else if (FpuState and FPU_Underflow)<>0 then
+                res:=206
+              else if (FpuState and FPU_Denormal)<>0 then
+                res:=216
+              else if (FpuState and (FPU_StackOverflow or FPU_StackUnderflow))<>0 then
+                res:=207
+              else if (FpuState and FPU_Invalid)<>0 then
+                res:=216
+              else
+                res:=207;  {'Coprocessor Error'}
+            end;
+          SysResetFPU;
+        end;
+    SIGILL,
+    SIGBUS,
+    SIGSEGV :
+        res:=216;
+    SIGINT:
+        res:=217;
+    SIGQUIT:
+        res:=233;
+  end;
+  reenable_signal(sig);
+{ give runtime error at the position where the signal was raised }
+  if res<>0 then
+   begin
+{$ifdef cpux86_64}
+      HandleErrorAddrFrame(res,pointer(SigContext^.sc_rip),pointer(SigContext^.sc_rbp));
+{$endif}
+   end;
+end;
+
+