static inline void port_out( int value, int port )
{
__asm__ volatile ("outb %0,%1"
: : "a" ((unsigned char)value), "d" ((unsigned short)port));
}
static inline void port_outw( int value, int port ) {
__asm__ volatile("outw %0,%1"
: : "a" ((unsigned short)value), "d" ((unsigned short)port));
}
static inline int port_in( int port )
{
unsigned char value;
__asm__ volatile ("inb %1,%0"
: "=a" (value)
: "d" ((unsigned short)port));
return value;
}
static inline int port_inw( int port )
{
unsigned short value;
__asm__ volatile ("inw %1,%0"
: "=a" (value)
: "d" ((unsigned short)port));
return value;
}
#define inb port_in
#define inw port_inw
#define outb(port, value) port_out(value, port)
#define outw(port, value) port_outw(value, port)
#ifdef __linux__
int io_enable(void)
{
ioperm(0x70, 1, 1);
ioperm(0x71, 1, 1);
return 0;
}
#endif
#ifdef __linux__
int io_disable(void)
{
ioperm(0x70, 0, 1);
ioperm(0x71, 0, 1);
return 0;
}
#endif
int get_cmos(int index)
{
int r;
#ifdef __linux__
io_enable();
#endif
outb(0x70, index);
r = inb(0x71);
#ifdef __linux__
io_disable();
#endif
return r;
}
int set_cmos(int index, int value)
{
#ifdef __linux__
io_enable();
#endif
outb(0x70, index);
outb(0x71, value);
return 0;
}
int get_physmem(int offset)
{
int r = -1;
int mem_fd, i;
u_char *memptr = valloc(0x10000);
u_char *p;
mem_fd = open("/dev/mem", O_RDWR);
if (mem_fd == -1){
return -1;
}
mmap(memptr,
0x10000,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED | MAP_FIXED,
mem_fd,
0x00000);
p = memptr + offset;
r = *p;
close(mem_fd);
munmap(memptr, 0x10000);
free(memptr);
return r;
}
int set_physmem(int offset, int value)
{
int mem_fd, i;
u_char *memptr = valloc(0x10000);
u_char *p;
mem_fd = open("/dev/mem", O_RDWR);
if (mem_fd == -1){
return -1;
}
mmap(memptr,
0x10000,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED | MAP_FIXED,
mem_fd,
0x00000);
p = memptr + offset;
*p = value;
close(mem_fd);
munmap(memptr, 0x10000);
free(memptr);
return 0;
}
int a2i(char s)
{
int r;
r = -1;
if (s >= '0' && s <= '9') r = s - '0';
return r;
}
char i2a(int i)
{
char r;
r = ' ';
if (i >= 0 && i <= 9) r = i + '0';
return r;
}
int islibretto(void)
{
int r=1;
int mem_fd, i;
u_char *memptr = valloc(0x10000);
u_char *p;
char s[5];
mem_fd = open("/dev/mem", O_RDWR);
if (mem_fd == -1){
printf("Can't open /dev/mem.\n");
exit(0);
}
mmap(memptr,
1024,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED | MAP_FIXED,
mem_fd,
0xf0000);
p = memptr + 0x004c;
for (i=0; i<4; i++) s[i] = *p++;
s[4] = '\0';
if (strcmp(s, "20CT") == 0) r = 0;
else if (strcmp(s, "50CT") == 0) r = 0;
close(mem_fd);
munmap(memptr, 0x10000);
free(memptr);
return r;
}
syntax highlighted by Code2HTML, v. 0.9.1