a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync; $Id$
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync;; @file
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync; IPRT - No-CRT setjmp & longjmp - AMD64 & X86.
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync;
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync;
c58f1213e628a545081c70e26c6b67a841cff880vboxsync; Copyright (C) 2006-2010 Oracle Corporation
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; The contents of this file may alternatively be used under the terms
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; of the Common Development and Distribution License Version 1.0
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; VirtualBox OSE distribution, in which case the provisions of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; CDDL are applicable instead of those of the GPL.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; You may elect to license modified versions of this file under the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync; terms and conditions of either the GPL or the CDDL or both.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync;
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%include "iprt/asmdefs.mac"
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsyncBEGINCODE
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync;;
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync; @param x86:[esp+4] msc:rcx gcc:rdi The jump buffer pointer.
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsyncBEGINPROC RT_NOCRT(setjmp)
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%ifdef RT_ARCH_AMD64
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %ifndef ASM_CALL64_MSC
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rcx, rdi
17236a4bcee82c7fa86f55ef3deaa9cdaa7aefb0vboxsync %endif
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync mov rax, [rsp]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 0h*8], rax ; 0 - rip
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync lea rdx, [rsp + 8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 1h*8], rdx ; 1 - rsp
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 2h*8], rbp
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 3h*8], r15
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 4h*8], r14
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 5h*8], r13
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 6h*8], r12
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 7h*8], rbx
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %ifdef ASM_CALL64_MSC
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 8h*8], rsi
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [rcx + 9h*8], rdi
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 0ah*8], xmm6
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 0ch*8], xmm7
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 0eh*8], xmm8
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 10h*8], xmm9
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 12h*8], xmm10
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 14h*8], xmm11
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 16h*8], xmm12
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 18h*8], xmm13
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 1ah*8], xmm14
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa [rcx + 1ch*8], xmm15
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %ifndef RT_OS_WINDOWS
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %error "Fix setjmp.h"
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %endif
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %endif
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%else
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync mov edx, [esp + 4h]
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync mov eax, [esp]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [edx + 0h*4], eax ; eip
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync lea ecx, [esp + 4h]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [edx + 1h*4], ecx ; esp
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [edx + 2h*4], ebp
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [edx + 3h*4], ebx
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [edx + 4h*4], edi
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov [edx + 5h*4], esi
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%endif
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync xor eax, eax
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync ret
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsyncENDPROC RT_NOCRT(setjmp)
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync;;
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync; @param x86:[esp+4] msc:rcx gcc:rdi The jump buffer pointer.
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync; @param x86:[esp+8] msc:rdx gcc:rsi Return value.
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsyncBEGINPROC RT_NOCRT(longjmp)
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%ifdef RT_ARCH_AMD64
17236a4bcee82c7fa86f55ef3deaa9cdaa7aefb0vboxsync %ifdef ASM_CALL64_MSC
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov eax, edx ; ret
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %else
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rcx, rdi ; jmp_buf
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov eax, esi ; ret
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %endif
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rbp, [rcx + 2h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov r15, [rcx + 3h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov r14, [rcx + 4h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov r13, [rcx + 5h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov r12, [rcx + 6h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rbx, [rcx + 7h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %ifdef ASM_CALL64_MSC
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rsi, [rcx + 8h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rdi, [rcx + 9h*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm6, [rcx + 0ah*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm7, [rcx + 0ch*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm8, [rcx + 0eh*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm9, [rcx + 10h*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm10, [rcx + 12h*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm11, [rcx + 14h*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm12, [rcx + 16h*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm13, [rcx + 18h*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm14, [rcx + 1ah*8]
4137127a66ddfcee9cba4a699988af6c27ad2720vboxsync movdqa xmm15, [rcx + 1ch*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %ifndef RT_OS_WINDOWS
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %error "Fix setjmp.h"
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync %endif
17236a4bcee82c7fa86f55ef3deaa9cdaa7aefb0vboxsync %endif
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync test eax, eax
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync jnz .fine
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync inc al
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync.fine:
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov rsp, [rcx + 1h*8]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync jmp qword [rcx + 0h*8]
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%else
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov edx, [esp + 4h] ; jmp_buf
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov eax, [esp + 8h] ; ret
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov esi, [edx + 5h*4]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov edi, [edx + 4h*4]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov ebx, [edx + 3h*4]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov ebp, [edx + 2h*4]
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync test eax, eax
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync jnz .fine
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync inc al
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync.fine:
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync mov esp, [edx + 1h*4]
a9dd9ab5c5c59b478410917e2091ec2d3349d3c7vboxsync jmp dword [edx+ 0h*4]
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync%endif
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsyncENDPROC RT_NOCRT(longjmp)
a0b54ffecf8bb5bfb4f335cfa5deb6815c66e8b6vboxsync