QDNix
Quick’n’dirty *NIX
mmio.h
1 #ifndef SYS_KERN_MACHINE_H
2 # define SYS_KERN_MACHINE_H 1
3 
4 # include <stdint.h>
5 
6 static __inline__ void
7 mmio_write8(uintptr_t addr, uint8_t value)
8 {
9 #ifdef __i386__
10  __asm__ volatile ( "outb %0, %1" : : "a"(value), "Nd"((uint16_t)addr) );
11 #else
12  *(volatile uint8_t *)(addr) = value;
13 #endif
14 }
15 
16 static __inline__ uint8_t
17 mmio_read8(uintptr_t addr)
18 {
19 #ifdef __i386__
20  uint8_t ret;
21 
22  __asm__ volatile ( "inb %1, %0"
23  : "=a"(ret)
24  : "Nd"((uint16_t)addr) );
25  return (ret);
26 #else
27  return (*(volatile uint8_t *)addr);
28 #endif
29 }
30 
31 static __inline__ void
32 mmio_write16(uintptr_t addr, uint16_t value)
33 {
34  *(volatile uint16_t *)(addr) = value;
35 }
36 
37 static __inline__ uint16_t
38 mmio_read16(uintptr_t addr)
39 {
40  return (*(volatile uint16_t *)addr);
41 }
42 
43 static __inline__ void
44 mmio_write32(uintptr_t addr, uint32_t value)
45 {
46  *(volatile uint32_t *)(addr) = value;
47 }
48 
49 static __inline__ uint32_t
50 mmio_read32(uintptr_t addr)
51 {
52  return (*(volatile uint32_t *)addr);
53 }
54 
55 # if __has_include_next(<sys/machine/mmio.h>)
56 # include_next <sys/machine/mmio.h>
57 # endif
58 
59 #endif /* !SYS_MMIO_H */