summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/riscv/include/arch/smp/atomic.h (renamed from src/arch/riscv/include/atomic.h)77
-rw-r--r--src/arch/riscv/include/arch/smp/spinlock.h12
-rw-r--r--src/arch/riscv/include/mcall.h1
-rw-r--r--src/arch/riscv/mcall.c1
4 files changed, 61 insertions, 30 deletions
diff --git a/src/arch/riscv/include/atomic.h b/src/arch/riscv/include/arch/smp/atomic.h
index 15702e445f..de7fd19bd3 100644
--- a/src/arch/riscv/include/atomic.h
+++ b/src/arch/riscv/include/arch/smp/atomic.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2013, The Regents of the University of California (Regents).
+ * Copyright (c) 2018, HardenedLinux.
* All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,38 +31,58 @@
#include <arch/encoding.h>
+typedef struct { volatile int counter; } atomic_t;
+
#define disable_irqsave() clear_csr(mstatus, MSTATUS_MIE)
#define enable_irqrestore(flags) set_csr(mstatus, (flags) & MSTATUS_MIE)
-typedef struct { int lock; } spinlock_t;
-#define SPINLOCK_INIT {0}
-
-#define atomic_set(ptr, val) (*(volatile typeof(*(ptr)) *)(ptr) = val)
-#define atomic_read(ptr) (*(volatile typeof(*(ptr)) *)(ptr))
+#define atomic_set(v, val) ((v)->counter = (val))
+#define atomic_read(v) ((v)->counter)
#ifdef __riscv_atomic
-# define atomic_add(ptr, inc) __sync_fetch_and_add(ptr, inc)
-# define atomic_swap(ptr, swp) __sync_lock_test_and_set(ptr, swp)
-# define atomic_cas(ptr, cmp, swp) __sync_val_compare_and_swap(ptr, cmp, swp)
+# define atomic_add(v, inc) __sync_fetch_and_add(&((v)->counter), inc)
+# define atomic_swap(v, swp) __sync_lock_test_and_set(&((v)->counter), swp)
+# define atomic_cas(v, cmp, swp) __sync_val_compare_and_swap(&((v)->counter), \
+ cmp, swp)
+# define atomic_inc(v) atomic_add(v, 1)
+# define atomic_dec(v) atomic_add(v, -1)
#else
-# define atomic_add(ptr, inc) ({ \
- long flags = disable_irqsave(); \
- typeof(ptr) res = *(volatile typeof(ptr))(ptr); \
- *(volatile typeof(ptr))(ptr) = res + (inc); \
- enable_irqrestore(flags); \
- res; })
-# define atomic_swap(ptr, swp) ({ \
- long flags = disable_irqsave(); \
- typeof(*ptr) res = *(volatile typeof(ptr))(ptr); \
- *(volatile typeof(ptr))(ptr) = (swp); \
- enable_irqrestore(flags); \
- res; })
-# define atomic_cas(ptr, cmp, swp) ({ \
- long flags = disable_irqsave(); \
- typeof(ptr) res = *(volatile typeof(ptr))(ptr); \
- if (res == (cmp)) *(volatile typeof(ptr))(ptr) = (swp); \
- enable_irqrestore(flags); \
- res; })
-#endif
+static inline int atomic_add(atomic_t *v, int inc)
+{
+ long flags = disable_irqsave();
+ int res = v->counter;
+ v->counter += inc;
+ enable_irqrestore(flags);
+ return res;
+}
+
+static inline int atomic_swap(atomic_t *v, int swp)
+{
+ long flags = disable_irqsave();
+ int res = v->counter;
+ v->counter = swp;
+ enable_irqrestore(flags);
+ return res;
+}
+
+static inline int atomic_cas(atomic_t *v, int cmp, int swp)
+{
+ long flags = disable_irqsave();
+ int res = v->counter;
+ v->counter = (res == cmp ? swp : res);
+ enable_irqrestore(flags);
+ return res;
+}
+
+static inline int atomic_inc(atomic_t *v)
+{
+ return atomic_add(v, 1);
+}
+
+static inline int atomic_dec(atomic_t *v)
+{
+ return atomic_add(v, -1);
+}
+#endif //__riscv_atomic
-#endif
+#endif //_RISCV_ATOMIC_H
diff --git a/src/arch/riscv/include/arch/smp/spinlock.h b/src/arch/riscv/include/arch/smp/spinlock.h
new file mode 100644
index 0000000000..bdf8ec4584
--- /dev/null
+++ b/src/arch/riscv/include/arch/smp/spinlock.h
@@ -0,0 +1,12 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
diff --git a/src/arch/riscv/include/mcall.h b/src/arch/riscv/include/mcall.h
index e4bc36f080..114808aae7 100644
--- a/src/arch/riscv/include/mcall.h
+++ b/src/arch/riscv/include/mcall.h
@@ -26,7 +26,6 @@
#ifndef __ASSEMBLER__
#include <arch/encoding.h>
-#include <atomic.h>
#include <stdint.h>
typedef struct {
diff --git a/src/arch/riscv/mcall.c b/src/arch/riscv/mcall.c
index 030accfe1d..2e44fb76fe 100644
--- a/src/arch/riscv/mcall.c
+++ b/src/arch/riscv/mcall.c
@@ -27,7 +27,6 @@
#include <arch/barrier.h>
#include <arch/errno.h>
-#include <atomic.h>
#include <console/console.h>
#include <mcall.h>
#include <string.h>