ulib Time utilities, expose time() syscall

This commit is contained in:
2025-10-16 14:15:27 +02:00
parent 702f0ddf87
commit 7445689010
6 changed files with 50 additions and 2 deletions

View File

@ -16,6 +16,7 @@ SRCFILES := $(call GRABSRC, \
ubsan \ ubsan \
umalloc \ umalloc \
fs \ fs \
time \
) )
CFLAGS += -isystem $(ROOT)/share -isystem $(ROOT)/ulib -isystem $(ROOT)/std/include \ CFLAGS += -isystem $(ROOT)/share -isystem $(ROOT)/ulib -isystem $(ROOT)/std/include \

View File

@ -138,3 +138,7 @@ int32_t dev_stat(DevStat *devstatbuf, size_t idx) {
int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len, void *extra) { int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len, void *extra) {
return syscall(SYS_DEV_CMD, (uint64_t)dev, (uint64_t)cmd, (uint64_t)buf, (uint64_t)len, (uint64_t)extra, 0); return syscall(SYS_DEV_CMD, (uint64_t)dev, (uint64_t)cmd, (uint64_t)buf, (uint64_t)len, (uint64_t)extra, 0);
} }
int32_t time(Time *time) {
return syscall(SYS_TIME, (uint64_t)time, 0, 0, 0, 0, 0);
}

View File

@ -7,6 +7,7 @@
#include <sysdefs/dev.h> #include <sysdefs/dev.h>
#include <sysdefs/proc.h> #include <sysdefs/proc.h>
#include <sysdefs/fs.h> #include <sysdefs/fs.h>
#include <sysdefs/time.h>
void debugprint(const char *string); void debugprint(const char *string);
int32_t mman_map(uint8_t *addr, size_t size, uint64_t prot, uint64_t flags, uint8_t **out); int32_t mman_map(uint8_t *addr, size_t size, uint64_t prot, uint64_t flags, uint8_t **out);
@ -41,5 +42,6 @@ int32_t dev_gethandle(Dev_t *dev, char *name);
int32_t dev_listsize(void); int32_t dev_listsize(void);
int32_t dev_stat(DevStat *devstatbuf, size_t idx); int32_t dev_stat(DevStat *devstatbuf, size_t idx);
int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len, void *extra); int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len, void *extra);
int32_t time(Time *time);
#endif // ULIB_SYSTEM_SYSTEM_H_ #endif // ULIB_SYSTEM_SYSTEM_H_

31
ulib/time/time.c Normal file
View File

@ -0,0 +1,31 @@
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <sysdefs/time.h>
bool time_isleap(uint32_t y) {
return ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0));
}
const uint16_t days_before_month[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
timeunix_t time_tounix(Time *time) {
uint64_t days = 0;
for (uint32_t y = 1970; y < time->year; y++) {
days += time_isleap(y) ? 366 : 365;
}
days += days_before_month[time->month - 1];
if (time->month > 2 && time_isleap(time->year)) {
days += 1;
}
days += time->day - 1;
uint64_t secs = days * 86400;
secs += time->hour * 3600;
secs += time->minute * 60;
secs += time->second;
return secs;
}

8
ulib/time/time.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef ULIB_TIME_TIME_H_
#define ULIB_TIME_TIME_H_
#include <sysdefs/time.h>
timeunix_t time_tounix(Time *time);
#endif // ULIB_TIME_TIME_H_

View File

@ -11,12 +11,13 @@
#include <syscall/syscall.h> #include <syscall/syscall.h>
#include <system/system.h> #include <system/system.h>
#include <util/util.h> #include <util/util.h>
#include <umalloc/umalloc.h>
#include <fs/path.h>
#include <time/time.h>
#include <uprintf.h> #include <uprintf.h>
#include <linklist.h> #include <linklist.h>
#include <log.h> #include <log.h>
#include <assert.h> #include <assert.h>
#include <umalloc/umalloc.h>
#include <fs/path.h>
#include <dlinklist.h> #include <dlinklist.h>
#include <errors.h> #include <errors.h>
@ -25,6 +26,7 @@
#include <sysdefs/mman.h> #include <sysdefs/mman.h>
#include <sysdefs/proc.h> #include <sysdefs/proc.h>
#include <sysdefs/sched.h> #include <sysdefs/sched.h>
#include <sysdefs/time.h>
#include <sysdefs/syscall.h> #include <sysdefs/syscall.h>
#endif // ULIB_ULIB_H_ #endif // ULIB_ULIB_H_