Subversion Repositories HelenOS

Rev

Rev 3743 | Rev 3783 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2008 Pavel Rimsky
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /** @addtogroup sparc64
  30.  * @{
  31.  */
  32. /**
  33.  * @file
  34.  * @brief   Macros, constants and functions needed to perform a call to the
  35.  *      hypervisor API. For details and terminology see this document:
  36.  *      UltraSPARC Virtual Machine Specification (The Hypervisor API
  37.  *      specification for Logical Domains).
  38.  *
  39.  */
  40.  
  41. #ifndef KERN_sparc64_sun4v_HYPERCALL_H_
  42. #define KERN_sparc64_sun4v_HYPERCALL_H_
  43.  
  44. /* SW trap numbers for hyperfast traps */
  45. #define FAST_TRAP       0x80
  46. #define MMU_MAP_ADDR        0x83
  47. #define MMU_UNMAP_ADDR      0x84
  48.  
  49. /* function codes for fast traps */
  50. #define MACH_DESC       0x01
  51. #define CPU_START       0x10
  52. #define CPU_STOP        0x11
  53. #define CPU_YIELD       0x12
  54. #define CPU_MYID        0x16
  55. #define CPU_STATE       0x17
  56. #define CPU_SET_RTBA        0x18
  57. #define CPU_GET_RTBA        0x19
  58. #define MMU_TSB_CTX0        0x20
  59. #define MMU_TSB_CTXNON0     0x21
  60. #define MMU_DEMAP_PAGE      0x22
  61. #define MMU_DEMAP_CTX       0x23
  62. #define MMU_DEMAP_ALL       0x24
  63. #define MMU_MAP_PERM_ADDR   0x25
  64. #define MMU_FAULT_AREA_CONF 0x26
  65. #define MMU_ENABLE      0x27
  66. #define MMU_UNMAP_PERM_ADDR 0x28
  67. #define MMU_TSB_CTX0_INFO   0x29
  68. #define MMU_TSB_CTXNON0_INFO    0x2a
  69. #define MMU_FAULT_AREA_INFO 0x2b
  70. #define CPU_MONDO_SEND      0x42
  71. #define CONS_GETCHAR        0x60
  72. #define CONS_PUTCHAR        0x61
  73.  
  74.  
  75. /* return codes */
  76. #define EOK     0   /**< Successful return */
  77. #define ENOCPU      1   /**< Invalid CPU id */
  78. #define ENORADDR    2   /**< Invalid real address */
  79. #define ENOINTR     3   /**< Invalid interrupt id */
  80. #define EBADPGSZ    4   /**< Invalid pagesize encoding */
  81. #define EBADTSB     5   /**< Invalid TSB description */
  82. #define EINVAL      6   /**< Invalid argument */
  83. #define EBADTRAP    7   /**< Invalid function number */
  84. #define EBADALIGN   8   /**< Invalid address alignment */
  85. #define EWOULDBLOCK 9   /**< Cannot complete operation without blocking */
  86. #define ENOACCESS   10  /**< No access to specified resource */
  87. #define EIO     11  /**< I/O Error */
  88. #define ECPUERROR   12  /**< CPU is in error state */
  89. #define ENOTSUPPORTED   13  /**< Function not supported */
  90. #define ENOMAP      14  /**< No mapping found */
  91. #define ETOOMANY    15  /**< Too many items specified / limit reached */
  92. #define ECHANNEL    16  /**< Invalid LDC channel */
  93. #define EBUSY       17  /**< Operation failed as resource is otherwise busy */
  94.  
  95.  
  96. /**
  97.  * Performs a hyperfast hypervisor API call from the assembly language code.
  98.  * Expects the registers %o1-%o4 are properly filled with the arguments of the
  99.  * call.
  100.  *
  101.  * @param function_number   hyperfast call function number
  102.  */
  103. #define __HYPERCALL_FAST(function_number) \
  104.     set function_number, %o5; \
  105.     ta FAST_TRAP;
  106.    
  107. /**
  108.  * Performs a fast hypervisor API call from the assembly language code.
  109.  * Expects the registers %o1-%o4 are properly filled with the arguments of the
  110.  * call.
  111.  *
  112.  * @param sw_trap_number    software trap number
  113.  */
  114. #define __HYPERCALL_HYPERFAST(sw_trap_number) \
  115.     ta (sw_trap_number);
  116.  
  117.  
  118. #ifndef __ASM__
  119.  
  120. /*
  121.  * Macros to be used from the C-language code; __hypercall_fastN performs
  122.  * a fast hypervisor API call taking exactly N arguments.
  123.  */
  124.  
  125. #define __hypercall_fast0(function_number) \
  126.     __hypercall_fast(0, 0, 0, 0, 0, function_number)
  127. #define __hypercall_fast1(function_number, p1) \
  128.     __hypercall_fast(p1, 0, 0, 0, 0, function_number)
  129. #define __hypercall_fast2(function_number, p1, p2) \
  130.     __hypercall_fast(p1, p2, 0, 0, 0, function_number)
  131. #define __hypercall_fast3(function_number, p1, p2, p3) \
  132.     __hypercall_fast(p1, p2, p3, 0, 0, function_number)
  133. #define __hypercall_fast4(function_number, p1, p2, p3, p4) \
  134.     __hypercall_fast(p1, p2, p3, p4, 0, function_number)
  135. #define __hypercall_fast5(function_number, p1, p2, p3, p4, p5) \
  136.     __hypercall_fast(p1, p2, p3, p4, p5, function_number)
  137.  
  138. /**
  139.  * Performs a fast hypervisor API call which can returns a value.
  140.  *
  141.  * @param p1            the 1st argument of the hypervisor API call
  142.  * @param p2            the 2nd argument of the hypervisor API call
  143.  * @param p3            the 3rd argument of the hypervisor API call
  144.  * @param p4            the 4th argument of the hypervisor API call
  145.  * @param p5            the 5th argument of the hypervisor API call
  146.  * @param function_number   function number of the call
  147.  * @param ret1          pointer to an address where the return value
  148.  *              of the hypercall should be saved, or NULL
  149.  * @return          error status
  150.  */
  151. static inline uint64_t
  152. __hypercall_fast_ret1(const uint64_t p1, const uint64_t p2, const uint64_t p3,
  153.     const uint64_t p4, const uint64_t p5, const uint64_t function_number,
  154.     uint64_t * const ret1)
  155. {
  156.     register uint64_t a6 asm("o5") = function_number;
  157.     register uint64_t a1 asm("o0") = p1;
  158.     register uint64_t a2 asm("o1") = p2;
  159.     register uint64_t a3 asm("o2") = p3;
  160.     register uint64_t a4 asm("o3") = p4;
  161.     register uint64_t a5 asm("o4") = p5;
  162.  
  163.     asm volatile (
  164.         "ta %7\n"
  165.         : "=r" (a1)
  166.         : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6),
  167.           "i" (FAST_TRAP)
  168.         : "memory"
  169.     );
  170.    
  171.     if (ret1 != NULL)
  172.         *ret1 = a2;
  173.     return a1;
  174. }
  175.  
  176. /**
  177.  * Performs a fast hypervisor API call which return no value except for the
  178.  * error status.
  179.  *
  180.  * @param p1            the 1st argument of the hypervisor API call
  181.  * @param p2            the 2nd argument of the hypervisor API call
  182.  * @param p3            the 3rd argument of the hypervisor API call
  183.  * @param p4            the 4th argument of the hypervisor API call
  184.  * @param p5            the 5th argument of the hypervisor API call
  185.  * @param function_number   function number of the call
  186.  * @return          error status
  187.  */
  188. static inline uint64_t
  189. __hypercall_fast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
  190.     const uint64_t p4, const uint64_t p5, const uint64_t function_number)
  191. {
  192.     return __hypercall_fast_ret1(p1, p2, p3, p4, p5, function_number,
  193.                      NULL);
  194. }
  195.  
  196. /**
  197.  * Performs a hyperfast hypervisor API call.
  198.  *
  199.  * @param p1            the 1st argument of the hypervisor API call
  200.  * @param p2            the 2nd argument of the hypervisor API call
  201.  * @param p3            the 3rd argument of the hypervisor API call
  202.  * @param p4            the 4th argument of the hypervisor API call
  203.  * @param p5            the 5th argument of the hypervisor API call
  204.  * @param sw_trap_number    software trap number
  205.  */
  206. static inline uint64_t
  207. __hypercall_hyperfast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
  208.     const uint64_t p4, const uint64_t p5, const uint64_t sw_trap_number)
  209. {
  210.     register uint64_t a1 asm("o0") = p1;
  211.     register uint64_t a2 asm("o1") = p2;
  212.     register uint64_t a3 asm("o2") = p3;
  213.     register uint64_t a4 asm("o3") = p4;
  214.     register uint64_t a5 asm("o4") = p5;
  215.  
  216.     asm volatile (
  217.         "ta %6\n"
  218.         : "=r" (a1)
  219.         : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5),
  220.           "i" (sw_trap_number)
  221.         : "memory"
  222.     );
  223.    
  224.     return a1;
  225. }
  226.  
  227. #endif /* ASM */
  228.  
  229. #endif
  230.  
  231. /** @}
  232.  */
  233.