diff options
| author | Ada Christine <adachristine18@gmail.com> | 2022-02-18 01:31:03 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2022-02-18 01:31:03 +0000 |
| commit | 606b7dc226cb51077c016a8ea5fa862ac6ce1db4 (patch) | |
| tree | 06188c7da4d7ce3ba53aba3ebf8be3a98665aed1 | |
| parent | 67d43fd64099a8ce51ad107e6f27bbdc6a52d852 (diff) | |
bug fixes
- needed an atomic_load() when getting the count in
pic8253_nanoseconds_elapsed()
- i was deleting half the bits of the outgoing task's stack in
cpu_task.S (oops)
- updated .gdbint. TODO: automate laoding section offsets correctly
| -rw-r--r-- | .gdbinit | 2 | ||||
| -rw-r--r-- | kc/core/cpu/cpu_task.S | 7 | ||||
| -rw-r--r-- | kc/core/pit8253.c | 4 |
3 files changed, 9 insertions, 4 deletions
@@ -1,3 +1,3 @@ target remote localhost:1234 -add-symbol-file kc/core/kernel.os 0xffffffff80001000 -s .data 0xffffffff80005000 +add-symbol-file kc/core/kernel.os 0xffffffff80001000 -s .data 0xffffffff80006000 diff --git a/kc/core/cpu/cpu_task.S b/kc/core/cpu/cpu_task.S index f2fb473..4f9fd7b 100644 --- a/kc/core/cpu/cpu_task.S +++ b/kc/core/cpu/cpu_task.S @@ -17,6 +17,10 @@ cpu_set_thread: * rsi: pointer to control block of the current thread * rdx: pointer to this cpu's task state segment esp0 field */ + // test for a NULL origin thread + test %rsi,%rsi + // skip saving the state for a NULL origin thread + jz .Lnull_thread push %rbx push %r12 push %r13 @@ -24,7 +28,8 @@ cpu_set_thread: push %r15 push %rbp /* the current task will be in rsi */ - mov %esp, 0(%rsi) // save the stack pointer for the current task + mov %rsp, 0(%rsi) // save the stack pointer for the current task +.Lnull_thread: mov 0(%rdi),%rsp // new stack is the next's task's stack mov 8(%rdi),%rbx // top of the next task's kernel stack mov %rbx,0(%rdx) // save the esp0 to the tss diff --git a/kc/core/pit8253.c b/kc/core/pit8253.c index 4728020..6f6256a 100644 --- a/kc/core/pit8253.c +++ b/kc/core/pit8253.c @@ -21,7 +21,7 @@ static void pit8253_set_divisor(uint16_t divisor); -static atomic_uint_fast64_t count = 0; +static volatile atomic_uint_fast64_t count = 0; static uint16_t divisor = 0; const struct timer_source pit8253_timer_source = @@ -82,7 +82,7 @@ uint32_t pit8253_get_frequency(void) uint64_t pit8253_nanoseconds_elapsed(void) { - return pit8253_nanoseconds_delta() * count; + return pit8253_nanoseconds_delta() * atomic_load(&count); } uint64_t pit8253_nanoseconds_delta(void) |
