diff --git a/.gitattributes b/.gitattributes index ec4975b68d..d4b020fcf8 100644 --- a/.gitattributes +++ b/.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 diff --git a/rtl/openbsd/x86_64/bsyscall.inc b/rtl/openbsd/x86_64/bsyscall.inc new file mode 100644 index 0000000000..624654ec57 --- /dev/null +++ b/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. + + **********************************************************************} + diff --git a/rtl/openbsd/x86_64/cprt0.as b/rtl/openbsd/x86_64/cprt0.as new file mode 100644 index 0000000000..50a46bcff0 --- /dev/null +++ b/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 " diff --git a/rtl/openbsd/x86_64/crt0.s b/rtl/openbsd/x86_64/crt0.s new file mode 100644 index 0000000000..301b7bea45 --- /dev/null +++ b/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 " diff --git a/rtl/openbsd/x86_64/gprt0.as b/rtl/openbsd/x86_64/gprt0.as new file mode 100644 index 0000000000..50a46bcff0 --- /dev/null +++ b/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 " diff --git a/rtl/openbsd/x86_64/prt0.as b/rtl/openbsd/x86_64/prt0.as new file mode 100644 index 0000000000..2fa99fce1d --- /dev/null +++ b/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 " diff --git a/rtl/openbsd/x86_64/sighnd.inc b/rtl/openbsd/x86_64/sighnd.inc new file mode 100644 index 0000000000..fa3d125b77 --- /dev/null +++ b/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; + +