1/*
2 * GPR context switch between host and guest.
3 * Used by IO-port-access emulation stub.
4 *
5 * Copyright (c) 2006, Novell, Inc.
6 */
7
8        .file __FILE__
9
10#include <asm/asm_defns.h>
11
12ENTRY(host_to_guest_gpr_switch)
13        movq  (%rsp), %rcx
14        movq  %rdi, (%rsp)
15        movq  UREGS_rdx(%rdi), %rdx
16        pushq %rbx
17        movq  UREGS_rax(%rdi), %rax
18        movq  UREGS_rbx(%rdi), %rbx
19        pushq %rbp
20        movq  UREGS_rsi(%rdi), %rsi
21        movq  UREGS_rbp(%rdi), %rbp
22        pushq %r12
23        movq  UREGS_r8(%rdi), %r8
24        movq  UREGS_r12(%rdi), %r12
25        pushq %r13
26        movq  UREGS_r9(%rdi), %r9
27        movq  UREGS_r13(%rdi), %r13
28        pushq %r14
29        movq  UREGS_r10(%rdi), %r10
30        movq  UREGS_r14(%rdi), %r14
31        pushq %r15
32        movq  UREGS_r11(%rdi), %r11
33        movq  UREGS_r15(%rdi), %r15
34        pushq %rcx /* dummy push, filled by guest_to_host_gpr_switch pointer */
35        pushq %rcx
36        leaq  guest_to_host_gpr_switch(%rip),%rcx
37        movq  %rcx,8(%rsp)
38        movq  UREGS_rcx(%rdi), %rcx
39        movq  UREGS_rdi(%rdi), %rdi
40        ret
41
42ENTRY(guest_to_host_gpr_switch)
43        pushq %rdi
44        movq  7*8(%rsp), %rdi
45        movq  %rax, UREGS_rax(%rdi)
46        popq  UREGS_rdi(%rdi)
47        movq  %r15, UREGS_r15(%rdi)
48        movq  %r11, UREGS_r11(%rdi)
49        popq  %r15
50        movq  %r14, UREGS_r14(%rdi)
51        movq  %r10, UREGS_r10(%rdi)
52        popq  %r14
53        movq  %r13, UREGS_r13(%rdi)
54        movq  %r9, UREGS_r9(%rdi)
55        popq  %r13
56        movq  %r12, UREGS_r12(%rdi)
57        movq  %r8, UREGS_r8(%rdi)
58        popq  %r12
59        movq  %rbp, UREGS_rbp(%rdi)
60        movq  %rsi, UREGS_rsi(%rdi)
61        popq  %rbp
62        movq  %rbx, UREGS_rbx(%rdi)
63        movq  %rdx, UREGS_rdx(%rdi)
64        popq  %rbx
65        movq  %rcx, UREGS_rcx(%rdi)
66        popq  %rcx
67        ret
68