blob: 553fd606c580eeb56a59766d7ea170c3be30fb61 [file] [log] [blame]
#ifndef ALPHA_H
#define ALPHA_H
/* this file is included by x86.h */
#include "alpha/ioport.h"
#ifndef __ASSEMBLY__
#include "types.h" // u32
#include "byteorder.h" // le16_to_cpu
static inline void irq_disable(void)
{
/* TODO ? */
}
static inline void irq_enable(void)
{
/* TODO ? */
}
static inline void cpu_relax(void)
{
/* TODO ? */
}
extern void hlt(void);
static inline void nop(void)
{
asm volatile("nop");
}
static inline void wbinvd(void)
{
barrier(); // __sync_synchronize();
}
static inline u32 __ffs(unsigned long x)
{
return __builtin_ctzl(x);
/*
({ unsigned long __kir; \
__asm__(".arch ev67; cttz %1,%0" : "=r"(__kir) : "r"(x)); \
__kir; })
*/
}
static inline u32 __fls(unsigned long x)
{
return 64 - __ffs(x);
}
static inline u32 rol(u32 val, u16 rol) {
u32 res, resr;
res = val << rol;
resr = val >> (32-rol);
res |= resr;
return res;
}
static inline u32 ror(u32 word, unsigned int shift)
{
return (word >> (shift & 31)) | (word << ((-shift) & 31));
}
#include "alpha/protos.h" /* for outl, outw, inb ... */
static inline unsigned long rdtscll(void)
{
return get_wall_time();
}
static inline void insb(portaddr_t port, u8 *data, u32 count) {
while (count--)
*data++ = inb(port);
}
static inline void insw(portaddr_t port, u16 *data, u32 count) {
while (count--)
*data++ = inw(port);
}
static inline void insl(portaddr_t port, u32 *data, u32 count) {
while (count--)
*data++ = inl(port);
}
// XXX - outs not limited to es segment
static inline void outsb(portaddr_t port, u8 *data, u32 count) {
while (count--)
outb(*data++, port);
}
static inline void outsw(portaddr_t port, u16 *data, u32 count) {
while (count--) {
outw(*data, port);
data++;
}
}
static inline void outsl(portaddr_t port, u32 *data, u32 count) {
while (count--) {
outl(*data, port);
data++;
}
}
/* Compiler barrier is enough as an x86 CPU does not reorder reads or writes */
static inline void smp_rmb(void) {
barrier();
}
static inline void smp_wmb(void) {
barrier();
}
static inline void writel(void *addr, u32 val) {
barrier();
*(volatile u32 *)addr = val;
}
static inline void writew(void *addr, u16 val) {
barrier();
*(volatile u16 *)addr = val;
}
static inline void writeb(void *addr, u8 val) {
barrier();
*(volatile u8 *)addr = val;
}
static inline u64 readq(const void *addr) {
u64 val = *(volatile const u64 *)addr;
barrier();
return val;
}
static inline u32 readl(const void *addr) {
u32 val = *(volatile const u32 *)addr;
barrier();
return val;
}
static inline u16 readw(const void *addr) {
u16 val = *(volatile const u16 *)addr;
barrier();
return val;
}
static inline u8 readb(const void *addr) {
u8 val = *(volatile const u8 *)addr;
barrier();
return val;
}
// FLASH_FLOPPY not supported
#define GDT_CODE (0)
#define GDT_DATA (0)
#define GDT_B (0)
#define GDT_G (0)
#define GDT_BASE(v) ((v) & 0)
#define GDT_LIMIT(v) ((v) & 0)
#define GDT_GRANLIMIT(v) ((v) & 0)
static inline u8 get_a20(void) {
return 0;
}
static inline u8 set_a20(u8 cond) {
return 0;
}
static inline void wrmsr(u32 index, u64 val)
{
}
// x86.c
void cpuid(u32 index, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
#endif // !__ASSEMBLY__
#endif