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