13
13
#include <stdio.h>
14
14
#include <stdlib.h>
15
15
#include <string.h>
16
- #include <signal.h>
17
- #include <time.h>
18
16
#include <assert.h>
19
17
#include <stdbool.h>
20
18
21
19
#include "vmmapi.h"
22
20
#include "mevent.h"
23
21
#include "pci_core.h"
22
+ #include "timer.h"
24
23
25
24
#define WDT_REG_BAR_SIZE 0x10
26
25
55
54
#define ESB_UNLOCK1 0x80 /* Step 1 to unlock reset registers */
56
55
#define ESB_UNLOCK2 0x86 /* Step 2 to unlock reset registers */
57
56
58
- #define WDT_TIMER_SIG 0x55AA
59
-
60
57
/* the default 20-bit preload value */
61
58
#define DEFAULT_MAX_TIMER_VAL 0x000FFFFF
62
59
@@ -77,13 +74,13 @@ do { fprintf(dbg_file, format, args); fflush(dbg_file); } while (0)
77
74
#endif
78
75
79
76
struct info_wdt {
77
+ struct acrn_timer timer ;
78
+
80
79
bool reboot_enabled ;/* "reboot" on wdt out */
81
80
82
81
bool locked ; /* If true, enabled field cannot be changed. */
83
82
bool wdt_enabled ; /* If true, watchdog is enabled. */
84
-
85
- bool timer_created ;
86
- timer_t wdt_timerid ;
83
+ bool wdt_armed ;
87
84
88
85
uint32_t timer1_val ;
89
86
uint32_t timer2_val ;
@@ -107,10 +104,10 @@ static void start_wdt_timer(void);
107
104
* action to guest OS
108
105
*/
109
106
static void
110
- wdt_expired_thread ( union sigval v )
107
+ wdt_expired_handler ( void * arg )
111
108
{
112
- DPRINTF ("wdt timer out! id=0x%x, stage=%d, reboot=%d\n" ,
113
- v . sival_int , wdt_state .stage , wdt_state .reboot_enabled );
109
+ DPRINTF ("wdt timer out! stage=%d, reboot=%d\n" ,
110
+ wdt_state .stage , wdt_state .reboot_enabled );
114
111
115
112
if (wdt_state .stage == 1 ) {
116
113
wdt_state .stage = 2 ;
@@ -136,51 +133,20 @@ stop_wdt_timer(void)
136
133
{
137
134
struct itimerspec timer_val ;
138
135
139
- DPRINTF ("%s: timer_created =%d\n" , __func__ , wdt_state .timer_created );
136
+ DPRINTF ("%s: wdt_armed =%d\n" , __func__ , wdt_state .wdt_armed );
140
137
141
- if (!wdt_state .timer_created )
138
+ if (!wdt_state .wdt_armed )
142
139
return ;
143
140
144
141
memset (& timer_val , 0 , sizeof (struct itimerspec ));
145
- timer_settime (wdt_state .wdt_timerid , 0 , & timer_val , NULL );
146
- }
147
-
148
- static void
149
- delete_wdt_timer (void )
150
- {
151
- if (!wdt_state .timer_created )
152
- return ;
153
-
154
- DPRINTF ("%s: timer %ld deleted\n" , __func__ ,
155
- (uint64_t )wdt_state .wdt_timerid );
156
-
157
- timer_delete (wdt_state .wdt_timerid );
158
- wdt_state .timer_created = false;
159
- }
160
-
161
- static void
162
- reset_wdt_timer (int seconds )
163
- {
164
- struct itimerspec timer_val ;
165
-
166
- DPRINTF ("%s: time=%d\n" , __func__ , seconds );
167
- memset (& timer_val , 0 , sizeof (struct itimerspec ));
168
- timer_settime (wdt_state .wdt_timerid , 0 , & timer_val , NULL );
169
-
170
- timer_val .it_value .tv_sec = seconds ;
171
- if (timer_settime (wdt_state .wdt_timerid , 0 , & timer_val , NULL ) == -1 ) {
172
- perror ("timer_settime failed.\n" );
173
- timer_delete (wdt_state .wdt_timerid );
174
- wdt_state .timer_created = 0 ;
175
- exit (-1 );
176
- }
142
+ acrn_timer_settime (& wdt_state .timer , & timer_val );
143
+ wdt_state .wdt_armed = false;
177
144
}
178
145
179
146
static void
180
147
start_wdt_timer (void )
181
148
{
182
149
int seconds ;
183
- struct sigevent sig_evt ;
184
150
struct itimerspec timer_val ;
185
151
186
152
if (!wdt_state .wdt_enabled )
@@ -191,34 +157,19 @@ start_wdt_timer(void)
191
157
else
192
158
seconds = TIMER_TO_SECONDS (wdt_state .timer2_val );
193
159
194
- DPRINTF ("%s: created=%d, time=%d\n" , __func__ ,
195
- wdt_state .timer_created , seconds );
196
- memset (& sig_evt , 0 , sizeof (struct sigevent ));
197
- if (wdt_state .timer_created ) {
198
- reset_wdt_timer (seconds );
199
- return ;
200
- }
201
-
202
- sig_evt .sigev_value .sival_int = WDT_TIMER_SIG ;
203
- sig_evt .sigev_notify = SIGEV_THREAD ;
204
- sig_evt .sigev_notify_function = wdt_expired_thread ;
205
-
206
- if (timer_create (CLOCK_REALTIME , & sig_evt ,
207
- & wdt_state .wdt_timerid ) == -1 ) {
208
- perror ("timer_create failed.\n" );
209
- exit (-1 );
210
- }
160
+ DPRINTF ("%s: armed=%d, time=%d\n" , __func__ ,
161
+ wdt_state .wdt_armed , seconds );
211
162
212
163
memset (& timer_val , 0 , sizeof (struct itimerspec ));
213
164
timer_val .it_value .tv_sec = seconds ;
214
165
215
- if (timer_settime ( wdt_state .wdt_timerid , 0 , & timer_val , NULL ) == -1 ) {
216
- perror ("timer_settime failed.\n" );
217
- timer_delete ( wdt_state .wdt_timerid ) ;
218
- exit ( -1 ) ;
166
+ if (acrn_timer_settime ( & wdt_state .timer , & timer_val ) == -1 ) {
167
+ perror ("WDT timerfd_settime failed.\n" );
168
+ wdt_state .wdt_armed = false ;
169
+ return ;
219
170
}
220
171
221
- wdt_state .timer_created = true;
172
+ wdt_state .wdt_armed = true;
222
173
}
223
174
224
175
static int
@@ -341,14 +292,19 @@ pci_wdt_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts)
341
292
{
342
293
/*the wdt just has one inistance */
343
294
if (wdt_state .reboot_enabled && wdt_state .timer1_val ) {
344
- perror ("wdt can't be created twice, please check!" );
295
+ perror ("wdt can't be initialized twice, please check!" );
345
296
return -1 ;
346
297
}
347
298
348
299
/* init wdt state info */
300
+ wdt_state .timer .clockid = CLOCK_MONOTONIC ;
301
+ if (acrn_timer_init (& wdt_state .timer , wdt_expired_handler , dev ) != 0 ) {
302
+ return -1 ;
303
+ }
304
+
349
305
wdt_state .reboot_enabled = true;
350
306
wdt_state .locked = false;
351
- wdt_state .timer_created = false;
307
+ wdt_state .wdt_armed = false;
352
308
wdt_state .wdt_enabled = false;
353
309
354
310
wdt_state .stage = 1 ;
@@ -377,7 +333,8 @@ pci_wdt_init(struct vmctx *ctx, struct pci_vdev *dev, char *opts)
377
333
static void
378
334
pci_wdt_deinit (struct vmctx * ctx , struct pci_vdev * dev , char * opts )
379
335
{
380
- delete_wdt_timer ();
336
+ acrn_timer_deinit (& wdt_state .timer );
337
+
381
338
memset (& wdt_state , 0 , sizeof (wdt_state ));
382
339
}
383
340
0 commit comments