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
|
/****************************************************************************************/
/* */
/* 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
;; 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
section .data
n_body: db "Please plug in computer", 0x0
fmt: db "%s", 0xa, 0x0
errmsg: db "Failed to read battery informations", 0xa, 0x0
errlen: equ $ - errmsg
|