00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __cpu_h
00009 #define __cpu_h
00010
00011 #include <system/config.h>
00012
00013 __BEGIN_SYS
00014
00015 class CPU_Common
00016 {
00017 protected:
00018 CPU_Common() {}
00019
00020 public:
00021 typedef unsigned char Reg8;
00022 typedef unsigned short Reg16;
00023 typedef unsigned long Reg32;
00024 typedef unsigned long long Reg64;
00025
00026 class Log_Addr {
00027 public:
00028 Log_Addr() {}
00029 Log_Addr(const Log_Addr & a) : _addr(a._addr) {}
00030 Log_Addr(unsigned int a) : _addr(a) {}
00031 template <typename T>
00032 Log_Addr(T * a) : _addr(reinterpret_cast<unsigned int>(a)) {}
00033
00034 operator unsigned int() const { return _addr; }
00035 template <typename T>
00036 operator T *() const { return reinterpret_cast<T *>(_addr); }
00037
00038 template <typename T>
00039 bool operator==(T a) const { return (_addr == (unsigned int)a); }
00040 template <typename T>
00041 bool operator< (T a) const { return (_addr < (unsigned int)a); }
00042 template <typename T>
00043 bool operator> (T a) const { return (_addr > (unsigned int)a); }
00044 template <typename T>
00045 bool operator>=(T a) const { return (_addr >= (unsigned int)a); }
00046 template <typename T>
00047 bool operator<=(T a) const { return (_addr <= (unsigned int)a); }
00048
00049 template <typename T>
00050 Log_Addr operator-(T a) const { return _addr - (unsigned int)a; }
00051 template <typename T>
00052 Log_Addr operator+(T a) const { return _addr + (unsigned int)a; }
00053 template <typename T>
00054 Log_Addr & operator+=(T a) { _addr += a; return *this; }
00055 template <typename T>
00056 Log_Addr & operator-=(T a) { _addr -= a; return *this; }
00057 template <typename T>
00058 Log_Addr & operator&=(T a) { _addr &= a; return *this; }
00059
00060 friend Debug & operator << (Debug & db, Log_Addr a)
00061 { db << (void *)a._addr; return db; }
00062
00063 private:
00064 unsigned int _addr;
00065 };
00066 typedef Log_Addr Phy_Addr;
00067
00068 typedef unsigned long Hertz;
00069
00070 class Context;
00071
00072 public:
00073 static void halt() { for(;;); }
00074
00075 static bool tsl(volatile bool & lock) {
00076 bool old = lock;
00077 lock = 1;
00078 return old;
00079 }
00080 static int finc(volatile int & number) {
00081 int old = number;
00082 number++;
00083 return old;
00084 }
00085 static int fdec(volatile int & number) {
00086 int old = number;
00087 number--;
00088 return old;
00089 }
00090
00091 protected:
00092 static Reg32 htonl_lsb(Reg32 v) {
00093 return (((v << 24) & 0xff000000) | ((v << 8) & 0x00ff0000) |
00094 ((v >> 8) & 0x0000ff00) | ((v >> 24) & 0x000000ff));
00095 }
00096 static Reg16 htons_lsb(Reg16 v) {
00097 return ((v << 8) & 0xFF00) | ((v >> 8) & 0x00FF);
00098 }
00099 static Reg32 ntohl_lsb(Reg32 v) {
00100 return htonl_lsb(v);
00101 }
00102 static Reg16 ntohs_lsb(Reg16 v) {
00103 return htons_lsb(v);
00104 }
00105
00106 static Reg32 htonl_msb(Reg32 v) {
00107 return v;
00108 }
00109 static Reg16 htons_msb(Reg16 v) {
00110 return v;
00111 }
00112 static Reg32 ntohl_msb(Reg32 v) {
00113 return v;
00114 }
00115 static Reg16 ntohs_msb(Reg16 v) {
00116 return v;
00117 }
00118 };
00119
00120 __END_SYS
00121
00122 #include __HEADER_ARCH(cpu)
00123
00124 #endif