26
26
27
27
#include <pthread.h>
28
28
#include <string.h>
29
- #include <assert.h>
30
29
#include <stddef.h>
31
30
#include <stdbool.h>
32
31
#include <stdio.h>
33
32
#include <stdlib.h>
34
33
#include <time.h>
34
+ #include <errno.h>
35
35
36
36
#include "vmmapi.h"
37
37
#include "inout.h"
@@ -231,8 +231,6 @@ vrtc_curtime(struct vrtc *vrtc, time_t *basetime)
231
231
if (update_enabled (vrtc )) {
232
232
now = time (NULL );
233
233
delta = now - vrtc -> base_uptime ;
234
- assert (delta >= 0 );
235
-
236
234
secs = delta ;
237
235
t += secs ;
238
236
* basetime += secs ;
@@ -308,21 +306,11 @@ clk_ts_to_ct(struct timespec *ts, struct clktime *ct)
308
306
rsec = rsec % 60 ;
309
307
ct -> sec = rsec ;
310
308
ct -> nsec = ts -> tv_nsec ;
311
-
312
- assert (ct -> year >= 0 && ct -> year < 10000 );
313
- assert (ct -> mon >= 1 && ct -> mon <= 12 );
314
- assert (ct -> day >= 1 && ct -> day <= 31 );
315
- assert (ct -> hour >= 0 && ct -> hour <= 23 );
316
- assert (ct -> min >= 0 && ct -> min <= 59 );
317
- /* Not sure if this interface needs to handle leapseconds or not. */
318
- assert (ct -> sec >= 0 && ct -> sec <= 60 );
319
309
}
320
310
321
311
static inline uint8_t
322
312
rtcset (struct rtcdev * rtc , int val )
323
313
{
324
- assert (val >= 0 && val < 100 );
325
-
326
314
return ((rtc -> reg_b & RTCSB_BIN ) ? val : bin2bcd_data [val ]);
327
315
}
328
316
@@ -396,10 +384,9 @@ secs_to_rtc(time_t rtctime, struct vrtc *vrtc, int force_update)
396
384
struct rtcdev * rtc ;
397
385
int hour ;
398
386
399
- if (rtctime < 0 ) {
400
- assert ( rtctime == VRTC_BROKEN_TIME );
387
+ if (rtctime < 0 )
388
+ /* VRTC_BROKEN_TIME case*/
401
389
return ;
402
- }
403
390
404
391
/*
405
392
* If the RTC is halted then the guest has "ownership" of the
@@ -413,13 +400,11 @@ secs_to_rtc(time_t rtctime, struct vrtc *vrtc, int force_update)
413
400
ts .tv_nsec = 0 ;
414
401
clk_ts_to_ct (& ts , & ct );
415
402
416
- assert (ct .sec >= 0 && ct .sec <= 59 );
417
- assert (ct .min >= 0 && ct .min <= 59 );
418
- assert (ct .hour >= 0 && ct .hour <= 23 );
419
- assert (ct .dow >= 0 && ct .dow <= 6 );
420
- assert (ct .day >= 1 && ct .day <= 31 );
421
- assert (ct .mon >= 1 && ct .mon <= 12 );
422
- assert (ct .year >= POSIX_BASE_YEAR );
403
+ if ((ct .sec < 0 || ct .sec > 59 ) || (ct .min < 0 || ct .min > 59 )
404
+ || (ct .hour < 0 || ct .hour > 23 ) || (ct .dow < 0 || ct .dow > 6 )
405
+ || (ct .day < 1 || ct .day > 31 ) || (ct .mon < 1 || ct .mon > 12 )
406
+ || (ct .year < POSIX_BASE_YEAR ))
407
+ return ;
423
408
424
409
rtc = & vrtc -> rtcdev ;
425
410
rtc -> sec = rtcset (rtc , ct .sec );
@@ -582,7 +567,7 @@ vrtc_start_timer(struct acrn_timer *timer, time_t sec, time_t nsec)
582
567
/*set the delay time it will be started when timer_setting*/
583
568
ts .it_value .tv_sec = sec ;
584
569
ts .it_value .tv_nsec = nsec ;
585
- assert ( acrn_timer_settime (timer , & ts ) == 0 );
570
+ acrn_timer_settime (timer , & ts );
586
571
}
587
572
588
573
static int
@@ -735,7 +720,6 @@ vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval)
735
720
struct rtcdev * rtc ;
736
721
time_t oldfreq , newfreq , basetime ;
737
722
time_t curtime , rtctime ;
738
- int error ;
739
723
uint8_t oldval , changed ;
740
724
741
725
rtc = & vrtc -> rtcdev ;
@@ -759,7 +743,8 @@ vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval)
759
743
}
760
744
} else {
761
745
curtime = vrtc_curtime (vrtc , & basetime );
762
- assert (curtime == vrtc -> base_rtctime );
746
+ if (curtime != vrtc -> base_rtctime )
747
+ return -1 ;
763
748
764
749
/*
765
750
* Force a refresh of the RTC date/time fields so
@@ -775,8 +760,8 @@ vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval)
775
760
rtctime = VRTC_BROKEN_TIME ;
776
761
rtc -> reg_b &= ~RTCSB_UINTR ;
777
762
}
778
- error = vrtc_time_update (vrtc , rtctime , basetime );
779
- assert ( error == 0 ) ;
763
+ if ( vrtc_time_update (vrtc , rtctime , basetime ) != 0 )
764
+ return -1 ;
780
765
}
781
766
782
767
/*
@@ -981,8 +966,7 @@ vrtc_data_handler(struct vmctx *ctx, int vcpu, int in, int port,
981
966
if (offset == RTC_CENTURY && !rtc_halted (vrtc )) {
982
967
curtime = rtc_to_secs (vrtc );
983
968
error = vrtc_time_update (vrtc , curtime , time (NULL ));
984
- assert (!error );
985
- if (curtime == VRTC_BROKEN_TIME && rtc_flag_broken_time )
969
+ if ((error != 0 ) || (curtime == VRTC_BROKEN_TIME && rtc_flag_broken_time ))
986
970
error = -1 ;
987
971
}
988
972
}
@@ -1020,7 +1004,9 @@ vrtc_init(struct vmctx *ctx)
1020
1004
struct inout_port rtc_addr , rtc_data ;
1021
1005
1022
1006
vrtc = calloc (1 , sizeof (struct vrtc ));
1023
- assert (vrtc != NULL );
1007
+ if (vrtc == NULL )
1008
+ return - ENOMEM ;
1009
+
1024
1010
vrtc -> vm = ctx ;
1025
1011
ctx -> vrtc = vrtc ;
1026
1012
@@ -1033,20 +1019,37 @@ vrtc_init(struct vmctx *ctx)
1033
1019
* 0x5b/0x5c/0x5d - 64KB chunks above 4GB
1034
1020
*/
1035
1021
lomem = vm_get_lowmem_size (ctx );
1036
- assert (lomem >= 16 * MB );
1022
+ if (lomem < 16 * MB ) {
1023
+ err = - EINVAL ;
1024
+ goto fail ;
1025
+ }
1026
+
1037
1027
lomem = (lomem - 16 * MB ) / (64 * KB );
1038
- err = vrtc_nvram_write (vrtc , RTC_LMEM_LSB , lomem );
1039
- assert (err == 0 );
1040
- err = vrtc_nvram_write (vrtc , RTC_LMEM_MSB , lomem >> 8 );
1041
- assert (err == 0 );
1028
+ if (vrtc_nvram_write (vrtc , RTC_LMEM_LSB , lomem ) != 0 ) {
1029
+ err = - EIO ;
1030
+ goto fail ;
1031
+ }
1032
+
1033
+ if (vrtc_nvram_write (vrtc , RTC_LMEM_MSB , lomem >> 8 ) != 0 ) {
1034
+ err = - EIO ;
1035
+ goto fail ;
1036
+ }
1042
1037
1043
1038
himem = vm_get_highmem_size (ctx ) / (64 * KB );
1044
- err = vrtc_nvram_write (vrtc , RTC_HMEM_LSB , himem );
1045
- assert (err == 0 );
1046
- err = vrtc_nvram_write (vrtc , RTC_HMEM_SB , himem >> 8 );
1047
- assert (err == 0 );
1048
- err = vrtc_nvram_write (vrtc , RTC_HMEM_MSB , himem >> 16 );
1049
- assert (err == 0 );
1039
+ if (vrtc_nvram_write (vrtc , RTC_HMEM_LSB , himem ) != 0 ) {
1040
+ err = - EIO ;
1041
+ goto fail ;
1042
+ }
1043
+
1044
+ if (vrtc_nvram_write (vrtc , RTC_HMEM_SB , himem >> 8 ) != 0 ) {
1045
+ err = - EIO ;
1046
+ goto fail ;
1047
+ }
1048
+
1049
+ if (vrtc_nvram_write (vrtc , RTC_HMEM_MSB , himem >> 16 ) != 0 ) {
1050
+ err = - EIO ;
1051
+ goto fail ;
1052
+ }
1050
1053
1051
1054
memset (& rtc_addr , 0 , sizeof (struct inout_port ));
1052
1055
memset (& rtc_data , 0 , sizeof (struct inout_port ));
@@ -1057,7 +1060,10 @@ vrtc_init(struct vmctx *ctx)
1057
1060
rtc_addr .flags = IOPORT_F_INOUT ;
1058
1061
rtc_addr .handler = vrtc_addr_handler ;
1059
1062
rtc_addr .arg = vrtc ;
1060
- assert (register_inout (& rtc_addr ) == 0 );
1063
+ if (register_inout (& rtc_addr ) != 0 ) {
1064
+ err = - EINVAL ;
1065
+ goto fail ;
1066
+ }
1061
1067
1062
1068
/*register io port handler for rtc data*/
1063
1069
rtc_data .name = "rtc" ;
@@ -1066,7 +1072,10 @@ vrtc_init(struct vmctx *ctx)
1066
1072
rtc_data .flags = IOPORT_F_INOUT ;
1067
1073
rtc_data .handler = vrtc_data_handler ;
1068
1074
rtc_data .arg = vrtc ;
1069
- assert (register_inout (& rtc_data ) == 0 );
1075
+ if (register_inout (& rtc_data ) != 0 ) {
1076
+ err = - EINVAL ;
1077
+ goto fail ;
1078
+ }
1070
1079
1071
1080
/* Allow dividers o keep time but disable everything else */
1072
1081
rtc = & vrtc -> rtcdev ;
@@ -1100,6 +1109,10 @@ vrtc_init(struct vmctx *ctx)
1100
1109
vrtc_start_timer (& vrtc -> update_timer , 1 , 0 );
1101
1110
1102
1111
return 0 ;
1112
+
1113
+ fail :
1114
+ free (vrtc );
1115
+ return err ;
1103
1116
}
1104
1117
1105
1118
void
0 commit comments