summaryrefslogtreecommitdiff
path: root/demo/demo.h
blob: f98d59942c8ec1fd5de02272eeae07c7513721e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef DEMO_H
#define DEMO_H

#define NUM_CPUS 4

struct lock
{
	volatile unsigned val;
};

struct cpu
{
	unsigned num;
};

/* Esto viola la ABI, pero no importa porque no dependemos de bibliotecas
 * https://gcc.gnu.org/onlinedocs/gcc/Global-Register-Variables.html
 */
register struct cpu *this_cpu asm("r9");

void spin_init(struct lock *lock);
void spin_lock(struct lock *lock, unsigned *irq_save);
void spin_unlock(struct lock *lock, unsigned irq_save);

void console_init(void);
void print(const char *fmt, ...);
void read_line(char *vuf, unsigned size);

void run_cpu(unsigned num);
void run_cpus(unsigned mask);
void halt_cpu(unsigned num);
void halt_cpus(unsigned mask);

int strcmp(const char *s1, const char *s2);
char *strtok_input(char **tokens);

int expect_end(char **tokens);

int parse_hex(char **tokens, unsigned *val);
int parse_ptr(char **tokens, void **ptr);
int parse_aligned(char **tokens, void **ptr);

int parse_cpu(char **tokens, unsigned *cpu);
int parse_cpu_mask(char **tokens, unsigned *mask);

void cache_debug(unsigned cpu, void *ptr);

#endif