X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Femul%2Fswitch_x86_64.s;h=ea76d2c98ed9d1246652f3aac29f1ad2152c0f19;hb=7911a6f01bc8a19f220f98e2fdc8595f65996853;hp=1632c816d4b01512c7fb554043aed9d7b8a259aa;hpb=2f1343e2774ac66a35c63ee90535265d67c78feb;p=bertos.git diff --git a/bertos/emul/switch_x86_64.s b/bertos/emul/switch_x86_64.s index 1632c816..ea76d2c9 100644 --- a/bertos/emul/switch_x86_64.s +++ b/bertos/emul/switch_x86_64.s @@ -30,29 +30,43 @@ * Copyright 1999, 2000, 2001 Bernie Innocenti * --> * - * \version $Id$ * \author Bernie Innocenti * - * \brief i386 context switch + * \brief x86_64 context switch + * + * x86_64 function call convention: + * -------------------------------- + * arguments | callee-saved | extra caller-saved | return + * [callee-clobbered] | | [callee-clobbered] | + * ------------------------------------------------------------------------- + * rdi rsi rdx rcx r8-9 | rbx rbp [*] r12-15 | r10-11 | rax, rdx + * + * [*] In the frame-pointers case rbp must hold a base address for the + * current stack frame. + * + * asm_switch_context() can be considered as a normal function call, so we need + * to save all the callee-clobbered registers minus the return registers. */ /* void asm_switch_context(void **new_sp [%rdi], void **save_sp [%rsi]) */ .globl asm_switch_context asm_switch_context: - pushq %rax - pushq %rbx - pushq %rcx - pushq %rdx - pushq %rsi - pushq %rdi pushq %rbp + pushq %rdi + pushq %rsi + pushq %rcx + pushq %r8 + pushq %r9 + pushq %r10 + pushq %r11 movq %rsp,(%rsi) /* *save_sp = rsp */ movq (%rdi),%rsp /* rsp = *new_sp */ - popq %rbp - popq %rdi - popq %rsi - popq %rdx + popq %r11 + popq %r10 + popq %r9 + popq %r8 popq %rcx - popq %rbx - popq %rax + popq %rsi + popq %rdi + popq %rbp ret