#ifndef _OS_OSBYTEORDERMACHINE_H
#define _OS_OSBYTEORDERMACHINE_H
#include <libkern/OSBase.h>
OS_INLINE
UInt16
OSReadSwapInt16(
volatile void * base,
UInt offset
)
{
union sconv {
UInt16 us;
UInt8 uc[2];
} *inp, outv;
inp = (union sconv *)((UInt8 *)base + offset);
outv.uc[0] = inp->uc[1];
outv.uc[1] = inp->uc[0];
return (outv.us);
}
OS_INLINE
UInt32
OSReadSwapInt32(
volatile void * base,
UInt offset
)
{
union lconv {
UInt32 ul;
UInt8 uc[4];
} *inp, outv;
inp = (union lconv *)((UInt8 *)base + offset);
outv.uc[0] = inp->uc[3];
outv.uc[1] = inp->uc[2];
outv.uc[2] = inp->uc[1];
outv.uc[3] = inp->uc[0];
return (outv.ul);
}
OS_INLINE
UInt64
OSReadSwapInt64(
volatile void * base,
UInt offset
)
{
union llconv {
UInt64 ull;
UInt8 uc[8];
} *inp, outv;
inp = (union llconv *)((UInt8 *)base + offset);
outv.uc[0] = inp->uc[7];
outv.uc[1] = inp->uc[6];
outv.uc[2] = inp->uc[5];
outv.uc[3] = inp->uc[4];
outv.uc[4] = inp->uc[3];
outv.uc[5] = inp->uc[2];
outv.uc[6] = inp->uc[1];
outv.uc[7] = inp->uc[0];
return (outv.ull);
}
OS_INLINE
UInt
OSReadSwapInt(
volatile void * base,
UInt offset
)
{
return (UInt)OSReadSwapInt32(base, offset);
}
OS_INLINE
void
OSWriteSwapInt16(
volatile void * base,
UInt offset,
UInt16 data
)
{
union sconv {
UInt16 us;
UInt8 uc[2];
} *inp, *outp;
inp = (union sconv *)((UInt8 *)base + offset);
outp = (union sconv *)&data;
outp->uc[0] = inp->uc[1];
outp->uc[1] = inp->uc[0];
}
OS_INLINE
void
OSWriteSwapInt32(
volatile void * base,
UInt offset,
UInt32 data
)
{
union lconv {
UInt32 ul;
UInt8 uc[4];
} *inp, *outp;
inp = (union lconv *)((UInt8 *)base + offset);
outp = (union lconv *)&data;
outp->uc[0] = inp->uc[3];
outp->uc[1] = inp->uc[2];
outp->uc[2] = inp->uc[1];
outp->uc[3] = inp->uc[0];
}
OS_INLINE
void
OSWriteSwapInt64(
volatile void * base,
UInt offset,
UInt64 data
)
{
union llconv {
UInt64 ull;
UInt8 uc[8];
} *inp, *outp;
inp = (union llconv *)((UInt8 *)base + offset);
outp = (union llconv *)&data;
outp->uc[0] = inp->uc[7];
outp->uc[1] = inp->uc[6];
outp->uc[2] = inp->uc[5];
outp->uc[3] = inp->uc[4];
outp->uc[4] = inp->uc[3];
outp->uc[5] = inp->uc[2];
outp->uc[6] = inp->uc[1];
outp->uc[7] = inp->uc[0];
}
OS_INLINE
void
OSWriteSwapInt(
volatile void * base,
UInt offset,
UInt data
)
{
OSWriteSwapInt32(base, offset, (UInt32)data);
}
OS_INLINE
UInt16
OSSwapInt16(
UInt16 data
)
{
UInt16 temp = data;
return OSReadSwapInt16(&temp, 0);
}
OS_INLINE
UInt32
OSSwapInt32(
UInt32 data
)
{
UInt32 temp = data;
return OSReadSwapInt32(&temp, 0);
}
OS_INLINE
UInt64
OSSwapInt64(
UInt64 data
)
{
UInt64 temp = data;
return OSReadSwapInt64(&temp, 0);
}
OS_INLINE
UInt
OSSwapInt(
UInt data
)
{
UInt temp = data;
return OSReadSwapInt(&temp, 0);
}
#endif