// XtratuM_API.h
// Definition of the XtratuM_API, any domain only should
// include this file
//
// version: 0.2
//
// (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 <arch/XtratuM_config.h>
#include <arch/XtratuM_events_def.h>

// Types definition
///////////////////////////////////////////////////////////

// In fact xm_domain_t has a different definition inside
// XtratuM, but it doesn't the matter to the domain
typedef unsigned long *xm_domain_t; 

struct pt_regs {
        long ebx;
        long ecx;
        long edx;
        long esi;
        long edi;
        long ebp;
        long eax;
        int  xds;
        int  xes;
        long orig_eax;
        long eip;
        int  xcs;
        long eflags;
        long esp;
        int  xss;
};

typedef void (*handler_t) (int, struct pt_regs *);

typedef unsigned long bitmap_t; // 32 bytes

#ifdef XtratuM_TIMER_SUPPORT
typedef signed long long hwtime_t;
typedef signed long long duration_t;

typedef unsigned long xm_arch_timer_t;

typedef struct xm_timer_info_struct {
  hwtime_t freq;
  int timer_event;
} xm_timer_info_t;
#endif

// Macros definition
///////////////////////////////////////////////////////////

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

#ifdef XtratuM_TIMER_SUPPORT
#define NS_PER_S 1000000000

#define PERIODIC_MODE 0x0
#define ONESHOOT_MODE 0x1
#endif

// Functions definition
///////////////////////////////////////////////////////////

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

#define xm_min_priority() UINT_MAX

#define xm_max_priority() 0

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

extern void xm_end_domain (xm_domain_t domain);

extern void xm_suspend_domain (void);

extern void xm_set_domain_priority (unsigned int priority);

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

extern int xm_install_event_handler (int event, handler_t handler);

extern int xm_install_trap_handler (int trap, handler_t handler);

// Flags definited in the section of macros of this file
extern int xm_raise_event_all_domains (int event, int flags);

// Flags definited in the section of macros of this file
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 (void);

extern void xm_disable_events (void);

extern void xm_unmask_event (int event);

extern void xm_mask_event (int event);

extern void xm_save_mask_events (bitmap_t *old_mask);

extern void xm_mask_all_events (void);

extern void xm_pass_event (int event);

extern void xm_unmask_all_events (void);

extern void xm_restore_mask_events (bitmap_t mask);

extern xm_domain_t xm_domain_self(void);

extern int xm_are_events_enabled (void);

extern int xm_write_domain (char *buffer, unsigned long size);

#ifdef XtratuM_XFB_SUPPORT
#include <arch/XtratuM_xfb.h>
extern unsigned char *xm_attach_xfb (int width, int height, int depth);
extern int xm_detach_xfb (void);
extern int xm_read_xfb_buffer (char *buffer, int size);
extern void xm_flush_xfb_buffer (void);
extern void xm_update_xfb_screen (void);
extern void xm_get_mouse_info (mouse_info_t *mouse);
#endif

#ifdef XtratuM_TIMER_SUPPORT

static inline duration_t hwtime2nsec (hwtime_t th, hwtime_t xm_timer_freq) {
  duration_t s = th / xm_timer_freq;
  
  return s * NS_PER_S + ((th - s * xm_timer_freq)*NS_PER_S)/ xm_timer_freq;
}

static inline hwtime_t nsec2hwtime (duration_t d, hwtime_t xm_timer_freq) {
  hwtime_t s = d / NS_PER_S;
  return s * xm_timer_freq + ((d - s * NS_PER_S) * xm_timer_freq) / NS_PER_S;
}

extern xm_arch_timer_t *xm_getbestclock (void);

extern void xm_get_timer_info (xm_arch_timer_t *timer,
			       xm_timer_info_t *timer_info);

extern void xm_getcpufreq(hwtime_t *freq);

extern void xm_gethwtime (xm_arch_timer_t *timer, hwtime_t *time);
extern void xm_sethwtimer (int mode, hwtime_t time,
		           xm_arch_timer_t *timer);

#endif

#endif
