diff options
Diffstat (limited to 'software')
| -rw-r--r-- | software/hello/hello.c | 2 | ||||
| -rw-r--r-- | software/led_fade/.unsupported-boards | 2 | ||||
| -rw-r--r-- | software/smp/Makefile | 6 | ||||
| -rw-r--r-- | software/smp/atomic.h | 29 | ||||
| -rw-r--r-- | software/smp/smp.c | 40 | 
5 files changed, 77 insertions, 2 deletions
diff --git a/software/hello/hello.c b/software/hello/hello.c index 85c5d87..befc6ee 100644 --- a/software/hello/hello.c +++ b/software/hello/hello.c @@ -2,7 +2,7 @@  int main()  { -  printf("hello world!\n"); +  puts("hello world!\n");    return 0;  } diff --git a/software/led_fade/.unsupported-boards b/software/led_fade/.unsupported-boards index ad80e34..f9e9897 100644 --- a/software/led_fade/.unsupported-boards +++ b/software/led_fade/.unsupported-boards @@ -1,4 +1,4 @@  freedom-e300-arty  coreplexip-e31-arty  coreplexip-e51-arty - +freedom-e300-arty diff --git a/software/smp/Makefile b/software/smp/Makefile new file mode 100644 index 0000000..4131ffc --- /dev/null +++ b/software/smp/Makefile @@ -0,0 +1,6 @@ +TARGET = smp +C_SRCS += smp.c +CFLAGS += -O2 -fno-builtin-printf -DENABLE_SMP + +BSP_BASE = ../../bsp +include $(BSP_BASE)/env/common.mk diff --git a/software/smp/atomic.h b/software/smp/atomic.h new file mode 100644 index 0000000..074c6a2 --- /dev/null +++ b/software/smp/atomic.h @@ -0,0 +1,29 @@ +#ifndef SIFIVE_ATOMIC_H +#define SIFIVE_ATOMIC_H + +#define ATOMIC_INIT(x)		\ +	{			\ +		.counter = (x),	\ +	} + +typedef struct { +  int counter; +} atomic_t; + +static inline int atomic_xchg(atomic_t *v, int n) +{ +  register int c; + +  __asm__ __volatile__ ( +    "amoswap.w.aqrl %0, %2, %1" +    : "=r" (c), "+A" (v->counter) +    : "r" (n)); +  return c; +} + +static inline void mb(void) +{ +  __asm__ __volatile__ ("fence"); +} + +#endif diff --git a/software/smp/smp.c b/software/smp/smp.c new file mode 100644 index 0000000..36c9db9 --- /dev/null +++ b/software/smp/smp.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <unistd.h> +#include "atomic.h" +void write_hex(int, unsigned long); + +atomic_t tty_lock = ATOMIC_INIT(0); + +void get_lock(atomic_t *lock) +{ +  while (atomic_xchg(lock, 1) == 1); +  mb(); +} + +void put_lock(atomic_t *lock) +{ +  mb(); +  atomic_xchg(lock, 0); +} + +int secondary_main(int hartid) +{ +  volatile int counter; + +  while (1) { +    get_lock(&tty_lock); +    write(1, "hello world from hart ", 22); +    char s[] = {'0', '\n', '\0'}; +    s[0] += hartid; +    write(1, s, 2); +    put_lock(&tty_lock); + +    for (counter = 0; counter < 10000 + 100*hartid; ++counter) +        mb(); +  } +} + +int main() +{ +  return secondary_main(0); +}  | 
