xref: /haiku/src/system/kernel/arch/generic/debug_uart.cpp (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright 2006-2022, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <arch/generic/debug_uart.h>
8 
9 
10 void
11 DebugUART::Out8(int reg, uint8 value)
12 {
13 #if defined(__ARM__) || defined(__aarch64__)
14 	// 32-bit aligned
15 	*((uint8 *)Base() + reg * sizeof(uint32)) = value;
16 #elif defined(__i386__) || defined(__x86_64__)
17 	// outb for access to IO space.
18 	if ((Base() + reg) <= 0xFFFF)
19 		__asm__ volatile ("outb %%al,%%dx" : : "a" (value), "d" (Base() + reg));
20 	else
21 		*((uint8 *)Base() + reg) = value;
22 #else
23 	*((uint8 *)Base() + reg) = value;
24 #endif
25 }
26 
27 
28 uint8
29 DebugUART::In8(int reg)
30 {
31 #if defined(__ARM__) || defined(__aarch64__)
32 	// 32-bit aligned
33 	return *((uint8 *)Base() + reg * sizeof(uint32));
34 #elif defined(__i386__) || defined(__x86_64__)
35 	// inb for access to IO space.
36 	if ((Base() + reg) <= 0xFFFF) {
37 		uint8 _v;
38 		__asm__ volatile ("inb %%dx,%%al" : "=a" (_v) : "d" (Base() + reg));
39 		return _v;
40 	}
41 	return *((uint8 *)Base() + reg);
42 #else
43 	return *((uint8 *)Base() + reg);
44 #endif
45 }
46 
47 
48 void
49 DebugUART::Barrier()
50 {
51 	// Simple memory barriers
52 #if defined(__POWERPC__)
53 	asm volatile("eieio; sync");
54 #elif defined(__ARM__) || defined(__aarch64__)
55 	asm volatile ("" : : : "memory");
56 #endif
57 }
58