xensetup.S 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Support routines for Xen
  3. *
  4. * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
  5. */
  6. #include <asm/processor.h>
  7. #include <asm/asmmacro.h>
  8. #include <asm/pgtable.h>
  9. #include <asm/paravirt.h>
  10. #include <asm/xen/privop.h>
  11. #include <linux/elfnote.h>
  12. #include <linux/init.h>
  13. #include <xen/interface/elfnote.h>
  14. .section .data..read_mostly
  15. .align 8
  16. .global xen_domain_type
  17. xen_domain_type:
  18. data4 XEN_NATIVE_ASM
  19. .previous
  20. __INIT
  21. ENTRY(startup_xen)
  22. // Calculate load offset.
  23. // The constant, LOAD_OFFSET, can't be used because the boot
  24. // loader doesn't always load to the LMA specified by the vmlinux.lds.
  25. mov r9=ip // must be the first instruction to make sure
  26. // that r9 = the physical address of startup_xen.
  27. // Usually r9 = startup_xen - LOAD_OFFSET
  28. movl r8=startup_xen
  29. ;;
  30. sub r9=r9,r8 // Usually r9 = -LOAD_OFFSET.
  31. mov r10=PARAVIRT_HYPERVISOR_TYPE_XEN
  32. movl r11=_start
  33. ;;
  34. add r11=r11,r9
  35. movl r8=hypervisor_type
  36. ;;
  37. add r8=r8,r9
  38. mov b0=r11
  39. ;;
  40. st8 [r8]=r10
  41. br.cond.sptk.many b0
  42. ;;
  43. END(startup_xen)
  44. ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "linux")
  45. ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz "2.6")
  46. ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz "xen-3.0")
  47. ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, data8.ua startup_xen - LOAD_OFFSET)
  48. #define isBP p3 // are we the Bootstrap Processor?
  49. GLOBAL_ENTRY(xen_setup_hook)
  50. mov r8=XEN_PV_DOMAIN_ASM
  51. (isBP) movl r9=xen_domain_type;;
  52. (isBP) st4 [r9]=r8
  53. movl r10=xen_ivt;;
  54. mov cr.iva=r10
  55. /* Set xsi base. */
  56. #define FW_HYPERCALL_SET_SHARED_INFO_VA 0x600
  57. (isBP) mov r2=FW_HYPERCALL_SET_SHARED_INFO_VA
  58. (isBP) movl r28=XSI_BASE;;
  59. (isBP) break 0x1000;;
  60. /* setup pv_ops */
  61. (isBP) mov r4=rp
  62. ;;
  63. (isBP) br.call.sptk.many rp=xen_setup_pv_ops
  64. ;;
  65. (isBP) mov rp=r4
  66. ;;
  67. br.ret.sptk.many rp
  68. ;;
  69. END(xen_setup_hook)