Rev 1787 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1787 | Rev 2015 | ||
|---|---|---|---|
| Line 52... | Line 52... | ||
| 52 | #include <adt/list.h> |
52 | #include <adt/list.h> |
| 53 | #include <atomic.h> |
53 | #include <atomic.h> |
| 54 | #include <proc/thread.h> |
54 | #include <proc/thread.h> |
| 55 | #include <sysinfo/sysinfo.h> |
55 | #include <sysinfo/sysinfo.h> |
| 56 | #include <arch/barrier.h> |
56 | #include <arch/barrier.h> |
| - | 57 | #include <mm/frame.h> |
|
| - | 58 | #include <ddi/ddi.h> |
|
| - | 59 | ||
| - | 60 | /** Physical memory area of the real time clock. */ |
|
| - | 61 | static parea_t clock_parea; |
|
| 57 | 62 | ||
| 58 | /* Pointers to public variables with time */ |
63 | /* Pointers to public variables with time */ |
| 59 | struct ptime { |
64 | struct ptime { |
| 60 | unative_t seconds1; |
65 | unative_t seconds1; |
| 61 | unative_t useconds; |
66 | unative_t useconds; |
| Line 70... | Line 75... | ||
| 70 | /** Initialize realtime clock counter |
75 | /** Initialize realtime clock counter |
| 71 | * |
76 | * |
| 72 | * The applications (and sometimes kernel) need to access accurate |
77 | * The applications (and sometimes kernel) need to access accurate |
| 73 | * information about realtime data. We allocate 1 page with these |
78 | * information about realtime data. We allocate 1 page with these |
| 74 | * data and update it periodically. |
79 | * data and update it periodically. |
| 75 | * |
- | |
| 76 | * |
- | |
| 77 | */ |
80 | */ |
| 78 | void clock_counter_init(void) |
81 | void clock_counter_init(void) |
| 79 | { |
82 | { |
| 80 | void *faddr; |
83 | void *faddr; |
| 81 | 84 | ||
| 82 | faddr = frame_alloc(0, FRAME_ATOMIC); |
85 | faddr = frame_alloc(ONE_FRAME, FRAME_ATOMIC); |
| 83 | if (!faddr) |
86 | if (!faddr) |
| 84 | panic("Cannot allocate page for clock"); |
87 | panic("Cannot allocate page for clock"); |
| 85 | 88 | ||
| 86 | public_time = (struct ptime *)PA2KA(faddr); |
89 | public_time = (struct ptime *) PA2KA(faddr); |
| 87 | 90 | ||
| 88 | /* TODO: We would need some arch dependent settings here */ |
91 | /* TODO: We would need some arch dependent settings here */ |
| 89 | public_time->seconds1 = 0; |
92 | public_time->seconds1 = 0; |
| 90 | public_time->seconds2 = 0; |
93 | public_time->seconds2 = 0; |
| 91 | public_time->useconds = 0; |
94 | public_time->useconds = 0; |
| 92 | 95 | ||
| - | 96 | clock_parea.pbase = (uintptr_t) faddr; |
|
| - | 97 | clock_parea.vbase = (uintptr_t) public_time; |
|
| - | 98 | clock_parea.frames = 1; |
|
| - | 99 | clock_parea.cacheable = true; |
|
| - | 100 | ddi_parea_register(&clock_parea); |
|
| - | 101 | ||
| - | 102 | /* |
|
| - | 103 | * Prepare information for the userspace so that it can successfully |
|
| - | 104 | * physmem_map() the clock_parea. |
|
| - | 105 | */ |
|
| - | 106 | sysinfo_set_item_val("clock.cacheable", NULL, (unative_t) true); |
|
| - | 107 | sysinfo_set_item_val("clock.fcolor", NULL, (unative_t) |
|
| - | 108 | PAGE_COLOR(clock_parea.vbase)); |
|
| 93 | sysinfo_set_item_val("clock.faddr", NULL, (unative_t)faddr); |
109 | sysinfo_set_item_val("clock.faddr", NULL, (unative_t) faddr); |
| 94 | } |
110 | } |
| 95 | 111 | ||
| 96 | 112 | ||
| 97 | /** Update public counters |
113 | /** Update public counters |
| 98 | * |
114 | * |