Fix errors in atomic operations.
This commit is contained in:
+119
-115
@@ -32,122 +32,10 @@ if (DOXYGEN_FOUND)
|
||||
doxygen_add_docs(
|
||||
${PROJECT_NAME}_documentation
|
||||
${PROJECT_SOURCE_DIR}/README.md
|
||||
${PROJECT_SOURCE_DIR}/CODING_STYLE.md
|
||||
${PROJECT_SOURCE_DIR}/LICENSE.md
|
||||
${PROJECT_SOURCE_DIR}/TODO.md
|
||||
${PROJECT_SOURCE_DIR}/doc/signal.md
|
||||
${PROJECT_SOURCE_DIR}/doc/syscall.md
|
||||
${PROJECT_SOURCE_DIR}/libc/src/crt0.S
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/array.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/assert.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/bits/ioctls.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/bits/stat.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/bits/termios-struct.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ctype.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/debug.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/fcntl.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/fcvt.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/grp.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/io/mm_io.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/io/port_io.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/ipc.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/msg.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/sem.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/shm.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/libgen.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/limits.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/math.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/pwd.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ring_buffer.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sched.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/signal.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdarg.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdbool.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stddef.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdint.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdio.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdlib.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/strerror.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/string.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/bitops.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/dirent.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/errno.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/ioctl.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/reboot.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/stat.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/types.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/unistd.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/utsname.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/wait.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/system/syscall_types.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/termios.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/time.h
|
||||
${PROJECT_SOURCE_DIR}/libc/src/abort.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/assert.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/ctype.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/debug.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/fcvt.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/grp.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/io/mm_io.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/io/port_io.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/ipc/ipc.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/libc_start.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/libgen.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/math.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/pwd.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sched.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/setenv.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/stdio.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/stdlib.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/strerror.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/string.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/errno.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/ioctl.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/unistd.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/utsname.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/termios.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/time.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/chdir.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/close.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/creat.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/exec.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/exit.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/fork.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getcwd.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getdents.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getpgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getpid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getppid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getsid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getuid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/interval.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/kill.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/lseek.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/mkdir.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/nice.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/open.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/read.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/reboot.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/rmdir.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setpgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setsid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setuid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/signal.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/stat.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/unlink.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/waitpid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/write.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/vscanf.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/vsprintf.c
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/boot.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/exception.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/gdt.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/idt.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/interrupt.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/tss.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/process/user.S
|
||||
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/boot.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/descriptor_tables/gdt.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/descriptor_tables/idt.h
|
||||
@@ -171,7 +59,6 @@ if (DOXYGEN_FOUND)
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/hardware/cpuid.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/hardware/pic8259.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/hardware/timer.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/io/debug.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/io/proc_modules.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/io/vga/vga.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/io/vga/vga_font.h
|
||||
@@ -206,7 +93,6 @@ if (DOXYGEN_FOUND)
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/proc_access.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/sys/errno.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/sys/ipc.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/sys/kernel_levels.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/sys/module.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/sys/reboot.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/sys/types.h
|
||||
@@ -216,6 +102,7 @@ if (DOXYGEN_FOUND)
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/system/signal.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/system/syscall.h
|
||||
${PROJECT_SOURCE_DIR}/mentos/inc/version.h
|
||||
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/boot.c
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/exception.c
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/gdt.c
|
||||
@@ -292,5 +179,122 @@ if (DOXYGEN_FOUND)
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/system/printk.c
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/system/signal.c
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/system/syscall.c
|
||||
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/boot.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/exception.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/gdt.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/idt.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/interrupt.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/descriptor_tables/tss.S
|
||||
${PROJECT_SOURCE_DIR}/mentos/src/process/user.S
|
||||
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/array.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/assert.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/bits/ioctls.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/bits/stat.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/bits/termios-struct.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ctype.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/fcntl.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/fcvt.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/grp.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/io/ansi_colors.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/io/debug.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/io/mm_io.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/io/port_io.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/ipc.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/msg.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/sem.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ipc/shm.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/libgen.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/limits.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/math.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/pwd.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/ring_buffer.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sched.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/signal.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdarg.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdbool.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stddef.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdint.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdio.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/stdlib.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/strerror.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/string.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/bitops.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/dirent.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/errno.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/ioctl.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/kernel_levels.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/reboot.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/stat.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/types.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/unistd.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/utsname.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/sys/wait.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/system/syscall_types.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/termios.h
|
||||
${PROJECT_SOURCE_DIR}/libc/inc/time.h
|
||||
|
||||
${PROJECT_SOURCE_DIR}/libc/src/abort.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/assert.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/ctype.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/fcvt.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/grp.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/io/debug.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/io/mm_io.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/io/port_io.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/ipc/ipc.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/libc_start.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/libgen.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/math.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/pwd.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sched.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/setenv.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/stdio.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/stdlib.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/strerror.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/string.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/errno.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/ioctl.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/unistd.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/sys/utsname.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/termios.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/time.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/chdir.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/close.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/creat.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/exec.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/exit.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/fork.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getcwd.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getdents.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getpgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getpid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getppid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getsid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/getuid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/interval.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/kill.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/lseek.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/mkdir.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/nice.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/open.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/read.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/reboot.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/rmdir.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setpgid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setsid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/setuid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/signal.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/stat.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/unlink.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/waitpid.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/unistd/write.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/vscanf.c
|
||||
${PROJECT_SOURCE_DIR}/libc/src/vsprintf.c
|
||||
|
||||
${PROJECT_SOURCE_DIR}/libc/src/crt0.S
|
||||
)
|
||||
endif (DOXYGEN_FOUND)
|
||||
@@ -62,8 +62,9 @@ static inline int list_head_empty(const list_head *head)
|
||||
return head->next == head;
|
||||
}
|
||||
|
||||
/// @brief Initializes the list_head.
|
||||
/// @param head The head for your list.
|
||||
/// @brief Computes the size of the list.
|
||||
/// @param head The head of the list.
|
||||
/// @return the size of the list.
|
||||
static inline unsigned list_head_size(const list_head *head)
|
||||
{
|
||||
unsigned size = 0;
|
||||
|
||||
+69
-49
@@ -5,8 +5,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "stdint.h"
|
||||
#include "stdbool.h"
|
||||
#include "klib/compiler.h"
|
||||
|
||||
/// @brief Standard structure for atomic operations (see below
|
||||
@@ -28,87 +26,109 @@ typedef volatile unsigned atomic_t;
|
||||
: \
|
||||
: "memory")
|
||||
|
||||
/// @brief Atomically sets the value of ptr with the value of x.
|
||||
///
|
||||
/// @param ptr Pointer to the atomic variable to set.
|
||||
/// @param x The value to set.
|
||||
/// @brief Atomically sets `value` at `ptr`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @param value the value to set.
|
||||
/// @return The final value of the atomic variable.
|
||||
inline static int32_t atomic_set_and_test(atomic_t *ptr, int32_t x)
|
||||
inline static int atomic_set_and_test(atomic_t *ptr, int value)
|
||||
{
|
||||
__asm__ __volatile__("xchgl %0,%1" // instruction
|
||||
: "=r"(x) // outputs
|
||||
: "m"(*ptr), "0"(x) // inputs
|
||||
: "memory"); // side effects
|
||||
return x;
|
||||
// The + in "+r" and "+m" denotes a read-modify-write operand.
|
||||
__asm__ __volatile__(LOCK_PREFIX // Lock
|
||||
"xchgl %0, %1" // Instruction
|
||||
: "+r"(value), "+m"(*ptr) // Input + Output
|
||||
: // No input-only
|
||||
: "memory"); // Side effects
|
||||
return value;
|
||||
}
|
||||
|
||||
/// @brief Atomically set ptr equal to i.
|
||||
inline static void atomic_set(atomic_t *ptr, int32_t i)
|
||||
/// @brief Atomically set the value pointed by `ptr` to `value`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @param value the value we need to set.
|
||||
inline static void atomic_set(atomic_t *ptr, int value)
|
||||
{
|
||||
atomic_set_and_test(ptr, i);
|
||||
atomic_set_and_test(ptr, value);
|
||||
}
|
||||
|
||||
/// @brief Atomically read the integer value of ptr.
|
||||
inline static int32_t atomic_read(const atomic_t *ptr)
|
||||
/// @brief Atomically read the value pointed by `ptr`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @return the value we read.
|
||||
inline static int atomic_read(const atomic_t *ptr)
|
||||
{
|
||||
return READ_ONCE(*ptr);
|
||||
}
|
||||
|
||||
/// @brief Atomically add i to ptr.
|
||||
inline static int32_t atomic_add(atomic_t const *ptr, int32_t i)
|
||||
/// @brief Atomically add `value` to the value pointed by `ptr`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @param value the value we need to add.
|
||||
/// @return the result of the operation.
|
||||
inline static int atomic_add(atomic_t *ptr, int value)
|
||||
{
|
||||
int result = i;
|
||||
__asm__ __volatile__(LOCK_PREFIX "xaddl %0, %1"
|
||||
: "=r"(i)
|
||||
: "m"(ptr), "0"(i)
|
||||
: "memory", "cc");
|
||||
return result + i;
|
||||
// The + in "+r" and "+m" denotes a read-modify-write operand.
|
||||
__asm__ __volatile__(LOCK_PREFIX // Lock
|
||||
"xaddl %0, %1" // Instruction
|
||||
: "+r"(value), "+m"(*ptr) // Input + Output
|
||||
: // No input-only
|
||||
: "memory"); // Side effects
|
||||
return value;
|
||||
}
|
||||
|
||||
/// @brief Atomically subtract i from ptr.
|
||||
inline static int32_t atomic_sub(atomic_t *ptr, int32_t i)
|
||||
/// @brief Atomically subtract `value` from the value pointed by `ptr`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @param value the value we need to subtract.
|
||||
/// @return the result of the operation.
|
||||
inline static int atomic_sub(atomic_t *ptr, int value)
|
||||
{
|
||||
return atomic_add(ptr, -i);
|
||||
return atomic_add(ptr, -value);
|
||||
}
|
||||
|
||||
/// @brief Atomically add one to ptr.
|
||||
inline static int32_t atomic_inc(atomic_t *ptr)
|
||||
/// @brief Atomically increment the value at `ptr`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @return the result of the operation.
|
||||
inline static int atomic_inc(atomic_t *ptr)
|
||||
{
|
||||
return atomic_add(ptr, 1);
|
||||
}
|
||||
|
||||
/// @brief Atomically subtract one from ptr.
|
||||
inline static int32_t atomic_dec(atomic_t *ptr)
|
||||
/// @brief Atomically decrement the value at `ptr`.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @return the result of the operation.
|
||||
inline static int atomic_dec(atomic_t *ptr)
|
||||
{
|
||||
return atomic_add(ptr, -1);
|
||||
}
|
||||
|
||||
/// @brief Atomically add i to ptr and return true if the result is negative;
|
||||
/// otherwise false.
|
||||
inline static bool_t atomic_add_negative(atomic_t *ptr, int32_t i)
|
||||
/// @brief Atomically add `value` to `ptr` and checks if the result is negative.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @param value the value we need to add.
|
||||
/// @return true if the result is negative, false otherwise.
|
||||
inline static int atomic_add_negative(atomic_t *ptr, int value)
|
||||
{
|
||||
return (bool_t)(atomic_add(ptr, i) < 0);
|
||||
return atomic_add(ptr, value) < 0;
|
||||
}
|
||||
|
||||
/// @brief Atomically subtract i from ptr and return true if the result is
|
||||
/// zero; otherwise false.
|
||||
inline static bool_t atomic_sub_and_test(atomic_t *ptr, int32_t i)
|
||||
/// @brief Atomically subtract `value` from `ptr` and checks if the result is zero.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @param value the value we need to subtract.
|
||||
/// @return true if the result is zero, false otherwise.
|
||||
inline static int atomic_sub_and_test(atomic_t *ptr, int value)
|
||||
{
|
||||
return (bool_t)(atomic_sub(ptr, i) == 0);
|
||||
return atomic_sub(ptr, value) == 0;
|
||||
}
|
||||
|
||||
/// @brief Atomically increment ptr by one and return true if the result is
|
||||
/// zero; false otherwise.
|
||||
inline static int32_t atomic_inc_and_test(atomic_t *ptr)
|
||||
/// @brief Atomically increment `ptr` and checks if the result is zero.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @return true if the result is zero, false otherwise.
|
||||
inline static int atomic_inc_and_test(atomic_t *ptr)
|
||||
{
|
||||
return (bool_t)(atomic_inc(ptr) == 0);
|
||||
return atomic_inc(ptr) == 0;
|
||||
}
|
||||
|
||||
/// @brief Atomically decrement ptr by one and return true if zero; false
|
||||
/// otherwise.
|
||||
inline static int32_t atomic_dec_and_test(atomic_t *ptr)
|
||||
/// @brief Atomically decrement `ptr` and checks if the result is zero.
|
||||
/// @param ptr the pointer we are working with.
|
||||
/// @return true if the result is zero, false otherwise.
|
||||
inline static int atomic_dec_and_test(atomic_t *ptr)
|
||||
{
|
||||
return (bool_t)(atomic_dec(ptr) == 0);
|
||||
return atomic_dec(ptr) == 0;
|
||||
}
|
||||
|
||||
/// @brief Atomically sets a bit in memory, using Bit Test And Set (bts).
|
||||
@@ -116,7 +136,7 @@ inline static int32_t atomic_dec_and_test(atomic_t *ptr)
|
||||
/// @param base The base address.
|
||||
static inline void set_bit(int offset, volatile unsigned long *base)
|
||||
{
|
||||
__asm__ __volatile__("btsl %[offset],%[base]"
|
||||
__asm__ __volatile__("btsl %[offset], %[base]"
|
||||
: [base] "=m"(*(volatile long *)base)
|
||||
: [offset] "Ir"(offset));
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "system/signal.h"
|
||||
#include "devices/fpu.h"
|
||||
#include "mem/paging.h"
|
||||
#include "stdbool.h"
|
||||
|
||||
/// The maximum length of a name for a task_struct.
|
||||
#define TASK_NAME_MAX_LENGTH 100
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
static void machine_power_off()
|
||||
{
|
||||
while (true) {
|
||||
while (1) {
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user