Minor changes on sys_time

A get/set flag determines whether to read or write time.
This commit is contained in:
Bahadir Balban
2008-04-18 01:03:39 +01:00
parent a87914910c
commit 5563cc1c6b
3 changed files with 47 additions and 16 deletions

View File

@@ -76,28 +76,39 @@ void update_system_time(void)
int sys_time(struct syscall_args *args)
{
struct time_info *ti = (struct time_info *)args->r0;
int set = (int)args->r1;
int retries = 20;
if (check_access((unsigned long)ti, sizeof(*ti), MAP_USR_RW_FLAGS) < 0)
return -EINVAL;
while(retries > 0) {
systime.reader = 1;
memcpy(ti, &systime, sizeof(*ti));
retries--;
/* Get time */
if (!set) {
while(retries > 0) {
systime.reader = 1;
memcpy(ti, &systime, sizeof(*ti));
retries--;
if (systime.reader)
break;
if (systime.reader)
break;
}
/*
* No need to reset reader since it will be reset
* on next timer. If no retries return busy.
*/
if (!retries)
return -EBUSY;
else
return 0;
/* Set */
} else {
/*
* Setting the time not supported yet.
*/
return -ENOSYS;
}
/*
* No need to reset reader since it will be reset
* on next timer. If no retries return busy.
*/
if (!retries)
return -EBUSY;
else
return 0;
}
void update_process_times(void)

View File

@@ -99,12 +99,22 @@ void handle_fs_requests(void)
void main(void)
{
struct time_info ti;
printf("\n%s: Started with tid: %d\n", __TASKNAME__, self_tid());
initialise();
wait_pager(PAGER_TID);
if (l4_time(&ti, 0) < 0) {
printf("Reading the time has failed.\n");
} else {
printf("Current time since system started: %u ticks, "
"%u seconds, %u minutes, %u hours, %llu days.\n",
ti.thz, ti.sec, ti.min, ti.hour, ti.day);
}
printf("%s: Listening requests.\n", __TASKNAME__);
while (1) {
handle_fs_requests();

View File

@@ -68,7 +68,17 @@ typedef int (*__l4_kmem_control_t)(unsigned long pfn, int npages, int grant);
extern __l4_kmem_control_t __l4_kmem_control;
int l4_kmem_control(unsigned long pfn, int npages, int grant);
typedef int (*__l4_time_t)(void *time_info, int set);
/* Represents time since epoch, a c0 specific structure. */
struct time_info {
int reader;
u32 thz; /* Ticks in this hertz so far */
u32 sec;
u32 min;
u32 hour;
u64 day;
};
typedef int (*__l4_time_t)(struct time_info *ti, int set);
extern __l4_time_t __l4_time;
int l4_time(void *time_info, int set);