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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
/****************************************************************************************/
/* */
/* File : r_loop.asm /_________/ */
/* Author : Joe | */
/* Date : 04/2020 | */
/* Info : The main loop | */
/* / | */
/* \ / */
/* \_____/ */
/* */
/****************************************************************************************/
/***********************************/
/* jo_r_loop(speak (0-1), *argv[]) */
/* ------------------------------- */
/***********************************/
.text
.extern sleep
.extern f_percent
.extern f_status
.extern n_speak
.extern n_notify
.extern r_cpyhead
.globl r_loop
r_loop:
pushq %rbp
pushq %rbx
movq %rsi, %rbx
movq %edi, %ebp
jmp bigloop
bigloop:
callq f_status /* check the status */
cmp $0xfe, %rax /* if sys_open/sys_read failed */
je err
cmp $0x3, %rax
je sleepalot
callq f_percent /* check the capacity */
cmp $0xfe, %rax /* if sys_open/sys_read failed */
je err
cmp $0xf, %rax
jge sleepalot
movq %rax, %rdi
callq r_cpyhead /* notification head */
movq %rax, %rdi
movq $n_body, %rsi /* notification body */
movq $0x3, %rdx /* critical notification */
movq $0x3a98, %rcx /* 15000ms notification timeout */
callq n_notify /* n_notify(head: rdi, body: rsi, */
/* urgency: rdx, timeout: rcx */
speak:
cmp $0x1, %ebp
jne sleepabit
movq (%rbx,0x8,0x2), %rdi
callq n_speak
sleepabit:
movq $0x14, %rdi
callq sleep /* sleep 20 seconds before next check/notification */
jmp bigloop
sleepalot:
movq $0xf0, %rdi
callq sleep /* sleep 240s (4m) if it's fine */
jmp bigloop
return:
xorq %rax, %rax
retq
err:
movq $0x2, %rdi /* stderr */
leaq (rel $errmsg), %rsi
movq $errlen, %rdx
movq $0x4, %rax
syscall /* write error message on stderr */
xorq %rax, %rax
retq
;; section .text
;; extern sleep
;; extern jo_f_percent
;; extern jo_f_status
;; extern jo_n_speak
;; extern jo_n_notify
;; extern jo_r_cpyhead
;; global jo_r_loop
;; jo_r_loop:
;; push rbp
;; push rbx
;; mov rbx, rsi
;; mov ebp, edi
;; jmp bigloop
;; bigloop:
;; call jo_f_status ; check the status
;; cmp rax, 0xfe ; in case we couldn't read
;; je err
;; cmp rax, 0x3
;; je sleepalot
;; call jo_f_percent ; check the capacity
;; cmp rax, 0xfe ; in case we couldn't read
;; je err
;; cmp rax, 0xf
;; jge sleepalot
;; mov rdi, rax
;; call jo_r_cpyhead
;; mov rdi, rax
;; mov rsi, n_body ; notification body
;; mov rdx, 0x3 ; ciritcal notification
;; mov rcx, 0x3a98 ; 15000ms notification timeout
;; call jo_n_notify ; jo_n_notify(head: rdi, body: rsi,
;; ; urgency: rdx, timeout: rcx)
;; speak:
;; cmp ebp, 0x1
;; jne sleepabit
;; mov rdi, [rbx + 0x8 * 0x2]
;; call jo_n_speak
;; sleepabit:
;; mov rdi, 0x14
;; call sleep ; sleep 20 seconds before next check/notification
;; jmp bigloop
;; sleepalot:
;; mov rdi, 0xf0
;; call sleep ; sleep 240s (4m) if it's fine
;; jmp bigloop
;; return:
;; xor rax, rax
;; retq
;; err:
;; mov rdi, 0x2 ; stderr
;; lea rsi, [rel errmsg]
;; mov rdx, errlen
;; mov rax, 0x4
;; syscall ; write error message on stderr
;; xor rax, rax
;; retq
.data
n_body: .asciz "Please plug in computer"
fmt: .asciz "%s", 0xa
errmsg: .asciz "Failed to read battery informations", 0xa
errlen: equ $ - errmsg
|