-
Notifications
You must be signed in to change notification settings - Fork 411
/
Copy pathin_rtc.S
91 lines (68 loc) · 1.47 KB
/
in_rtc.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
# in RTC
Real time clock.
Gives wall time with precision of seconds.
Uses a separate battery to keep going.
http://stackoverflow.com/questions/1465927/how-can-i-access-system-time-using-nasm
http://wiki.osdev.org/RTC
http://wiki.osdev.org/CMOS
Kenrel 4.2 usage: https://github.com/torvalds/linux/blob/v4.2/arch/x86/kernel/rtc.c#L121
## Milliseconds
Not possible. Must use the PIT.
## Time zone
QEMU uses UTC.
*/
#include "common.h"
BEGIN
/*
TODO what do those numbers mean? Where is this all documented?
*/
.equ RTCaddress, 0x70
.equ RTCdata, 0x71
update_in_progress:
mov $10, %al
out %al, $RTCaddress
in $RTCdata, %al
testb $0x80, %al
jne update_in_progress
/* Second. */
mov $0, %al
out %al, $RTCaddress
in $RTCdata, %al
/* Only print if second changed. */
cmp %al, %cl
je update_in_progress
mov %al, %cl
PRINT_HEX <%al>
PUTC
/* Minute. */
mov $0x02, %al
out %al, $RTCaddress
in $RTCdata, %al
PRINT_HEX <%al>
PUTC
/* Hour. */
mov $0x04, %al
out %al, $RTCaddress
in $RTCdata, %al
PRINT_HEX <%al>
PUTC
/* Day. */
mov $0x07, %al
out %al, $RTCaddress
in $RTCdata, %al
PRINT_HEX <%al>
PUTC
/* Month. */
mov $0x08, %al
out %al, $RTCaddress
in $RTCdata, %al
PRINT_HEX <%al>
PUTC
/* Year. */
mov $0x09, %al
out %al, $RTCaddress
in $RTCdata, %al
PRINT_HEX <%al>
PRINT_NEWLINE
jmp update_in_progress