// XtratuM
// version: 0.1
//
// (c) 2004, Miguel Masmano <mimastel@doctor.upv.es>
// Released under the terms of GPL License v2

#ifndef _XtratuM_API_H_
#define _XtratuM_API_H_

#include <XtratuM.h>

// This file  includes the  XtratuM API, users  should use  only these
// functions, since XtratuM internals can be changed in the future

#define xm_create_domain(domain, name, priority, main_func) \
  __xm_create_domain(domain, name, priority, main_func, 0)

#define xm_suspend_domain() __xm_suspend_domain (current_domain)

#define xm_set_domain_priority(priority) \
  __xm_set_domain_priority (current_domain, priority)

#define xm_install_event_handler(event, handler, flags) \
  __xm_install_event_handler (current_domain, event, handler,  flags)

#define xm_install_trap_handler(trap, handler) \
  __xm_install_trap_handler (current_domain, trap, handler)

#define xm_enable_events() \
  __xm_enable_events (current_domain)

#define xm_disable_events() \
  __xm_disable_events (current_domain)

#define xm_mask_event(event) \
  __xm_mask_event (current_domain, event)

#define xm_unmask_event(event) \
  __xm_unmask_event (current_domain, event);

#define xm_save_mask_events(old_mask) \
  __xm_save_mask_events (current_domain, old_mask)

#define xm_mask_all_events() \
  __xm_mask_all_events (current_domain)

#define xm_unmask_all_events() \
  __xm_unmask_all_events (current_domain)

#define xm_restore_mask_events(mask) \
  __xm_restore_mask_events (current_domain, mask)


// The most functions below are extended versions of the previous ones
// which accept the affected domain

extern int __xm_create_domain (xm_domain_t *domain, char *name, 
			       unsigned int priority,
			       int (*main_func) (void), 
			       unsigned long pd);

extern void xm_destroy_domain (struct xm_domain_struct *domain);

extern void __xm_suspend_domain (xm_domain_t domain);

extern void __xm_set_domain_priority (xm_domain_t domain, 
				      unsigned int priority);

// Handler prototipe as defined int XtratuM.h
// typedef void (*handler_t) (int, struct pt_regs *);

// xm_install_event_handler flags
#define xm_PASS_EVENT 0x0
#define xm_BLOCK_EVENT 0x1

extern int __xm_install_event_handler (xm_domain_t domain, int event, 
				       handler_t handler, int flags);

extern int __xm_install_trap_handler (xm_domain_t domain, int trap, 
				      handler_t handler);

// xm_raise_event and xm_raise_event_all_domain flags
#define xm_DEFER_EVENT 0x0
#define xm_RAISE_EVENT_NOW 0x1

extern int xm_raise_event_all_domains (int event, int flags);

extern int xm_raise_event (xm_domain_t domain, int event, int flags);
// When  an event  arrives to  the bus,  XtratuM disables  the bus
// automaticaly for all domains, the domain which deals with the event
// has to decide whether the bus has to be enabled again or not 

// Please, remember that if nobody enables an event, it will be disable 
// forever
extern void xm_disable_bus_event (int event);

extern void xm_enable_bus_event (int event);

extern void __xm_enable_events (xm_domain_t domain);

extern void __xm_disable_events (xm_domain_t domain);

extern void __xm_unmask_event (xm_domain_t domain, int event);

extern void __xm_mask_event (xm_domain_t domain, int event);

extern void __xm_save_mask_events (xm_domain_t domain, bitmap_t *old_mask);

extern void __xm_mask_all_events (xm_domain_t domain);

extern void __xm_unmask_all_events (xm_domain_t domain);

extern void __xm_restore_mask_events (xm_domain_t domain, bitmap_t mask);

static inline xm_domain_t xm_domain_self(void) {
  return current_domain;
}

#endif
