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