forked from Bananymous/banan-os
				
			Kernel/LibC: add clock_gettime() for CLOCK_MONOTONIC
This gets the number of milliseconds since boot
This commit is contained in:
		
							parent
							
								
									86df258365
								
							
						
					
					
						commit
						3c068aa0ae
					
				| 
						 | 
				
			
			@ -99,6 +99,8 @@ namespace Kernel
 | 
			
		|||
 | 
			
		||||
		BAN::ErrorOr<long> sys_termid(char*) const;
 | 
			
		||||
 | 
			
		||||
		BAN::ErrorOr<long> sys_clock_gettime(clockid_t, timespec*) const;
 | 
			
		||||
 | 
			
		||||
		TTY& tty() { ASSERT(m_tty); return *m_tty; }
 | 
			
		||||
 | 
			
		||||
		static Process& current() { return Thread::current().process(); }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -835,6 +835,24 @@ namespace Kernel
 | 
			
		|||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	BAN::ErrorOr<long> Process::sys_clock_gettime(clockid_t clock_id, timespec* tp) const
 | 
			
		||||
	{
 | 
			
		||||
		switch (clock_id)
 | 
			
		||||
		{
 | 
			
		||||
			case CLOCK_MONOTONIC:
 | 
			
		||||
			{
 | 
			
		||||
				uint64_t time_ms = PIT::ms_since_boot();
 | 
			
		||||
				tp->tv_sec  =  time_ms / 1000;
 | 
			
		||||
				tp->tv_nsec = (time_ms % 1000) * 1000000;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			default:
 | 
			
		||||
				return BAN::Error::from_errno(ENOTSUP);
 | 
			
		||||
		}
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BAN::ErrorOr<long> Process::sys_setuid(uid_t uid)
 | 
			
		||||
	{
 | 
			
		||||
		if (uid < 0 || uid >= 1'000'000'000)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -129,6 +129,9 @@ namespace Kernel
 | 
			
		|||
		case SYS_SET_PWD:
 | 
			
		||||
			ret = Process::current().sys_setpwd((const char*)arg1);
 | 
			
		||||
			break;
 | 
			
		||||
		case SYS_CLOCK_GETTIME:
 | 
			
		||||
			ret = Process::current().sys_clock_gettime((clockid_t)arg1, (timespec*)arg2);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			dwarnln("Unknown syscall {}", syscall);
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ set(LIBC_SOURCES
 | 
			
		|||
	sys/stat.cpp
 | 
			
		||||
	sys/wait.cpp
 | 
			
		||||
	termios.cpp
 | 
			
		||||
	time.cpp
 | 
			
		||||
	unistd.cpp
 | 
			
		||||
	math.S
 | 
			
		||||
	icxxabi.cpp
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ __BEGIN_DECLS
 | 
			
		|||
#define SYS_GET_EGID 31
 | 
			
		||||
#define SYS_GET_PWD 32
 | 
			
		||||
#define SYS_SET_PWD 33
 | 
			
		||||
#define SYS_CLOCK_GETTIME 34
 | 
			
		||||
 | 
			
		||||
__END_DECLS
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
#include <sys/syscall.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
int clock_gettime(clockid_t clock_id, struct timespec* tp)
 | 
			
		||||
{
 | 
			
		||||
	return syscall(SYS_CLOCK_GETTIME, clock_id, tp);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -244,6 +244,13 @@ long syscall(long syscall, ...)
 | 
			
		|||
			ret = Kernel::syscall(SYS_SET_PWD, (uintptr_t)path);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		case SYS_CLOCK_GETTIME:
 | 
			
		||||
		{
 | 
			
		||||
			clockid_t clock_id = va_arg(args, clockid_t);
 | 
			
		||||
			timespec* tp = va_arg(args, timespec*);
 | 
			
		||||
			ret = Kernel::syscall(SYS_CLOCK_GETTIME, clock_id, (uintptr_t)tp);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		default:
 | 
			
		||||
			puts("LibC: Unhandeled syscall");
 | 
			
		||||
			ret = -ENOSYS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue