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

#ifndef _XtratuM_H_
#define _XtratuM_H_

#include <arch/XtratuM_events_def.h>
#include <XtratuM_linux_imported.h>
#include <XtratuM_config.h>
#include <bitmap.h>
#include <assert.h>

// When  an  event (an  hardware  int) arrives  to  the  bus, the  PIC
// disables it till somebody enables it again, In the case that nobody
// connects it, must  be the root domain itself who  has to enable the
// received   hardware    interrupt   in   the    PIC   device.    The
// global_pending_events lets  us to control whether  a received event
// has already been enabled or not.

extern bitmap_t global_pending_events;

// Handler prototipe, used in XtratuM_API as well
typedef void (*handler_t) (int, struct pt_regs *);

// The definition of a XtratuM domain
typedef struct xm_domain_struct {
  unsigned long *stack; // Don't change, it is hardcoded
  unsigned long *begining_stack;
  char *name;
  unsigned int priority;

  bitmap_t intercepted_events;
  bitmap_t masked_events;
  bitmap_t pending_events;
  bitmap_t blocked_events; // This bitmap  allow to know  which events
			   // are blocked in the bus

  handler_t event_handler [MAX_EVENTS];
  handler_t trap_handler [MAX_TRAPS];

  ///////////////////
  // Domain flags: //
  ///////////////////
  
  // 31 .. 10 : reserved
  // 8 : indicates whether the current domain can receive events or not
  // 3..0 : state (4 bits, 16 possible states)
  unsigned long flags; 
  struct xm_domain_struct *prev, *next;
} *xm_domain_t;

////////////////////// POSSIBLE STATES OF A DOMAIN

#define xm_STATE_MASK 0xF // 4 bits (3..0)
#define xm_DOMAIN_ACTIVE 0x0
#define xm_DOMAIN_SUSPENDED 0x1
#define xm_DOMAIN_FINISHED 0x2

///////////////////// EVENTS ENABLED
#define xm_EVENTS_ENABLED 0x100 // 1 bit (8)

////////////////////////////////////////////////////

#define xm_set_domain_state(d, state) \
  d -> flags = ((d -> flags & ~(xm_STATE_MASK)) | state)

#define xm_get_domain_state(d) \
  (d -> flags & xm_STATE_MASK)

#define xm_is_events_flag_enabled(d) \
  (d -> flags & xm_EVENTS_ENABLED)

#define xm_enable_events_flag(d) \
  d -> flags |= xm_EVENTS_ENABLED

#define xm_disable_events_flag(d) \
  d -> flags &= ~(xm_EVENTS_ENABLED)

#define xm_min_priority() UINT_MAX

#define xm_max_priority() 0

extern struct xm_domain_struct *xm_domain_list, 
  *root_domain, *current_domain;

extern int xm_sched (void);
extern void xm_sync_events(void);

#endif
