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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use {crate::ExtensionId, ::core::num::NonZeroIsize};
pub const EID: ExtensionId = 0x10;
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct SpecVersion {
pub major: u8,
pub minor: u32,
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct ImplId(isize);
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct ImplVersion(isize);
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct MachineVendorId(isize);
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct MachineArchId(isize);
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct MachineImplId(isize);
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub enum ExtensionAvailability {
Available(NonZeroIsize),
Unavailable,
}
pub fn spec_version() -> SpecVersion {
use {
crate::{ecall, FunctionId},
::bit_field::BitField,
};
const FID: FunctionId = 0x0;
let value =
ecall(EID, FID, (0, 0, 0)).expect("Getting specification version must always succeed.");
SpecVersion {
major: value.get_bits(24..31) as u8,
minor: value.get_bits(0..24) as u32,
}
}
pub fn impl_id() -> ImplId {
use crate::{ecall, FunctionId};
const FID: FunctionId = 0x1;
let value = ecall(EID, FID, (0, 0, 0)).expect("Getting implementation ID must always succeed.");
ImplId(value)
}
pub fn impl_version() -> ImplVersion {
use crate::{ecall, FunctionId};
const FID: FunctionId = 0x2;
let value =
ecall(EID, FID, (0, 0, 0)).expect("Getting implementation version must always succeed.");
ImplVersion(value)
}
pub fn probe_extension(eid: ExtensionId) -> ExtensionAvailability {
use crate::{ecall, ArgValue, FunctionId};
const FID: FunctionId = 0x3;
let value =
ecall(EID, FID, (eid as ArgValue, 0, 0)).expect("Probing extensions must always succeed.");
if let Some(value) = NonZeroIsize::new(value) {
ExtensionAvailability::Available(value)
} else {
ExtensionAvailability::Unavailable
}
}
pub fn machine_vendor_id() -> MachineVendorId {
use crate::{ecall, FunctionId};
const FID: FunctionId = 0x4;
let value = ecall(EID, FID, (0, 0, 0)).expect("Getting machine vendor ID must always succeed.");
MachineVendorId(value)
}
pub fn machine_arch_id() -> MachineArchId {
use crate::{ecall, FunctionId};
const FID: FunctionId = 0x5;
let value =
ecall(EID, FID, (0, 0, 0)).expect("Getting machine architecture ID must always succeed.");
MachineArchId(value)
}
pub fn machine_impl_id() -> MachineImplId {
use crate::{ecall, FunctionId};
const FID: FunctionId = 0x6;
let value =
ecall(EID, FID, (0, 0, 0)).expect("Getting machine implementation ID must always succeed.");
MachineImplId(value)
}