/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2013  Free Software Foundation, Inc.
 *
 *  GRUB is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_XEN_HEADER
#define GRUB_XEN_HEADER 1

#define __XEN_INTERFACE_VERSION__ 0x0003020a

#define memset grub_memset

#ifdef ASM_FILE
#define __ASSEMBLY__
#include <xen/xen.h>
#else

#include <grub/symbol.h>
#include <grub/types.h>
#include <grub/err.h>

#ifndef GRUB_SYMBOL_GENERATOR
typedef grub_int8_t int8_t;
typedef grub_int16_t int16_t;
typedef grub_uint8_t uint8_t;
typedef grub_uint16_t uint16_t;
typedef grub_uint32_t uint32_t;
typedef grub_uint64_t uint64_t;
#include <xen/xen.h>

#include <xen/sched.h>
#include <xen/grant_table.h>
#include <xen/io/console.h>
#include <xen/io/xs_wire.h>
#include <xen/io/xenbus.h>
#include <xen/io/protocols.h>
#endif

#include <grub/cpu/xen/hypercall.h>

extern grub_size_t EXPORT_VAR (grub_xen_n_allocated_shared_pages);


#define GRUB_XEN_LOG_PAGE_SIZE 12
#define GRUB_XEN_PAGE_SIZE (1 << GRUB_XEN_LOG_PAGE_SIZE)

extern volatile struct xencons_interface *grub_xen_xcons;
extern volatile struct shared_info *EXPORT_VAR (grub_xen_shared_info);
extern volatile struct xenstore_domain_interface *grub_xen_xenstore;
extern volatile grant_entry_v1_t *grub_xen_grant_table;

void EXPORT_FUNC (grub_xen_store_send) (const void *buf_, grub_size_t len);
void EXPORT_FUNC (grub_xen_store_recv) (void *buf_, grub_size_t len);
grub_err_t
EXPORT_FUNC (grub_xenstore_dir) (const char *dir,
				 int (*hook) (const char *dir,
					      void *hook_data),
				 void *hook_data);
void *EXPORT_FUNC (grub_xenstore_get_file) (const char *dir,
					    grub_size_t * len);
grub_err_t EXPORT_FUNC (grub_xenstore_write_file) (const char *dir,
						   const void *buf,
						   grub_size_t len);

typedef unsigned int grub_xen_grant_t;

void *EXPORT_FUNC (grub_xen_alloc_shared_page) (domid_t dom,
						grub_xen_grant_t * grnum);
void EXPORT_FUNC (grub_xen_free_shared_page) (void *ptr);

#define mb() asm volatile("mfence;sfence;" : : : "memory");
extern struct start_info *EXPORT_VAR (grub_xen_start_page_addr);

void grub_console_init (void);

void grub_xendisk_fini (void);
void grub_xendisk_init (void);

#ifdef __x86_64__
typedef grub_uint64_t grub_xen_mfn_t;
#else
typedef grub_uint32_t grub_xen_mfn_t;
#endif
typedef unsigned int grub_xen_evtchn_t;
#endif

#endif
