Home | History | Annotate | Line # | Download | only in include
xen.h revision 1.8.2.4
      1  1.8.2.4  skrll /*	$NetBSD: xen.h,v 1.8.2.4 2004/09/21 13:24:37 skrll Exp $	*/
      2  1.8.2.2  skrll 
      3  1.8.2.2  skrll /*
      4  1.8.2.2  skrll  *
      5  1.8.2.2  skrll  * Copyright (c) 2003, 2004 Keir Fraser (on behalf of the Xen team)
      6  1.8.2.2  skrll  * All rights reserved.
      7  1.8.2.2  skrll  *
      8  1.8.2.2  skrll  * Permission is hereby granted, free of charge, to any person obtaining a copy
      9  1.8.2.2  skrll  * of this software and associated documentation files (the "Software"), to
     10  1.8.2.2  skrll  * deal in the Software without restriction, including without limitation the
     11  1.8.2.2  skrll  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     12  1.8.2.2  skrll  * sell copies of the Software, and to permit persons to whom the Software is
     13  1.8.2.2  skrll  * furnished to do so, subject to the following conditions:
     14  1.8.2.2  skrll  *
     15  1.8.2.2  skrll  * The above copyright notice and this permission notice shall be included in
     16  1.8.2.2  skrll  * all copies or substantial portions of the Software.
     17  1.8.2.2  skrll  *
     18  1.8.2.2  skrll  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19  1.8.2.2  skrll  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  1.8.2.2  skrll  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     21  1.8.2.2  skrll  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     22  1.8.2.2  skrll  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     23  1.8.2.2  skrll  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     24  1.8.2.2  skrll  * DEALINGS IN THE SOFTWARE.
     25  1.8.2.2  skrll  */
     26  1.8.2.2  skrll 
     27  1.8.2.2  skrll 
     28  1.8.2.2  skrll #ifndef _XEN_H
     29  1.8.2.2  skrll #define _XEN_H
     30  1.8.2.2  skrll 
     31  1.8.2.2  skrll #ifndef _LOCORE
     32  1.8.2.2  skrll 
     33  1.8.2.2  skrll struct xen_netinfo {
     34  1.8.2.2  skrll 	uint32_t xi_ifno;
     35  1.8.2.2  skrll 	char *xi_root;
     36  1.8.2.2  skrll 	uint32_t xi_ip[5];
     37  1.8.2.2  skrll };
     38  1.8.2.2  skrll 
     39  1.8.2.2  skrll union xen_cmdline_parseinfo {
     40  1.8.2.2  skrll 	char			xcp_bootdev[16]; /* sizeof(dv_xname) */
     41  1.8.2.2  skrll 	struct xen_netinfo	xcp_netinfo;
     42  1.8.2.2  skrll 	char			xcp_console[16];
     43  1.8.2.2  skrll };
     44  1.8.2.2  skrll 
     45  1.8.2.2  skrll #define	XEN_PARSE_BOOTDEV	0
     46  1.8.2.2  skrll #define	XEN_PARSE_NETINFO	1
     47  1.8.2.2  skrll #define	XEN_PARSE_CONSOLE	2
     48  1.8.2.2  skrll 
     49  1.8.2.2  skrll void	xen_parse_cmdline(int, union xen_cmdline_parseinfo *);
     50  1.8.2.2  skrll 
     51  1.8.2.2  skrll void	xenconscn_attach(void);
     52  1.8.2.2  skrll 
     53  1.8.2.2  skrll void	xenmachmem_init(void);
     54  1.8.2.2  skrll void	xenprivcmd_init(void);
     55  1.8.2.2  skrll void	xenvfr_init(void);
     56  1.8.2.2  skrll 
     57  1.8.2.2  skrll #ifdef XENDEBUG
     58  1.8.2.2  skrll void printk(const char *, ...);
     59  1.8.2.2  skrll void vprintk(const char *, va_list);
     60  1.8.2.2  skrll #endif
     61  1.8.2.2  skrll 
     62  1.8.2.2  skrll #endif
     63  1.8.2.2  skrll 
     64  1.8.2.2  skrll #define hypervisor_asm_ack(num) \
     65  1.8.2.2  skrll 	movl	HYPERVISOR_shared_info,%eax		;\
     66  1.8.2.2  skrll 	lock						;\
     67  1.8.2.2  skrll 	btsl	$num,EVENTS_MASK(%eax)
     68  1.8.2.2  skrll 
     69  1.8.2.2  skrll #endif /* _XEN_H */
     70  1.8.2.2  skrll 
     71  1.8.2.2  skrll /******************************************************************************
     72  1.8.2.2  skrll  * os.h
     73  1.8.2.2  skrll  *
     74  1.8.2.2  skrll  * random collection of macros and definition
     75  1.8.2.2  skrll  */
     76  1.8.2.2  skrll 
     77  1.8.2.2  skrll #ifndef _OS_H_
     78  1.8.2.2  skrll #define _OS_H_
     79  1.8.2.2  skrll 
     80  1.8.2.2  skrll /*
     81  1.8.2.2  skrll  * These are the segment descriptors provided for us by the hypervisor.
     82  1.8.2.2  skrll  * For now, these are hardwired -- guest OSes cannot update the GDT
     83  1.8.2.2  skrll  * or LDT.
     84  1.8.2.2  skrll  *
     85  1.8.2.2  skrll  * It shouldn't be hard to support descriptor-table frobbing -- let me
     86  1.8.2.2  skrll  * know if the BSD or XP ports require flexibility here.
     87  1.8.2.2  skrll  */
     88  1.8.2.2  skrll 
     89  1.8.2.2  skrll 
     90  1.8.2.2  skrll /*
     91  1.8.2.2  skrll  * these are also defined in hypervisor-if.h but can't be pulled in as
     92  1.8.2.2  skrll  * they are used in start of day assembly. Need to clean up the .h files
     93  1.8.2.2  skrll  * a bit more...
     94  1.8.2.2  skrll  */
     95  1.8.2.2  skrll 
     96  1.8.2.2  skrll #ifndef FLAT_RING1_CS
     97  1.8.2.2  skrll #define FLAT_RING1_CS		0x0819
     98  1.8.2.2  skrll #define FLAT_RING1_DS		0x0821
     99  1.8.2.2  skrll #define FLAT_RING3_CS		0x082b
    100  1.8.2.2  skrll #define FLAT_RING3_DS		0x0833
    101  1.8.2.2  skrll #endif
    102  1.8.2.2  skrll 
    103  1.8.2.2  skrll #define __KERNEL_CS        FLAT_RING1_CS
    104  1.8.2.2  skrll #define __KERNEL_DS        FLAT_RING1_DS
    105  1.8.2.2  skrll 
    106  1.8.2.2  skrll /* Everything below this point is not included by assembler (.S) files. */
    107  1.8.2.2  skrll #ifndef _LOCORE
    108  1.8.2.2  skrll 
    109  1.8.2.2  skrll /* some function prototypes */
    110  1.8.2.2  skrll void trap_init(void);
    111  1.8.2.2  skrll 
    112  1.8.2.2  skrll 
    113  1.8.2.2  skrll /*
    114  1.8.2.2  skrll  * STI/CLI equivalents. These basically set and clear the virtual
    115  1.8.2.2  skrll  * event_enable flag in teh shared_info structure. Note that when
    116  1.8.2.2  skrll  * the enable bit is set, there may be pending events to be handled.
    117  1.8.2.2  skrll  * We may therefore call into do_hypervisor_callback() directly.
    118  1.8.2.2  skrll  */
    119  1.8.2.2  skrll 
    120  1.8.2.2  skrll #define __save_flags(x)							\
    121  1.8.2.2  skrll do {									\
    122  1.8.2.2  skrll 	(x) = x86_atomic_test_bit(&HYPERVISOR_shared_info->events_mask,	\
    123  1.8.2.2  skrll 		EVENTS_MASTER_ENABLE_BIT);				\
    124  1.8.2.2  skrll 	__insn_barrier();						\
    125  1.8.2.2  skrll } while (0)
    126  1.8.2.2  skrll 
    127  1.8.2.2  skrll #define __restore_flags(x)						\
    128  1.8.2.2  skrll do {									\
    129  1.8.2.2  skrll 	shared_info_t *_shared = HYPERVISOR_shared_info;		\
    130  1.8.2.2  skrll 	if (x) x86_atomic_set_bit(&_shared->events_mask,		\
    131  1.8.2.2  skrll 		EVENTS_MASTER_ENABLE_BIT);				\
    132  1.8.2.2  skrll 	__insn_barrier();						\
    133  1.8.2.2  skrll } while (0)
    134  1.8.2.2  skrll /*     if (__predict_false(_shared->events) && (x)) do_hypervisor_callback(NULL);     \ */
    135  1.8.2.2  skrll 
    136  1.8.2.2  skrll #define __cli()								\
    137  1.8.2.2  skrll do {									\
    138  1.8.2.2  skrll 	x86_atomic_clear_bit(&HYPERVISOR_shared_info->events_mask,	\
    139  1.8.2.2  skrll 		EVENTS_MASTER_ENABLE_BIT);				\
    140  1.8.2.2  skrll 	    __insn_barrier();						\
    141  1.8.2.2  skrll } while (0)
    142  1.8.2.2  skrll 
    143  1.8.2.2  skrll #define __sti()								\
    144  1.8.2.2  skrll do {									\
    145  1.8.2.2  skrll 	shared_info_t *_shared = HYPERVISOR_shared_info;		\
    146  1.8.2.2  skrll 	x86_atomic_set_bit(&_shared->events_mask,			\
    147  1.8.2.2  skrll 		EVENTS_MASTER_ENABLE_BIT);				\
    148  1.8.2.2  skrll     __insn_barrier();							\
    149  1.8.2.2  skrll } while (0)
    150  1.8.2.2  skrll /*     if (__predict_false(_shared->events)) do_hypervisor_callback(NULL); \ */
    151  1.8.2.2  skrll 
    152  1.8.2.2  skrll #define cli()			__cli()
    153  1.8.2.2  skrll #define sti()			__sti()
    154  1.8.2.2  skrll #define save_flags(x)		__save_flags(x)
    155  1.8.2.2  skrll #define restore_flags(x)	__restore_flags(x)
    156  1.8.2.2  skrll #define save_and_cli(x)		__save_and_cli(x)
    157  1.8.2.2  skrll #define save_and_sti(x)		__save_and_sti(x)
    158  1.8.2.2  skrll 
    159  1.8.2.2  skrll #ifdef MULTIPROCESSOR
    160  1.8.2.2  skrll #define __LOCK_PREFIX "lock; "
    161  1.8.2.2  skrll #else
    162  1.8.2.2  skrll #define __LOCK_PREFIX ""
    163  1.8.2.2  skrll #endif
    164  1.8.2.2  skrll 
    165  1.8.2.2  skrll static __inline__ unsigned long
    166  1.8.2.2  skrll x86_atomic_xchg(unsigned long *ptr, unsigned long val)
    167  1.8.2.2  skrll {
    168  1.8.2.2  skrll 	unsigned long result;
    169  1.8.2.2  skrll 
    170  1.8.2.2  skrll         __asm __volatile("xchgl %0,%1"
    171  1.8.2.2  skrll 	    :"=r" (result)
    172  1.8.2.2  skrll 	    :"m" (*ptr), "0" (val)
    173  1.8.2.2  skrll 	    :"memory");
    174  1.8.2.2  skrll 
    175  1.8.2.2  skrll 	return result;
    176  1.8.2.2  skrll }
    177  1.8.2.2  skrll 
    178  1.8.2.2  skrll static __inline__ int
    179  1.8.2.2  skrll x86_atomic_test_and_clear_bit(volatile void *ptr, int bitno)
    180  1.8.2.2  skrll {
    181  1.8.2.2  skrll         int result;
    182  1.8.2.2  skrll 
    183  1.8.2.2  skrll         __asm __volatile(__LOCK_PREFIX
    184  1.8.2.2  skrll 	    "btrl %2,%1 ;"
    185  1.8.2.2  skrll 	    "sbbl %0,%0"
    186  1.8.2.2  skrll 	    :"=r" (result), "=m" (*(volatile uint32_t *)(ptr))
    187  1.8.2.2  skrll 	    :"Ir" (bitno) : "memory");
    188  1.8.2.2  skrll         return result;
    189  1.8.2.2  skrll }
    190  1.8.2.2  skrll 
    191  1.8.2.2  skrll static __inline int
    192  1.8.2.2  skrll x86_constant_test_bit(const volatile void *ptr, int bitno)
    193  1.8.2.2  skrll {
    194  1.8.2.2  skrll 	return ((1UL << (bitno & 31)) &
    195  1.8.2.2  skrll 	    (((const volatile uint32_t *) ptr)[bitno >> 5])) != 0;
    196  1.8.2.2  skrll }
    197  1.8.2.2  skrll 
    198  1.8.2.2  skrll static __inline int
    199  1.8.2.2  skrll x86_variable_test_bit(const volatile void *ptr, int bitno)
    200  1.8.2.2  skrll {
    201  1.8.2.2  skrll 	int result;
    202  1.8.2.2  skrll 
    203  1.8.2.2  skrll 	__asm __volatile(
    204  1.8.2.2  skrll 		"btl %2,%1 ;"
    205  1.8.2.2  skrll 		"sbbl %0,%0"
    206  1.8.2.2  skrll 		:"=r" (result)
    207  1.8.2.2  skrll 		:"m" (*(volatile uint32_t *)(ptr)), "Ir" (bitno));
    208  1.8.2.2  skrll 	return result;
    209  1.8.2.2  skrll }
    210  1.8.2.2  skrll 
    211  1.8.2.2  skrll #define x86_atomic_test_bit(ptr, bitno) \
    212  1.8.2.2  skrll 	(__builtin_constant_p(bitno) ? \
    213  1.8.2.2  skrll 	 x86_constant_test_bit((ptr),(bitno)) : \
    214  1.8.2.2  skrll 	 variable_test_bit((ptr),(bitno)))
    215  1.8.2.2  skrll 
    216  1.8.2.2  skrll static __inline void
    217  1.8.2.2  skrll x86_atomic_set_bit(volatile void *ptr, int bitno)
    218  1.8.2.2  skrll {
    219  1.8.2.2  skrll         __asm __volatile(__LOCK_PREFIX
    220  1.8.2.2  skrll 	    "btsl %1,%0"
    221  1.8.2.2  skrll 	    :"=m" (*(volatile uint32_t *)(ptr))
    222  1.8.2.2  skrll 	    :"Ir" (bitno));
    223  1.8.2.2  skrll }
    224  1.8.2.2  skrll 
    225  1.8.2.2  skrll static __inline void
    226  1.8.2.2  skrll x86_atomic_clear_bit(volatile void *ptr, int bitno)
    227  1.8.2.2  skrll {
    228  1.8.2.2  skrll         __asm __volatile(__LOCK_PREFIX
    229  1.8.2.2  skrll 	    "btrl %1,%0"
    230  1.8.2.2  skrll 	    :"=m" (*(volatile uint32_t *)(ptr))
    231  1.8.2.2  skrll 	    :"Ir" (bitno));
    232  1.8.2.2  skrll }
    233  1.8.2.2  skrll 
    234  1.8.2.2  skrll #endif /* !__ASSEMBLY__ */
    235  1.8.2.2  skrll 
    236  1.8.2.2  skrll #endif /* _OS_H_ */
    237