fix atomics (finally)
parent
5d2539fc4a
commit
e86ef2acbd
@ -1,34 +0,0 @@
|
||||
/* See the end of this file for copyright, license, and warranty information. */
|
||||
|
||||
#include <ardix/atomic.h>
|
||||
#include <ardix/atom.h>
|
||||
|
||||
static ATOM(atomic_context, 0);
|
||||
|
||||
void atomic_enter(void)
|
||||
{
|
||||
atom_get(&atomic_context);
|
||||
}
|
||||
|
||||
void atomic_leave(void)
|
||||
{
|
||||
atom_put(&atomic_context);
|
||||
}
|
||||
|
||||
int is_atomic(void)
|
||||
{
|
||||
return atom_read(&atomic_context);
|
||||
}
|
||||
|
||||
/*
|
||||
* This file is part of Ardix.
|
||||
* Copyright (c) 2020, 2021 Felix Kopp <owo@fef.moe>.
|
||||
*
|
||||
* Ardix is non-violent software: you may only use, redistribute,
|
||||
* and/or modify it under the terms of the CNPLv6+ as found in
|
||||
* the LICENSE file in the source code root directory or at
|
||||
* <https://git.pixie.town/thufie/CNPL>.
|
||||
*
|
||||
* Ardix comes with ABSOLUTELY NO WARRANTY, to the extent
|
||||
* permitted by applicable law. See the CNPLv6+ for details.
|
||||
*/
|
@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include <ardix/types.h>
|
||||
|
||||
#include <toolchain.h>
|
||||
|
||||
static __always_inline word_t _atomic_enter(void)
|
||||
{
|
||||
word_t primask;
|
||||
__asm__ volatile(
|
||||
" mrs %0, primask \n"
|
||||
" cpsid i \n"
|
||||
: "=r"(primask));
|
||||
return primask;
|
||||
}
|
||||
|
||||
static __always_inline void _atomic_restore(word_t context)
|
||||
{
|
||||
if (!(context & 1))
|
||||
__asm__ volatile("cpsie i");
|
||||
}
|
||||
|
||||
static inline int _is_atomic(void)
|
||||
{
|
||||
int primask;
|
||||
__asm__ volatile("mrs %0, primask" : "=r"(primask));
|
||||
return primask & 1;
|
||||
}
|
Loading…
Reference in New Issue