1#include <sys/types.h>
2#include <unistd.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6#include <linux/stringify.h>
7#include "header.h"
8#include "util.h"
9
10#define mfspr(rn) ({unsigned long rval; \
11 asm volatile("mfspr %0," __stringify(rn) \
12 : "=r" (rval)); rval; })
13
14#define SPRN_PVR 0x11F
15#define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF)
16#define PVR_REV(pvr) (((pvr) >> 0) & 0xFFFF)
17
18int
19get_cpuid(char *buffer, size_t sz)
20{
21 unsigned long pvr;
22 int nb;
23
24 pvr = mfspr(SPRN_PVR);
25
26 nb = scnprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr));
27
28
29 if (strchr(buffer, '$')) {
30 buffer[nb-1] = '\0';
31 return 0;
32 }
33 return -1;
34}
35
36char *
37get_cpuid_str(void)
38{
39 char *bufp;
40
41 if (asprintf(&bufp, "%.8lx", mfspr(SPRN_PVR)) < 0)
42 bufp = NULL;
43
44 return bufp;
45}
46