Implement serial logging. Finish modularizing power management.
[monolithium.git] / kernel / include / common.h
1 /*
2  * common.h
3  *
4  * Copyright (C) 2016 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _COMMON_H_
21 #define _COMMON_H_
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sdk/defs.h>
26
27 /* Monolithium-specific Helper Macros */
28 #define SEGMENT_RPL(x) ((x) & 0x03)
29 #define MIN(a, b) ((a) < (b) ? (a) : (b))
30 #define MAX(a, b) ((a) > (b) ? (a) : (b))
31
32 #define VIDEO_MEMORY      0xF0000000
33 #define TEXT_VIDEO_MEMORY 0xB8000
34 #define TEXT_WIDTH        80
35 #define TEXT_HEIGHT       25
36
37 #define DOUBLE_HORIZONTAL_BAR    0xCD
38 #define DOUBLE_VERTICAL_BAR      0xBA
39 #define DOUBLE_CORNER_LEFT_MID   0xBA
40 #define DOUBLE_CORNER_LEFT_DOWN  0xBB
41 #define DOUBLE_CORNER_LEFT_UP    0xBC
42 #define DOUBLE_CORNER_RIGHT_UP   0xC8
43 #define DOUBLE_CORNER_RIGHT_DOWN 0xC9
44 #define DOUBLE_CORNER_RIGHT_MID  0xCC
45
46 #define IO_PORT_FUNCTIONS(s, t) \
47     static inline t inport##s(word_t port) \
48     { \
49         t value; \
50         asm volatile ("in" #s " %1, %0\n" : "=a"(value) : "Nd"(port)); \
51         return value; \
52     } \
53     \
54     static inline void outport##s(word_t port, t value) \
55     { \
56         asm volatile ("out" #s " %0, %1\n" :: "a"(value), "Nd"(port)); \
57     } \
58     \
59     static inline void inportbuf##s(word_t port, t *buffer, size_t size) \
60     { \
61         asm volatile("cld\n" \
62                      "rep; ins" #s "\n" \
63                      :"+D"(buffer), "+c"(size) \
64                      : "d"(port) \
65                      : "cc"); \
66     } \
67     \
68     static inline void outportbuf##s(word_t port, const t *buffer, size_t size) \
69     { \
70         asm volatile("cld\n" \
71                      "rep; outs\n" \
72                      : "+S"(buffer), "+c"(size) \
73                      : "d"(port) \
74                      : "cc"); \
75     }
76
77 IO_PORT_FUNCTIONS(b, byte_t)
78 IO_PORT_FUNCTIONS(w, word_t)
79 IO_PORT_FUNCTIONS(l, dword_t)
80
81 static inline bool_t check_ints()
82 {
83     dword_t eflags;
84     asm volatile ("pushfl\n"
85                   "popl %0"
86                   : "=g"(eflags));
87     return (eflags & 0x200) != 0 ? TRUE : FALSE;
88 }
89
90 static inline bool_t enable_ints()
91 {
92     bool_t old = check_ints();
93     asm volatile ("sti");
94     return old;
95 }
96
97 static inline bool_t disable_ints()
98 {
99     bool_t old = check_ints();
100     asm volatile ("cli");
101     return old;
102 }
103
104 static inline void halt()
105 {
106     asm volatile ("hlt");
107 }
108
109 static inline void enable_nmi()
110 {
111     outportb(0x70, inportb(0x70) & 0x7F);
112 }
113
114 static inline void disable_nmi()
115 {
116     outportb(0x70, inportb(0x70) | 0x80);
117 }
118
119 #endif