1/*
2 * Copyright 2021, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _SMP_H_
6#define _SMP_H_
7
8
9#include <SupportDefs.h>
10
11
12struct Mutex
13{
14	int32 fLock;
15
16	Mutex(): fLock(0) {}
17
18	bool TryLock()
19	{
20		return atomic_test_and_set(&fLock, -1, 0) == 0;
21	}
22
23	bool Lock()
24	{
25		while (!TryLock()) {}
26		if (atomic_add(&fLock, -1) < 0) {
27		}
28		return true;
29	}
30
31	void Unlock()
32	{
33		atomic_add(&fLock, 1);
34	}
35};
36
37
38struct CpuInfo
39{
40	uint32 phandle;
41	uint32 hartId;
42	uint32 plicContext;
43};
44
45
46CpuInfo* smp_find_cpu(uint32 phandle);
47
48void smp_init_other_cpus(void);
49void smp_boot_other_cpus(uint64 pageTable, uint64 kernel_entry);
50
51void smp_init();
52
53
54#endif	// _SMP_H_
55