14c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini/****************************************************************************** 24c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini * Guest OS interface to ARM Xen. 34c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini * 44c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012 54c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini */ 64c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 74c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#ifndef _ASM_ARM_XEN_INTERFACE_H 84c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define _ASM_ARM_XEN_INTERFACE_H 94c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 104c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#include <linux/types.h> 114c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 12256f631f1f7e7bedc882510679ad4473a2274708Stefano Stabellini#define uint64_aligned_t uint64_t __attribute__((aligned(8))) 13256f631f1f7e7bedc882510679ad4473a2274708Stefano Stabellini 144c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define __DEFINE_GUEST_HANDLE(name, type) \ 15256f631f1f7e7bedc882510679ad4473a2274708Stefano Stabellini typedef struct { union { type *p; uint64_aligned_t q; }; } \ 16256f631f1f7e7bedc882510679ad4473a2274708Stefano Stabellini __guest_handle_ ## name 174c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 184c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define DEFINE_GUEST_HANDLE_STRUCT(name) \ 194c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini __DEFINE_GUEST_HANDLE(name, struct name) 204c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) 214c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define GUEST_HANDLE(name) __guest_handle_ ## name 224c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 234c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define set_xen_guest_handle(hnd, val) \ 244c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini do { \ 254c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini if (sizeof(hnd) == 8) \ 264c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini *(uint64_t *)&(hnd) = 0; \ 27256f631f1f7e7bedc882510679ad4473a2274708Stefano Stabellini (hnd).p = val; \ 284c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini } while (0) 294c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 304c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#ifndef __ASSEMBLY__ 314c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini/* Explicitly size integers that represent pfns in the interface with 323ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell * Xen so that we can have one ABI that works for 32 and 64 bit guests. 333ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell * Note that this means that the xen_pfn_t type may be capable of 343ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell * representing pfn's which the guest cannot represent in its own pfn 353ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell * type. However since pfn space is controlled by the guest this is 363ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell * fine since it simply wouldn't be able to create any sure pfns in 373ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell * the first place. 383ab0b83bf6a1e834f4b884150d8012990c75d25dIan Campbell */ 394c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellinitypedef uint64_t xen_pfn_t; 4037ea0fcb6a3f3318bf45888e624722a2945cec04Ian Campbell#define PRI_xen_pfn "llx" 41256f631f1f7e7bedc882510679ad4473a2274708Stefano Stabellinitypedef uint64_t xen_ulong_t; 4237ea0fcb6a3f3318bf45888e624722a2945cec04Ian Campbell#define PRI_xen_ulong "llx" 435e40704ed2c69425bcb076fb1890417ef137e6c8Ian Campbelltypedef int64_t xen_long_t; 445e40704ed2c69425bcb076fb1890417ef137e6c8Ian Campbell#define PRI_xen_long "llx" 454c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini/* Guest handles for primitive C types. */ 464c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini__DEFINE_GUEST_HANDLE(uchar, unsigned char); 474c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini__DEFINE_GUEST_HANDLE(uint, unsigned int); 484c071ee5268f7234c3d084b6093bebccc28cdcbaStefano StabelliniDEFINE_GUEST_HANDLE(char); 494c071ee5268f7234c3d084b6093bebccc28cdcbaStefano StabelliniDEFINE_GUEST_HANDLE(int); 504c071ee5268f7234c3d084b6093bebccc28cdcbaStefano StabelliniDEFINE_GUEST_HANDLE(void); 514c071ee5268f7234c3d084b6093bebccc28cdcbaStefano StabelliniDEFINE_GUEST_HANDLE(uint64_t); 524c071ee5268f7234c3d084b6093bebccc28cdcbaStefano StabelliniDEFINE_GUEST_HANDLE(uint32_t); 534c071ee5268f7234c3d084b6093bebccc28cdcbaStefano StabelliniDEFINE_GUEST_HANDLE(xen_pfn_t); 54f832da068b0aadb15f747f6427b6bf945f525ba4Ian CampbellDEFINE_GUEST_HANDLE(xen_ulong_t); 554c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 564c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini/* Maximum number of virtual CPUs in multi-processor guests. */ 574c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#define MAX_VIRT_CPUS 1 584c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 594c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellinistruct arch_vcpu_info { }; 604c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellinistruct arch_shared_info { }; 614c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 624c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini/* TODO: Move pvclock definitions some place arch independent */ 634c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellinistruct pvclock_vcpu_time_info { 644c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u32 version; 654c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u32 pad0; 664c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u64 tsc_timestamp; 674c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u64 system_time; 684c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u32 tsc_to_system_mul; 694c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini s8 tsc_shift; 704c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u8 flags; 714c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u8 pad[2]; 724c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini} __attribute__((__packed__)); /* 32 bytes */ 734c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 744c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini/* It is OK to have a 12 bytes struct with no padding because it is packed */ 754c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellinistruct pvclock_wall_clock { 764c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u32 version; 774c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u32 sec; 784c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini u32 nsec; 794c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini} __attribute__((__packed__)); 804c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#endif 814c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini 824c071ee5268f7234c3d084b6093bebccc28cdcbaStefano Stabellini#endif /* _ASM_ARM_XEN_INTERFACE_H */ 83