kvm_emul.S 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License, version 2, as
  4. * published by the Free Software Foundation.
  5. *
  6. * This program is distributed in the hope that it will be useful,
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. * GNU General Public License for more details.
  10. *
  11. * You should have received a copy of the GNU General Public License
  12. * along with this program; if not, write to the Free Software
  13. * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  14. *
  15. * Copyright SUSE Linux Products GmbH 2010
  16. *
  17. * Authors: Alexander Graf <agraf@suse.de>
  18. */
  19. #include <asm/ppc_asm.h>
  20. #include <asm/kvm_asm.h>
  21. #include <asm/reg.h>
  22. #include <asm/page.h>
  23. #include <asm/asm-offsets.h>
  24. /* Hypercall entry point. Will be patched with device tree instructions. */
  25. .global kvm_hypercall_start
  26. kvm_hypercall_start:
  27. li r3, -1
  28. nop
  29. nop
  30. nop
  31. blr
  32. #define KVM_MAGIC_PAGE (-4096)
  33. #ifdef CONFIG_64BIT
  34. #define LL64(reg, offs, reg2) ld reg, (offs)(reg2)
  35. #define STL64(reg, offs, reg2) std reg, (offs)(reg2)
  36. #else
  37. #define LL64(reg, offs, reg2) lwz reg, (offs + 4)(reg2)
  38. #define STL64(reg, offs, reg2) stw reg, (offs + 4)(reg2)
  39. #endif
  40. #define SCRATCH_SAVE \
  41. /* Enable critical section. We are critical if \
  42. shared->critical == r1 */ \
  43. STL64(r1, KVM_MAGIC_PAGE + KVM_MAGIC_CRITICAL, 0); \
  44. \
  45. /* Save state */ \
  46. PPC_STL r31, (KVM_MAGIC_PAGE + KVM_MAGIC_SCRATCH1)(0); \
  47. PPC_STL r30, (KVM_MAGIC_PAGE + KVM_MAGIC_SCRATCH2)(0); \
  48. mfcr r31; \
  49. stw r31, (KVM_MAGIC_PAGE + KVM_MAGIC_SCRATCH3)(0);
  50. #define SCRATCH_RESTORE \
  51. /* Restore state */ \
  52. PPC_LL r31, (KVM_MAGIC_PAGE + KVM_MAGIC_SCRATCH1)(0); \
  53. lwz r30, (KVM_MAGIC_PAGE + KVM_MAGIC_SCRATCH3)(0); \
  54. mtcr r30; \
  55. PPC_LL r30, (KVM_MAGIC_PAGE + KVM_MAGIC_SCRATCH2)(0); \
  56. \
  57. /* Disable critical section. We are critical if \
  58. shared->critical == r1 and r2 is always != r1 */ \
  59. STL64(r2, KVM_MAGIC_PAGE + KVM_MAGIC_CRITICAL, 0);