Subversion Repositories HelenOS

Rev

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. #include <typedefs.h>
  121. #include <arch/types.h>
  122.  
  123. /*
  124.  * Macros to be used from the C-language code; __hypercall_fastN performs
  125.  * a fast hypervisor API call taking exactly N arguments.
  126.  */
  127.  
  128. #define __hypercall_fast0(function_number) \
  129.     __hypercall_fast(0, 0, 0, 0, 0, function_number)
  130. #define __hypercall_fast1(function_number, p1) \
  131.     __hypercall_fast(p1, 0, 0, 0, 0, function_number)
  132. #define __hypercall_fast2(function_number, p1, p2) \
  133.     __hypercall_fast(p1, p2, 0, 0, 0, function_number)
  134. #define __hypercall_fast3(function_number, p1, p2, p3) \
  135.     __hypercall_fast(p1, p2, p3, 0, 0, function_number)
  136. #define __hypercall_fast4(function_number, p1, p2, p3, p4) \
  137.     __hypercall_fast(p1, p2, p3, p4, 0, function_number)
  138. #define __hypercall_fast5(function_number, p1, p2, p3, p4, p5) \
  139.     __hypercall_fast(p1, p2, p3, p4, p5, function_number)
  140.  
  141. /**
  142.  * Performs a fast hypervisor API call which returns no value except for the
  143.  * error status.
  144.  *
  145.  * @param p1            the 1st argument of the hypervisor API call
  146.  * @param p2            the 2nd argument of the hypervisor API call
  147.  * @param p3            the 3rd argument of the hypervisor API call
  148.  * @param p4            the 4th argument of the hypervisor API call
  149.  * @param p5            the 5th argument of the hypervisor API call
  150.  * @param function_number   function number of the call
  151.  * @return          error status
  152.  */
  153. static inline uint64_t
  154. __hypercall_fast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
  155.     const uint64_t p4, const uint64_t p5, const uint64_t function_number)
  156. {
  157.     register uint64_t a6 asm("o5") = function_number;
  158.     register uint64_t a1 asm("o0") = p1;
  159.     register uint64_t a2 asm("o1") = p2;
  160.     register uint64_t a3 asm("o2") = p3;
  161.     register uint64_t a4 asm("o3") = p4;
  162.     register uint64_t a5 asm("o4") = p5;
  163.  
  164.     asm volatile (
  165.         "ta %7\n"
  166.         : "=r" (a1)
  167.         : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6),
  168.           "i" (FAST_TRAP)
  169.         : "memory"
  170.     );
  171.  
  172.     return a1;
  173. }
  174.  
  175. /**
  176.  * Performs a fast hypervisor API call which can return a value.
  177.  *
  178.  * @param p1            the 1st argument of the hypervisor API call
  179.  * @param p2            the 2nd argument of the hypervisor API call
  180.  * @param p3            the 3rd argument of the hypervisor API call
  181.  * @param p4            the 4th argument of the hypervisor API call
  182.  * @param p5            the 5th argument of the hypervisor API call
  183.  * @param function_number   function number of the call
  184.  * @param ret1          pointer to an address where the return value
  185.  *              of the hypercall should be saved, or NULL
  186.  * @return          error status
  187.  */
  188. static inline uint64_t
  189. __hypercall_fast_ret1(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.     uint64_t * const ret1)
  192. {
  193.     uint64_t errno = __hypercall_fast(p1, p2, p3, p4, p5, function_number);
  194.     if (ret1 != NULL) {
  195.         asm volatile ("mov %%o1, %0\n" : "=r" (*ret1));
  196.     }
  197.     return errno;
  198. }
  199.  
  200. /**
  201.  * Performs a hyperfast hypervisor API call.
  202.  *
  203.  * @param p1            the 1st argument of the hypervisor API call
  204.  * @param p2            the 2nd argument of the hypervisor API call
  205.  * @param p3            the 3rd argument of the hypervisor API call
  206.  * @param p4            the 4th argument of the hypervisor API call
  207.  * @param p5            the 5th argument of the hypervisor API call
  208.  * @param sw_trap_number    software trap number
  209.  */
  210. static inline uint64_t
  211. __hypercall_hyperfast(const uint64_t p1, const uint64_t p2, const uint64_t p3,
  212.     const uint64_t p4, const uint64_t p5, const uint64_t sw_trap_number)
  213. {
  214.     register uint64_t a1 asm("o0") = p1;
  215.     register uint64_t a2 asm("o1") = p2;
  216.     register uint64_t a3 asm("o2") = p3;
  217.     register uint64_t a4 asm("o3") = p4;
  218.     register uint64_t a5 asm("o4") = p5;
  219.  
  220.     asm volatile (
  221.         "ta %6\n"
  222.         : "=r" (a1)
  223.         : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5),
  224.           "i" (sw_trap_number)
  225.         : "memory"
  226.     );
  227.    
  228.     return a1;
  229. }
  230.  
  231. #endif /* ASM */
  232.  
  233. #endif
  234.  
  235. /** @}
  236.  */
  237.