Subversion Repositories HelenOS

Rev

Rev 1831 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Martin Decky
  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. #ifndef __xen32_HYPERCALL_H__
  30. #define __xen32_HYPERCALL_H__
  31.  
  32. #include <arch/types.h>
  33. #include <macros.h>
  34.  
  35.  
  36. typedef uint16_t domid_t;
  37.  
  38.  
  39. typedef struct {
  40.     uint8_t vector;     /**< Exception vector */
  41.     uint8_t flags;      /**< 0-3: privilege level; 4: clear event enable */
  42.     uint16_t cs;        /**< Code selector */
  43.     void *address;      /**< Code offset */
  44. } trap_info_t;
  45.  
  46.  
  47. typedef struct {
  48.     evtchn_t port;
  49. } evtchn_send_t;
  50.  
  51. typedef struct {
  52.     uint32_t cmd;
  53.     union {
  54.         evtchn_send_t send;
  55.     };
  56. } evtchn_op_t;
  57.  
  58.  
  59. #define XEN_SET_TRAP_TABLE      0
  60. #define XEN_MMU_UPDATE          1
  61. #define XEN_SET_CALLBACKS       4
  62. #define XEN_UPDATE_VA_MAPPING   14
  63. #define XEN_EVENT_CHANNEL_OP    16
  64. #define XEN_VERSION             17
  65. #define XEN_CONSOLE_IO          18
  66. #define XEN_VM_ASSIST           21
  67. #define XEN_MMUEXT_OP           26
  68.  
  69.  
  70. /*
  71.  * Commands for XEN_CONSOLE_IO
  72.  */
  73. #define CONSOLE_IO_WRITE    0
  74. #define CONSOLE_IO_READ     1
  75.  
  76.  
  77. #define MMUEXT_PIN_L1_TABLE      0
  78. #define MMUEXT_PIN_L2_TABLE      1
  79. #define MMUEXT_PIN_L3_TABLE      2
  80. #define MMUEXT_PIN_L4_TABLE      3
  81. #define MMUEXT_UNPIN_TABLE       4
  82. #define MMUEXT_NEW_BASEPTR       5
  83. #define MMUEXT_TLB_FLUSH_LOCAL   6
  84. #define MMUEXT_INVLPG_LOCAL      7
  85. #define MMUEXT_TLB_FLUSH_MULTI   8
  86. #define MMUEXT_INVLPG_MULTI      9
  87. #define MMUEXT_TLB_FLUSH_ALL    10
  88. #define MMUEXT_INVLPG_ALL       11
  89. #define MMUEXT_FLUSH_CACHE      12
  90. #define MMUEXT_SET_LDT          13
  91. #define MMUEXT_NEW_USER_BASEPTR 15
  92.  
  93.  
  94. #define EVTCHNOP_SEND           4
  95.  
  96.  
  97. #define UVMF_NONE               0        /**< No flushing at all */
  98. #define UVMF_TLB_FLUSH          1        /**< Flush entire TLB(s) */
  99. #define UVMF_INVLPG             2        /**< Flush only one entry */
  100. #define UVMF_FLUSHTYPE_MASK     3
  101. #define UVMF_MULTI              0        /**< Flush subset of TLBs */
  102. #define UVMF_LOCAL              0        /**< Flush local TLB */
  103. #define UVMF_ALL                (1 << 2) /**< Flush all TLBs */
  104.  
  105.  
  106. /*
  107.  * Commands to XEN_VM_ASSIST
  108.  */
  109. #define VMASST_CMD_ENABLE               0
  110. #define VMASST_CMD_DISABLE              1
  111. #define VMASST_TYPE_4GB_SEGMENTS        0
  112. #define VMASST_TYPE_4GB_SEGMENTS_NOTIFY 1
  113. #define VMASST_TYPE_WRITABLE_PAGETABLES 2
  114.  
  115.  
  116. #define DOMID_SELF (0x7FF0U)
  117. #define DOMID_IO   (0x7FF1U)
  118.  
  119.  
  120. #define force_evtchn_callback() ((void) xen_version(0, 0))
  121.  
  122. #define hypercall0(id)  \
  123.     ({  \
  124.         unative_t ret;  \
  125.         asm volatile (  \
  126.             "call hypercall_page + (" STRING(id) " * 32)\n" \
  127.             : "=a" (ret)    \
  128.             :   \
  129.             : "memory"  \
  130.         );  \
  131.         ret;    \
  132.     })
  133.  
  134. #define hypercall1(id, p1)  \
  135.     ({  \
  136.         unative_t ret, __ign1;  \
  137.         asm volatile (  \
  138.             "call hypercall_page + (" STRING(id) " * 32)\n" \
  139.             : "=a" (ret), \
  140.               "=b" (__ign1) \
  141.             : "1" (p1)  \
  142.             : "memory"  \
  143.         );  \
  144.         ret;    \
  145.     })
  146.  
  147. #define hypercall2(id, p1, p2)  \
  148.     ({  \
  149.         unative_t ret, __ign1, __ign2;  \
  150.         asm volatile (  \
  151.             "call hypercall_page + (" STRING(id) " * 32)\n" \
  152.             : "=a" (ret), \
  153.               "=b" (__ign1),    \
  154.               "=c" (__ign2) \
  155.             : "1" (p1), \
  156.               "2" (p2)  \
  157.             : "memory"  \
  158.         );  \
  159.         ret;    \
  160.     })
  161.  
  162. #define hypercall3(id, p1, p2, p3)  \
  163.     ({  \
  164.         unative_t ret, __ign1, __ign2, __ign3;  \
  165.         asm volatile (  \
  166.             "call hypercall_page + (" STRING(id) " * 32)\n" \
  167.             : "=a" (ret), \
  168.               "=b" (__ign1),    \
  169.               "=c" (__ign2),    \
  170.               "=d" (__ign3) \
  171.             : "1" (p1), \
  172.               "2" (p2), \
  173.               "3" (p3)  \
  174.             : "memory"  \
  175.         );  \
  176.         ret;    \
  177.     })
  178.  
  179. #define hypercall4(id, p1, p2, p3, p4)  \
  180.     ({  \
  181.         unative_t ret, __ign1, __ign2, __ign3, __ign4;  \
  182.         asm volatile (  \
  183.             "call hypercall_page + (" STRING(id) " * 32)\n" \
  184.             : "=a" (ret), \
  185.               "=b" (__ign1),    \
  186.               "=c" (__ign2),    \
  187.               "=d" (__ign3),    \
  188.               "=S" (__ign4) \
  189.             : "1" (p1), \
  190.               "2" (p2), \
  191.               "3" (p3), \
  192.               "4" (p4)  \
  193.             : "memory"  \
  194.         );  \
  195.         ret;    \
  196.     })
  197.  
  198. #define hypercall5(id, p1, p2, p3, p4, p5)  \
  199.     ({  \
  200.         unative_t ret, __ign1, __ign2, __ign3, __ign4, __ign5;  \
  201.         asm volatile (  \
  202.             "call hypercall_page + (" STRING(id) " * 32)\n" \
  203.             : "=a" (ret), \
  204.               "=b" (__ign1),    \
  205.               "=c" (__ign2),    \
  206.               "=d" (__ign3),    \
  207.               "=S" (__ign4),    \
  208.               "=D" (__ign5) \
  209.             : "1" (p1), \
  210.               "2" (p2), \
  211.               "3" (p3), \
  212.               "4" (p4), \
  213.               "5" (p5)  \
  214.             : "memory"  \
  215.         );  \
  216.         ret;    \
  217.     })
  218.  
  219.  
  220. static inline int xen_console_io(const unsigned int cmd, const unsigned int count, const char *str)
  221. {
  222.     return hypercall3(XEN_CONSOLE_IO, cmd, count, str);
  223. }
  224.  
  225. static inline int xen_vm_assist(const unsigned int cmd, const unsigned int type)
  226. {
  227.     return hypercall2(XEN_VM_ASSIST, cmd, type);
  228. }
  229.  
  230. static inline int xen_set_callbacks(const unsigned int event_selector, const void *event_address, const unsigned int failsafe_selector, void *failsafe_address)
  231. {
  232.     return hypercall4(XEN_SET_CALLBACKS, event_selector, event_address, failsafe_selector, failsafe_address);
  233. }
  234.  
  235. static inline int xen_set_trap_table(const trap_info_t *table)
  236. {
  237.     return hypercall1(XEN_SET_TRAP_TABLE, table);
  238. }
  239.  
  240. static inline int xen_version(const unsigned int cmd, const void *arg)
  241. {
  242.     return hypercall2(XEN_VERSION, cmd, arg);
  243. }
  244.  
  245. static inline int xen_notify_remote(evtchn_t channel)
  246. {
  247.     evtchn_op_t op;
  248.    
  249.     op.cmd = EVTCHNOP_SEND;
  250.     op.send.port = channel;
  251.     return hypercall1(XEN_EVENT_CHANNEL_OP, &op);
  252. }
  253.  
  254. #endif
  255.