-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.cc
More file actions
49 lines (40 loc) · 1.28 KB
/
init.cc
File metadata and controls
49 lines (40 loc) · 1.28 KB
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
#include "napi.h"
#include <cstdint>
#if defined(__x86_64__) || defined(_M_X64)
#ifdef __GNUC__
# include <immintrin.h>
#elif defined(_MSC_VER)
# include <intrin.h>
#endif
using std::uint8_t;
using std::uint32_t;
static uint32_t cpuid_(uint8_t outreg, uint32_t initEax, uint32_t initEcx = 0) {
uint32_t regs[4];
#ifdef _MSC_VER
__cpuidex(reinterpret_cast<int32_t*>(regs), initEax, initEcx);
#else
asm volatile("cpuid"
: "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
: "0" (initEax), "2" (initEcx));
#endif
return regs[outreg];
}
Napi::Number cpuid(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
const uint8_t outreg = static_cast<uint8_t>(info[0].ToNumber().Uint32Value());
const uint32_t initEax = info[1].ToNumber().Uint32Value();
const uint32_t initEcx = info[2].IsNumber() ? info[2].ToNumber().Uint32Value() : 0;
return Napi::Number::New(env, cpuid_(outreg, initEax, initEcx));
}
#else // x86_64
// TODO put ARM IID_AA64_ISAR here
Napi::Number cpuid(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::Number::New(env, 0);
}
#endif // x86_64
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "cpuid"), Napi::Function::New(env, cpuid));
return exports;
}
NODE_API_MODULE(cpuid, Init)