g++ -c -E -ansi -fno-exceptions -O3 -DGENERATE -I/home/snow/guto/epos/include epos_send.cc
# 1 "epos_send.cc"
# 1 "/home/snow/guto/epos/include/system/kprintf.h" 1
 
 
 
 
 




extern "C" {


 
 
 
# 1 "/home/snow/guto/epos/include/pc/cga.h" 1
 
 
 
 
 




extern "C" {


 
 
 
 





 







 


 




 
 
 
void cga_set_fbuf(unsigned long fbuf);
void cga_clear();
void cga_gotoxy(int x, int y);
void cga_putc(char c);
void cga_puts(const char *s);


}



# 16 "/home/snow/guto/epos/include/system/kprintf.h" 2


 
 
 
void kprintf(const char *fmt, ...);
void ksprintf(char *str, const char *fmt, ...);

int  dtoa(int d, char *str);
int  utoa(unsigned int u, char *str);
int  xtoa(unsigned int x, char *str);
int  ptoa(void *p, char *str);


}



# 1 "epos_send.cc" 2

# 1 "/home/snow/guto/epos/include/network_adapter.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/system_object.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/system_object_id.h" 1
 
 
 
 
 



 
 
 
 
typedef unsigned short Object_Unit;



 
enum Object_Type
{
  TIMER,
  CHRONOMETER,
  NETWORK_ADAPTER,
  THREAD,
  SEMAPHORE,
  LAST_TYPE = SEMAPHORE
};

 
typedef Object_Unit Node_Id;


 
typedef unsigned short Object_Rights;


 
typedef long long Object_Check;

 
 
 
# 53 "/home/snow/guto/epos/include/system_object_id.h"

# 1 "/home/snow/guto/epos/include/system/system_object_id.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/system_config.h" 1
 
 
 



 
 
 

































 
 
 
# 1 "/home/snow/guto/epos/include/../system_config_keys.h" 1




































# 46 "/home/snow/guto/epos/include/system_config.h" 2


 
 
 


typedef class Simple_Scenario_Adapter   Current_Scenario_Adapter;









 
 
 


typedef class Ix86                      Current_CPU;





 
 
 


typedef class Single_CPU_Node           Current_Node;





 
 
 






typedef class Simple_Timer              Current_Timer;





 
 
 






typedef class Simple_Chronometer        Current_Chronometer;





 
 
 






typedef	class Global_Object_Id  	Current_System_Object_Id;









 
 
 


typedef class Standard_System_Object	Current_System_Object;





 
 
 






typedef class Myrinet_Network_Adapter	Current_Network_Adapter;





 
 
 


typedef class Dummy_Thread       	Current_Thread;









 
 
 


typedef class Dummy_Task		Current_Task;









 
 
 


typedef class Dummy_Synchronizer       	Current_Synchronizer;









 
 
 


typedef class Dummy_Communicator       	Current_Communicator;










# 12 "/home/snow/guto/epos/include/system/system_object_id.h" 2

# 1 "/home/snow/guto/epos/include/system/global_object_id.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/system/local_object_id.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/system/debug.h" 1
 
 
 
 
 




extern "C" {


 
 
 


 
 
 
typedef enum
{
  DB_ABORT,
  DB_ERROR,
  DB_WARNING,
  DB_INFO,
  DB_TRACE
} Debug_Level;
 
typedef enum
{
  DB_SETUP,
  DB_INIT,
  DB_SYSTEM,
  DB_TIMER,
  DB_CHRONOMETER,
  DB_NETWORK,
  DB_THREAD,
  DB_SEMAPHORE
} Debug_Module;

 
 
 
void debug(Debug_Level level, Debug_Module module, const char *format, ...);
void debugn(Debug_Level level, Debug_Module module, const char *format, ...);
const char *debug_dump(const char *format, ...);

 
 
 
# 75 "/home/snow/guto/epos/include/system/debug.h"









}




# 12 "/home/snow/guto/epos/include/system/local_object_id.h" 2

# 1 "/home/snow/guto/epos/include/system_object_id.h" 1
 
 
 
 
 
# 57 "/home/snow/guto/epos/include/system_object_id.h"

# 13 "/home/snow/guto/epos/include/system/local_object_id.h" 2


 
 
 
class Local_Object_Id
{
public:
  Local_Object_Id();
  Local_Object_Id(Object_Type t, Object_Unit u = ((Object_Unit) -1) );
  
  bool is_valid() const;
  bool grant(Object_Type t) const;

  Object_Type get_type() const;
  Object_Unit get_unit() const;

  const char *dump() const;

private:
  Object_Type type;
  Object_Unit unit;
};

 
 
 
inline Local_Object_Id::
Local_Object_Id()
{
}

inline Local_Object_Id::
Local_Object_Id(Object_Type t, Object_Unit u): type(t), unit(u)
{
}
  
inline bool Local_Object_Id::
is_valid() const
{
  return (unit != ((Object_Unit) -1) )?true:false;
}

inline bool Local_Object_Id::
grant(Object_Type t) const
{
  return ((type == t) && (unit != ((Object_Unit) -1) ))?true:false;
}

inline Object_Type Local_Object_Id::
get_type() const
{
  return type;
}

inline Object_Unit Local_Object_Id::
get_unit() const
{
  return unit;
}

inline const char *Local_Object_Id::
dump() const
{
  return 0 ;
}


# 12 "/home/snow/guto/epos/include/system/global_object_id.h" 2

# 1 "/home/snow/guto/epos/include/system/node.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/node.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/system_object_id.h" 1
 
 
 
 
 
# 57 "/home/snow/guto/epos/include/system_object_id.h"

# 12 "/home/snow/guto/epos/include/node.h" 2


 
 
 
# 30 "/home/snow/guto/epos/include/node.h"

# 1 "/home/snow/guto/epos/include/system/node.h" 1
 
 
 
 
 
# 25 "/home/snow/guto/epos/include/system/node.h"

# 31 "/home/snow/guto/epos/include/node.h" 2




# 12 "/home/snow/guto/epos/include/system/node.h" 2


 
 
 

# 1 "/home/snow/guto/epos/include/system/single_cpu_node.h" 1
 
 
 
 
 



 
 
 



 
 
 
class Single_CPU_Node
{
public:
  Single_CPU_Node(Node_Id l){local_node_id = l;};
  
  const char *dump() const
    {return 0 ;};

  Node_Id get_nid() const
    {return local_node_id;};

private:
  static Node_Id local_node_id;
};


# 18 "/home/snow/guto/epos/include/system/node.h" 2


 
 
 
typedef class Current_Node Node;


# 13 "/home/snow/guto/epos/include/system/global_object_id.h" 2


 
 
 
class Global_Object_Id: public Local_Object_Id
{
public:
  Global_Object_Id();
  Global_Object_Id(Object_Type t, Object_Unit u = ((Object_Unit) -1) );

  bool grant(Object_Type t) const;

  Node_Id get_host() const;

  const char *dump() const;

private:
  Node_Id host;
};

 
 
 
extern Current_Node *node;

inline Global_Object_Id::
Global_Object_Id():host(node->get_nid())
{
}

inline Global_Object_Id::
Global_Object_Id(Object_Type t, Object_Unit u):
  Local_Object_Id(t, u), host(node->get_nid())
{
}
  
inline bool Global_Object_Id::
grant(Object_Type t) const
{
  return ((host == node->get_nid()) && (Local_Object_Id::grant(t)))?
    true:false;
}

inline Node_Id Global_Object_Id::
get_host() const
{
  return host;
};

inline const char *Global_Object_Id::
dump() const
{
  return 0 ;
}


# 13 "/home/snow/guto/epos/include/system/system_object_id.h" 2


 
 
 
typedef class Current_System_Object_Id System_Object_Id;


# 54 "/home/snow/guto/epos/include/system_object_id.h" 2




# 12 "/home/snow/guto/epos/include/system_object.h" 2


 
 
 
 
enum System_Object_State
{
  OBJECT_FREE = 0,
  OBJECT_BUSY = 1
};

 
 
 
# 40 "/home/snow/guto/epos/include/system_object.h"

# 1 "/home/snow/guto/epos/include/system/system_object.h" 1
 
 
 
 
 



 
 
 

# 1 "/home/snow/guto/epos/include/system/standard_system_object.h" 1
 
 
 
 
 



 
 
 


# 1 "/home/snow/guto/epos/include/system_object.h" 1
 
 
 
 
 
# 44 "/home/snow/guto/epos/include/system_object.h"

# 14 "/home/snow/guto/epos/include/system/standard_system_object.h" 2


 
 
 
class Standard_System_Object
{
protected:
  Standard_System_Object(){};
  Standard_System_Object(Object_Type t, Object_Unit u):
    id(System_Object_Id(t, u)), state(OBJECT_BUSY), refs(1){};
  ~Standard_System_Object(){};

public:
  void *operator new(unsigned int size, Object_Unit unit);
  void *operator new(unsigned int size, const System_Object_Id &id);
  void operator delete(void* object);

  bool is_valid() const;

  const System_Object_Id &get_id() const;
  System_Object_State get_state() const;
  int get_refs() const;

protected:
  void set_id(const System_Object_Id &i){id = i;};
  void set_state(System_Object_State s){state = s;};
  void set_refs(int r){refs = r;};
  void inc_refs(){refs++;};

private: 
  System_Object_Id id;
  System_Object_State state;
  int refs;
};

 
 
 
inline void Standard_System_Object::
operator delete(void* object)
{
  Standard_System_Object *obj = static_cast<Standard_System_Object *>(object);
  
  if(--obj->refs <= 0)
  {
     ;

    obj->state = OBJECT_FREE;
  }
}

inline bool Standard_System_Object::
is_valid() const
{
  return id.is_valid();
};

inline const System_Object_Id &Standard_System_Object::
get_id() const
{
  return id;
};

inline System_Object_State Standard_System_Object::
get_state() const
{
  return state;
};

inline int Standard_System_Object::
get_refs() const
{
  return refs;
};


# 13 "/home/snow/guto/epos/include/system/system_object.h" 2


 
 
 
typedef class Current_System_Object System_Object;


# 41 "/home/snow/guto/epos/include/system_object.h" 2




# 12 "/home/snow/guto/epos/include/network_adapter.h" 2



 
 
 
 
typedef unsigned long long Network_Adapter_Addr;

 
typedef Object_Unit Network_Adapter_Id;

 
typedef Object_Unit Network_Connection_Id;

 
typedef struct
{
  int header_errors;
  int trailer_errors;
  int length_errors;
  int crc_errors;
  int packets_sent;
  int packets_received;
  int packets_droped;
} Network_Adapter_Status;

 
 
 
# 69 "/home/snow/guto/epos/include/network_adapter.h"

# 1 "/home/snow/guto/epos/include/system/network_adapter.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/network_adapter.h" 1
 
 
 
 
 
# 73 "/home/snow/guto/epos/include/network_adapter.h"





# 12 "/home/snow/guto/epos/include/system/network_adapter.h" 2



 
 
 

# 1 "/home/snow/guto/epos/include/system/myrinet_network_adapter.h" 1
 
 
 
 
 



 
 
 

# 1 "/home/snow/guto/epos/include/network_adapter.h" 1
 
 
 
 
 
# 73 "/home/snow/guto/epos/include/network_adapter.h"





# 13 "/home/snow/guto/epos/include/system/myrinet_network_adapter.h" 2

# 1 "/home/snow/guto/epos/include/cpu.h" 1
 
 
 
 
 



 
 
 
# 31 "/home/snow/guto/epos/include/cpu.h"

# 1 "/home/snow/guto/epos/include/system/cpu.h" 1
 
 
 
 
 



 
 
 

# 1 "/home/snow/guto/epos/include/system/ix86.h" 1
 
 
 
 
 



 
 
 
class Ix86
{
public:
 
typedef unsigned char Reg8;

 
typedef unsigned short Reg16;

 
typedef unsigned long Reg32;

 
typedef unsigned long long Reg64;

 
typedef unsigned long Phy_Addr;

 
typedef unsigned long Log_Addr;

 
typedef unsigned char Page[4096];

 
typedef Phy_Addr PTE1;

 
typedef Phy_Addr PTE2;

 
typedef PTE1 PT1[sizeof(Page)/sizeof(PTE1)];

 
typedef PTE2 PT2[sizeof(Page)/sizeof(PTE2)];

 
struct GDT_Desc
{
  Reg16 limit_15_00;
  Reg16 base_15_00;
  Reg8  base_23_16;
  Reg8  p_dpl_s_type;
  Reg8  g_d_0_a_limit_19_16;
  Reg8  base_31_24;
};

 
struct IDT_Desc
{
  Reg16 offset_15_00;
  Reg16 selector;
  Reg8  zero;
  Reg8  p_dpl_0_d_1_1_0;
  Reg16 offset_31_16;
};

 
struct TSS
{
  Reg16 back_link;
  Reg16 zero1;
  Reg32 esp0;
  Reg16 ss0;
  Reg16 zero2;
  Reg32 esp1;
  Reg16 ss1;
  Reg16 zero3;
  Reg32 esp2;
  Reg16 ss2;
  Reg16 zero4;
  Reg32 pdbr;
  Reg32 eip;
  Reg32 eflags;
  Reg32 eax;
  Reg32 ecx;
  Reg32 edx;
  Reg32 ebx;
  Reg32 esp;
  Reg32 ebp;
  Reg32 esi;
  Reg32 edi;
  Reg16 es;
  Reg16 zero5;
  Reg16 cs;
  Reg16 zero6;
  Reg16 ss;
  Reg16 zero7;
  Reg16 ds;
  Reg16 zero8;
  Reg16 fs;
  Reg16 zero9;
  Reg16 gs;
  Reg16 zero10;
  Reg16 ldt;
  Reg16 zero11;
  Reg16 zero12;
  Reg16 io_bmp;
} TSS;

public:
  static Reg64 get_clock()
  {return clock;};

  static Reg64 get_clock_count()
  {
    Reg64 tsc;

    __asm__("rdtsc" : "=a" (*((Reg32 *)&tsc)), "=d" (*(((Reg32 *)&tsc) + 1)));

    return tsc;
  };

  friend Reg16 htons(Reg16 v)
  {return ((v << 8) & 0xFF00) | ((v >> 8) & 0x00FF);};

  friend Reg32 htonl(Reg32 v)
  {__asm__("bswap %0" : "=r" (v) : "0" (v), "r" (v)); return v;};

  friend Reg16 ntohs(Reg16 v)
  {return ((v << 8) & 0xFF00) | ((v >> 8) & 0x00FF);};

  friend Reg32 ntohl(Reg32 v)
  {__asm__("bswap %0" : "=r" (v) : "0" (v), "r" (v)); return v;};

  static init(Reg64 c)
    {clock = c; return 0;};

private:
  static Reg64 clock;
};






# 13 "/home/snow/guto/epos/include/system/cpu.h" 2


 
 
 
typedef class Current_CPU CPU;


# 32 "/home/snow/guto/epos/include/cpu.h" 2




# 14 "/home/snow/guto/epos/include/system/myrinet_network_adapter.h" 2


# 1 "/home/snow/guto/epos/include/system/generic_network_adapter.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/network_adapter.h" 1
 
 
 
 
 
# 73 "/home/snow/guto/epos/include/network_adapter.h"





# 12 "/home/snow/guto/epos/include/system/generic_network_adapter.h" 2



 
 
 
class Generic_Network_Adapter: public System_Object
{
protected:
  Generic_Network_Adapter(){};

public:
  const Network_Adapter_Addr &get_addr() const;
  const Network_Adapter_Id &get_nid() const;
  const Network_Adapter_Status &get_status() const;

protected:
  Network_Adapter_Id nid;
  Network_Adapter_Addr addr;
  Network_Adapter_Status status;
};

 
 
 
inline const Network_Adapter_Id &Generic_Network_Adapter::
get_nid() const
{
  return nid;
}

inline const Network_Adapter_Addr &Generic_Network_Adapter::
get_addr() const
{
  return addr;
}

inline const Network_Adapter_Status &Generic_Network_Adapter::
get_status() const
{
  return status;
}







# 16 "/home/snow/guto/epos/include/system/myrinet_network_adapter.h" 2

# 1 "/home/snow/guto/epos/include/net/myrinet_nic.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/net/lanai.h" 1
 
 
 
 
 



 
 
 
 


 


 
  


 






 



 






























 
 
 
 
 
typedef unsigned char LANai_Reg8;

 
typedef unsigned short LANai_Reg16;

 
typedef unsigned long LANai_Reg32;

 
typedef unsigned long long LANai_Reg64;

 
typedef LANai_Reg32 LANai_Phy_Addr;

 
typedef LANai_Reg32 LANai_Log_Addr;







# 12 "/home/snow/guto/epos/include/net/myrinet_nic.h" 2

# 1 "/home/snow/guto/epos/include/system/mem_map.h" 1
 
 
 
 
 



 
 
 
 


                                            

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

						 




  





  




  




# 13 "/home/snow/guto/epos/include/net/myrinet_nic.h" 2



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 








 
 
 
 
struct Myrinet_PROM
{
  volatile unsigned long  lanai_clock;
  volatile unsigned short lanai_cpu_version;
  volatile unsigned char  lanai_board_id[6];
  volatile unsigned long  lanai_sram_size;
  volatile unsigned char  fpga_version[32];
  volatile unsigned char  more_version[16];
  volatile unsigned short delay_line_value;
  volatile unsigned short board_type;
  volatile unsigned short bus_type;
  volatile unsigned short product_code;
  volatile unsigned long  serial_number;
  unsigned short reserved[26];
};

 
struct Myrinet_Registers
{
  volatile unsigned long ipf0;       
  volatile unsigned long cur0;
  volatile unsigned long prev0;
  volatile unsigned long data0;
  volatile unsigned long dpf0;
  volatile unsigned long ipf1;       
  volatile unsigned long cur1;
  volatile unsigned long prev1;
  volatile unsigned long data1;
  volatile unsigned long dpf1;
  volatile unsigned long isr;        
  volatile unsigned long eimr;       
  volatile unsigned long it;         
  volatile unsigned long rtc;        
  volatile unsigned long cks;        
  volatile unsigned long ear;        
  volatile unsigned long lar;        
  volatile unsigned long dma_ctr;    
  volatile unsigned long rmp;        
  volatile unsigned long rml;        
  volatile unsigned long smp;        
  volatile unsigned long sml;        
  volatile unsigned long smlt;       
  unsigned long          skip_0x5c;  
  volatile unsigned char rb;         
  unsigned char          skip_0x61;
  unsigned char          skip_0x62;
  unsigned char          skip_0x63;
  volatile unsigned short rh;        
  unsigned char          skip_0x66;
  unsigned char          skip_0x67;
  volatile unsigned long rw;         
  volatile unsigned long sa;         
  volatile unsigned long sb;         
  volatile unsigned long sh;
  volatile unsigned long sw;
  volatile unsigned long st;
  volatile unsigned long dma_dir;    
  volatile unsigned long dma_sts;    
  volatile unsigned long timeout;
  volatile unsigned long myrinet;
  volatile unsigned long hw_debug;   
  volatile unsigned long led;        
  volatile unsigned long version;    
  volatile unsigned long activate;    
  unsigned long          pad0[(0xfc - 0xa0) / sizeof(long)];
  volatile unsigned long clock;      
};

 
typedef unsigned char Myrinet_FPGA[0x000e0000  - 0x000c0000 ];

 
typedef unsigned char Myrinet_SRAM[0x00200000  - 0x00100000 ];

 
 
 
class Myrinet_NIC
{
public:
  void int_enable();
  void int_disable();
  void suspend();
  void resume();
  void reset();

public:
  char pad0[0x00080000  - 0x00000000 ];
  Myrinet_PROM prom;
  char pad1[0x000c0000  - 0x00080000  - sizeof(Myrinet_PROM)];
  Myrinet_Registers regs;
  char pad2[0x000e0000  - 0x000c0000  - sizeof(Myrinet_Registers)];
  Myrinet_FPGA fpga;
  Myrinet_SRAM sram;
};

 
 
 
inline void Myrinet_NIC::
int_enable()
{
  prom.lanai_clock = htonl(0x00000020 );
}

inline void Myrinet_NIC::
int_disable()
{
  prom.lanai_clock = htonl(0x00000010 );
}

inline void Myrinet_NIC::
suspend()
{
  prom.lanai_clock = htonl(0x00000040 );
}

inline void Myrinet_NIC::
resume()
{
  prom.lanai_clock = htonl(0x00000080 );
}

inline void Myrinet_NIC::
reset()
{
  int_disable();
  suspend();

  regs.eimr = 0;
  regs.myrinet = htonl(0x00000002  | 0x00000001 );
  regs.clock = htonl(0x50e450e4 );
  regs.version = htonl(3 );
  regs.timeout = htonl(3 );

  resume();
  int_enable();
}







# 17 "/home/snow/guto/epos/include/system/myrinet_network_adapter.h" 2


 
 
 
 


 


 


 


 


 
 
 
 
typedef char Myrinet_Route[(8  / 8) ];

 
enum Myrinet_CP_Status
{
  MYRINET_RESET = 0,
  MYRINET_HOST_READY = 1,
  MYRINET_NIC_READY = 2,
  MYRINET_MESSAGE_FREE = 0,
  MYRINET_MESSAGE_READY = 1,
  MYRINET_MESSAGE_SENT = 2,
  MYRINET_MESSAGE_RECEIVED = 2,
  MYRINET_MESSAGE_ERROR = 3
};

 
struct Myrinet_CP_Statistics
{
  int resets;
  int packets_sent;
  int packets_received;
  int packets_droped;
  int header_errors;
  int crc_errors;
  int trailer_errors;
  int length_errors;
  int routing_errors;
  int overrun_errors;
};

 
struct Myrinet_CP_Message
{
  volatile int status;      
  Network_Adapter_Id node_id; 
  int length;
  unsigned int buffer;
};

 
struct Myrinet_CP_Shared
{
  volatile int status;
  int n_nodes;
  Network_Adapter_Id local_node_id;
  CPU::Phy_Addr pci_addr;
  Myrinet_Route route_tab[8 ];
  Myrinet_CP_Message send_message;
  Myrinet_CP_Message receive_message;
  Myrinet_CP_Statistics statistics;
};

 
 
 
class Myrinet_Network_Adapter: public Generic_Network_Adapter 
{
public:
  Myrinet_Network_Adapter();
  ~Myrinet_Network_Adapter();

  void *operator new(unsigned int size, Object_Unit unit);
  void *operator new(unsigned int size, const System_Object_Id &id);
 
  int  reset();
  void drop();
  int  send(Network_Adapter_Id dst, void *buf, int len);
  int  receive(Network_Adapter_Id *src, void *buf, int *len);

  static init(Network_Adapter_Id *nid);

protected:
  int load_mcp();
  int boot_request();
  int boot_send(Network_Adapter_Id dst, void *buf, int len);
  int boot_receive(Network_Adapter_Id *src, void *buf, int len);

protected:
   
  Myrinet_NIC *nic;
  Myrinet_CP_Shared *shmem;

   
  static int n_units;
  static Myrinet_Network_Adapter *table;
};







# 19 "/home/snow/guto/epos/include/system/network_adapter.h" 2


 
 
 
class Network_Adapter
{
public:
  Network_Adapter(Object_Unit unit = ((Object_Unit) -1) );
  Network_Adapter(const Network_Adapter &object);
  Network_Adapter(const System_Object_Id &id);
  ~Network_Adapter();

  void *operator new(unsigned int size, Object_Unit unit);
  void *operator new(unsigned int size, const System_Object_Id &id);

  bool is_valid();
  const System_Object_Id &get_id() const;

  int reset();
  int send(Network_Adapter_Id dst, void *buf, int len);
  int receive(Network_Adapter_Id *src, void *buf, int *len);

  const Network_Adapter_Addr &get_addr() const;
  const Network_Adapter_Id &get_nid() const;
  const Network_Adapter_Status &get_status() const;

protected:
  Current_Network_Adapter *object;
};

 
 
 
inline Network_Adapter::
Network_Adapter(Object_Unit  unit)
{


  object =  Current_Network_Adapter ::  operator new ( 
		  sizeof(Current_Network_Adapter), unit ) ;
  object = reinterpret_cast<Current_Network_Adapter *>
    ( NETWORK_ADAPTER ::  NEW_WITH_UNIT ( 
	    Current_Network_Adapter::operator new,
	    sizeof(Current_Network_Adapter), unit ) );
   
}

inline Network_Adapter::
Network_Adapter(const Network_Adapter &obj)
{
   
  object = reinterpret_cast<Current_Network_Adapter *>
    ( NETWORK_ADAPTER ::  NEW_WITH_ID ( 
	    Current_Network_Adapter::operator new,
	    sizeof(Current_Network_Adapter), obj.get_id() ) );
   
}

inline Network_Adapter::
Network_Adapter(const System_Object_Id &id)
{
   
  object = reinterpret_cast<Current_Network_Adapter *>
    ( NETWORK_ADAPTER ::  NEW_WITH_ID ( 
	    Current_Network_Adapter::operator new,
	    sizeof(Current_Network_Adapter), id ) );
   
}

inline Network_Adapter::
~Network_Adapter()
{
   
   NETWORK_ADAPTER ::  DELETE ( 
	 Current_Network_Adapter::operator delete,
	 object ) ;
   
}

inline bool Network_Adapter::
is_valid()
{
  return  NETWORK_ADAPTER ::  IS_VALID (  object->is_valid ) ;
   
}

inline const System_Object_Id &Network_Adapter::
get_id() const
{
  return  NETWORK_ADAPTER ::  GET_ID (  object->get_id ) ;
   
}

inline int Network_Adapter::
reset()
{
  return  NETWORK_ADAPTER ::  RESET (  object->reset ) ;
   
}

inline int Network_Adapter::
send(Network_Adapter_Id dst, void *buf, int len)
{
  return object->send(dst, buf, len);
}

inline int Network_Adapter::
receive(Network_Adapter_Id *dst, void *buf, int *len)
{
  return object->receive(dst, buf, len);
}

inline const Network_Adapter_Addr &Network_Adapter::
get_addr() const
{
  return object->get_addr();
}

inline const Network_Adapter_Id &Network_Adapter::
get_nid() const
{
  return object->get_nid();
}

inline const Network_Adapter_Status &Network_Adapter::
get_status() const
{
  return object->get_status();
}







# 70 "/home/snow/guto/epos/include/network_adapter.h" 2








# 2 "epos_send.cc" 2

# 1 "/home/snow/guto/epos/include/chronometer.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/timer.h" 1
 
 
 
 
 



 
 
 
class Timer_Tick
{
public:
  Timer_Tick(){};
  Timer_Tick(unsigned long long int t){ticks = t;};
  operator unsigned long long int(){return ticks;};

private:
  unsigned long long int ticks;
};

 
 
 
# 41 "/home/snow/guto/epos/include/timer.h"

# 1 "/home/snow/guto/epos/include/system/timer.h" 1
 
 
 
 
 



 
 
 

# 1 "/home/snow/guto/epos/include/system/simple_timer.h" 1
 
 
 
 
 



 
 
 
# 1 "/home/snow/guto/epos/include/timer.h" 1
 
 
 
 
 
# 45 "/home/snow/guto/epos/include/timer.h"





# 12 "/home/snow/guto/epos/include/system/simple_timer.h" 2



 
 
 
class Simple_Timer
{
public:
  Simple_Timer(){};

  Timer_Tick get_tick() const
    {return CPU::get_clock_count();};

  void delay(Timer_Tick ticks) const
    {Timer_Tick ready_tick = get_tick() + ticks;
    while(get_tick() < ready_tick);}

  static double get_resolution()
    {return resolution;};

  static init()
    {resolution = 1.0 / (double)Current_CPU::get_clock(); return 0;};

private:
  static double resolution;
};






# 13 "/home/snow/guto/epos/include/system/timer.h" 2


 
 
 
typedef class Current_Timer Timer;







# 42 "/home/snow/guto/epos/include/timer.h" 2








# 12 "/home/snow/guto/epos/include/chronometer.h" 2


 
 
 
class Elapsed_Time
{
public:
  Elapsed_Time()
    {};
  Elapsed_Time(double t)
    {elapsed_time = t;};
  Elapsed_Time(Timer_Tick t)
    {elapsed_time = (double)t * Current_Timer::get_resolution();};
  operator double()
    {return elapsed_time;};
  operator Timer_Tick()
    {return Timer_Tick(elapsed_time / Current_Timer::get_resolution());};

private:
  double elapsed_time;
};

 
 
 
# 56 "/home/snow/guto/epos/include/chronometer.h"

# 1 "/home/snow/guto/epos/include/system/chronometer.h" 1
 
 
 
 
 



 
 
 

# 1 "/home/snow/guto/epos/include/system/simple_chronometer.h" 1
 
 
 
 
 



 
 
 

# 1 "/home/snow/guto/epos/include/chronometer.h" 1
 
 
 
 
 
# 60 "/home/snow/guto/epos/include/chronometer.h"





# 13 "/home/snow/guto/epos/include/system/simple_chronometer.h" 2


 
 
 
class Simple_Chronometer: public Simple_Timer
{
public:
  Simple_Chronometer();

  void reset();
  void start();
  void lap();
  void stop();
  Timer_Tick read();

protected:
  Timer_Tick start_tick;
  Timer_Tick current_tick;
};

 
 
 
inline Simple_Chronometer::
Simple_Chronometer()
{
  reset();
}

inline void Simple_Chronometer::
reset()
{
  start_tick = current_tick = 0;
}

inline void Simple_Chronometer::
start()
{
  if(start_tick == 0)
    start_tick = get_tick();
}

inline void Simple_Chronometer::
lap()
{
  Timer_Tick aux = get_tick();

  if(start_tick != 0)
    current_tick = aux;
}

inline void Simple_Chronometer::
stop()
{
  Timer_Tick aux = get_tick();

  if(start_tick != 0)
    current_tick = aux;
}

inline Timer_Tick Simple_Chronometer::
read()
{
  Timer_Tick aux = get_tick();

  if(start_tick == 0)
    return 0;
  if(current_tick == 0)
    return aux - start_tick;
  return current_tick - start_tick;
}


# 13 "/home/snow/guto/epos/include/system/chronometer.h" 2


 
 
 
typedef class Current_Chronometer Chronometer;







# 57 "/home/snow/guto/epos/include/chronometer.h" 2








# 3 "epos_send.cc" 2




char buf[8 * 1024 * 1024];

int main()
{
  Elapsed_Time latency;
  double bandwidth;
  Chronometer chrono;
  Network_Adapter na;

  kprintf("Myrinet Send Test\n");
  
  if(!na.is_valid())
  {
    kprintf("Error: can not access Myrinet!\n");
    return -1;
  }
  
  kprintf("Packet size(b)\tLat(ticks)\tLat(us)\t\tBandwidth(Kbytes/s)\n");
  for(int len = 4; len <= sizeof(buf); len <<= 1)
  {
    kprintf("%d\t\t", len);
    na.send(7, buf, len);

    chrono.reset();
    chrono.start();
    for(int i = 0; i < 1000 ; i++)
      na.send(7, buf, len);
    chrono.stop();

    kprintf("%u\t\t", (unsigned)(chrono.read() / 1000 ));

    latency = Elapsed_Time(chrono.read()) / 1000 ;
    kprintf("%u\t\t", (unsigned)(latency * 1E6));

    bandwidth = len / latency;
    kprintf("%u\n", (unsigned)(bandwidth / 1024));
  }
  kprintf("Finish!");

  return 0;
}
ld -E -ansi -fno-exceptions -O3 -DGENERATE -L/home/snow/guto/epos/lib -L/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/ -Bstatic -n -Ttext 0x0 -Tdata 0x00400000 -R/home/snow/guto/epos/src/system/system /home/snow/guto/epos/lib/start.o epos_send.o -lstdc++ -lepos -lgcc -lc -lgcc
