mirror of
https://github.com/Dr-Noob/cpufetch.git
synced 2026-03-25 07:50:40 +01:00
Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef9cb9b9c5 | ||
|
|
6a9d30ee37 | ||
|
|
4af1651306 | ||
|
|
1a8daf6e32 | ||
|
|
fbee621ca5 | ||
|
|
e63ef6008d | ||
|
|
9d8372fcb4 | ||
|
|
5686475cbb | ||
|
|
d312c32b1c | ||
|
|
2ab3f8eb40 | ||
|
|
d8fe4f5a6b | ||
|
|
137b51fc99 | ||
|
|
a6420151ed | ||
|
|
39516e219a | ||
|
|
c0935d1b4b | ||
|
|
a302a4508c | ||
|
|
d8c69e1b9b | ||
|
|
af58050051 | ||
|
|
70b257831b | ||
|
|
58589cc121 | ||
|
|
3e01df28fc | ||
|
|
58160d1185 | ||
|
|
f8f81c3222 | ||
|
|
4e29e481b7 | ||
|
|
2c69889d65 | ||
|
|
70da780930 | ||
|
|
82b9241330 | ||
|
|
e3aeb5c705 | ||
|
|
132b961b24 | ||
|
|
9c552bcddf | ||
|
|
323f3671b7 | ||
|
|
b6603040fc | ||
|
|
e2f7ec0765 | ||
|
|
5dcc3c1db6 | ||
|
|
ca5677a77f | ||
|
|
6d79a96fa8 | ||
|
|
06a76d4c75 | ||
|
|
49b437bc33 | ||
|
|
7159d1fea1 | ||
|
|
c269fbd7d3 | ||
|
|
3cc56c5900 | ||
|
|
7cd578b889 | ||
|
|
6a67b87abc | ||
|
|
590c391380 | ||
|
|
5e3be4c45f | ||
|
|
42149b8dff | ||
|
|
7c5e638c2f | ||
|
|
a8060a02ba | ||
|
|
5d92814cd0 | ||
|
|
0aff23f962 | ||
|
|
1717a96b27 | ||
|
|
7ee36037c3 | ||
|
|
a7e34a1490 | ||
|
|
f3b1333a18 | ||
|
|
123b22e968 | ||
|
|
00981c3c46 | ||
|
|
fb41a1f3fa | ||
|
|
8c3e7cdd60 | ||
|
|
8f31e22452 | ||
|
|
43b25c15e3 | ||
|
|
b7c32fcd4a | ||
|
|
1326314103 | ||
|
|
783785e312 | ||
|
|
490d9f6566 | ||
|
|
4b0ea3053f | ||
|
|
843da5cf70 | ||
|
|
d2dc2046de | ||
|
|
e350f1759f | ||
|
|
4998cf3c82 | ||
|
|
a3c6f15658 |
2
.github/workflows/lockdown.yml
vendored
2
.github/workflows/lockdown.yml
vendored
@@ -3,7 +3,7 @@ name: 'Disable PR in cpufetch'
|
|||||||
on:
|
on:
|
||||||
issues:
|
issues:
|
||||||
types: opened
|
types: opened
|
||||||
pull_request:
|
pull_request_target:
|
||||||
types: opened
|
types: opened
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
|
|||||||
26
Makefile
26
Makefile
@@ -1,6 +1,6 @@
|
|||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
|
|
||||||
CFLAGS+=-Wall -Wextra -pedantic -fstack-protector-all -pedantic
|
CFLAGS+=-Wall -Wextra -pedantic
|
||||||
SANITY_FLAGS=-Wfloat-equal -Wshadow -Wpointer-arith
|
SANITY_FLAGS=-Wfloat-equal -Wshadow -Wpointer-arith
|
||||||
|
|
||||||
PREFIX ?= /usr
|
PREFIX ?= /usr
|
||||||
@@ -16,18 +16,28 @@ ifneq ($(OS),Windows_NT)
|
|||||||
SRC_DIR=src/x86/
|
SRC_DIR=src/x86/
|
||||||
SOURCE += $(COMMON_SRC) $(SRC_DIR)cpuid.c $(SRC_DIR)apic.c $(SRC_DIR)cpuid_asm.c $(SRC_DIR)uarch.c
|
SOURCE += $(COMMON_SRC) $(SRC_DIR)cpuid.c $(SRC_DIR)apic.c $(SRC_DIR)cpuid_asm.c $(SRC_DIR)uarch.c
|
||||||
HEADERS += $(COMMON_HDR) $(SRC_DIR)cpuid.h $(SRC_DIR)apic.h $(SRC_DIR)cpuid_asm.h $(SRC_DIR)uarch.h
|
HEADERS += $(COMMON_HDR) $(SRC_DIR)cpuid.h $(SRC_DIR)apic.h $(SRC_DIR)cpuid_asm.h $(SRC_DIR)uarch.h
|
||||||
CFLAGS += -DARCH_X86 -std=c99
|
CFLAGS += -DARCH_X86 -std=c99 -fstack-protector-all
|
||||||
else ifeq ($(arch), $(filter $(arch), ppc64le ppc64 ppcle ppc))
|
else ifeq ($(arch), $(filter $(arch), ppc64le ppc64 ppcle ppc))
|
||||||
SRC_DIR=src/ppc/
|
SRC_DIR=src/ppc/
|
||||||
SOURCE += $(COMMON_SRC) $(SRC_DIR)ppc.c $(SRC_DIR)uarch.c $(SRC_DIR)udev.c
|
SOURCE += $(COMMON_SRC) $(SRC_DIR)ppc.c $(SRC_DIR)uarch.c $(SRC_DIR)udev.c
|
||||||
HEADERS += $(COMMON_HDR) $(SRC_DIR)ppc.h $(SRC_DIR)uarch.h $(SRC_DIR)udev.c
|
HEADERS += $(COMMON_HDR) $(SRC_DIR)ppc.h $(SRC_DIR)uarch.h $(SRC_DIR)udev.c
|
||||||
CFLAGS += -DARCH_PPC -std=gnu99
|
CFLAGS += -DARCH_PPC -std=gnu99 -fstack-protector-all
|
||||||
else
|
else ifeq ($(arch), $(filter $(arch), arm aarch64_be aarch64 arm64 armv8b armv8l armv7l armv6l))
|
||||||
# Assume ARM
|
|
||||||
SRC_DIR=src/arm/
|
SRC_DIR=src/arm/
|
||||||
SOURCE += $(COMMON_SRC) $(SRC_DIR)midr.c $(SRC_DIR)uarch.c $(SRC_DIR)soc.c $(SRC_DIR)udev.c
|
SOURCE += $(COMMON_SRC) $(SRC_DIR)midr.c $(SRC_DIR)uarch.c $(SRC_DIR)soc.c $(SRC_DIR)udev.c
|
||||||
HEADERS += $(COMMON_HDR) $(SRC_DIR)midr.h $(SRC_DIR)uarch.h $(SRC_DIR)soc.h $(SRC_DIR)udev.c $(SRC_DIR)socs.h
|
HEADERS += $(COMMON_HDR) $(SRC_DIR)midr.h $(SRC_DIR)uarch.h $(SRC_DIR)soc.h $(SRC_DIR)udev.c $(SRC_DIR)socs.h
|
||||||
CFLAGS += -DARCH_ARM -Wno-unused-parameter -std=c99
|
CFLAGS += -DARCH_ARM -Wno-unused-parameter -std=c99 -fstack-protector-all
|
||||||
|
|
||||||
|
os := $(shell uname -s)
|
||||||
|
ifeq ($(os), Darwin)
|
||||||
|
SOURCE += $(SRC_DIR)sysctl.c
|
||||||
|
HEADERS += $(SRC_DIR)sysctl.h
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
# Error lines should not be tabulated because Makefile complains about it
|
||||||
|
$(warning Unsupported arch detected: $(arch). See https://github.com/Dr-Noob/cpufetch#1-support)
|
||||||
|
$(warning If your architecture is supported but the compilation fails, please open an issue in https://github.com/Dr-Noob/cpufetch/issues)
|
||||||
|
$(error Aborting compilation)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OUTPUT=cpufetch
|
OUTPUT=cpufetch
|
||||||
@@ -36,8 +46,8 @@ else
|
|||||||
SRC_DIR=src/x86/
|
SRC_DIR=src/x86/
|
||||||
SOURCE += $(COMMON_SRC) $(SRC_DIR)cpuid.c $(SRC_DIR)apic.c $(SRC_DIR)cpuid_asm.c $(SRC_DIR)uarch.c
|
SOURCE += $(COMMON_SRC) $(SRC_DIR)cpuid.c $(SRC_DIR)apic.c $(SRC_DIR)cpuid_asm.c $(SRC_DIR)uarch.c
|
||||||
HEADERS += $(COMMON_HDR) $(SRC_DIR)cpuid.h $(SRC_DIR)apic.h $(SRC_DIR)cpuid_asm.h $(SRC_DIR)uarch.h
|
HEADERS += $(COMMON_HDR) $(SRC_DIR)cpuid.h $(SRC_DIR)apic.h $(SRC_DIR)cpuid_asm.h $(SRC_DIR)uarch.h
|
||||||
CFLAGS += -DARCH_X86
|
CFLAGS += -DARCH_X86 -std=c99
|
||||||
SANITY_FLAGS += -Wno-pedantic-ms-format -std=c99
|
SANITY_FLAGS += -Wno-pedantic-ms-format
|
||||||
OUTPUT=cpufetch.exe
|
OUTPUT=cpufetch.exe
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
26
README.md
26
README.md
@@ -33,6 +33,7 @@
|
|||||||
- [5. Implementation](#5-implementation)
|
- [5. Implementation](#5-implementation)
|
||||||
- [6. Bugs or improvements](#6-bugs-or-improvements)
|
- [6. Bugs or improvements](#6-bugs-or-improvements)
|
||||||
- [7. Acknowledgements](#7-acknowledgements)
|
- [7. Acknowledgements](#7-acknowledgements)
|
||||||
|
- [8. cpufetch for GPUs (gpufetch)](#8-cpufetch-for-gpus-gpufetch)
|
||||||
|
|
||||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
|
|
||||||
@@ -43,13 +44,13 @@ cpufetch supports the following architectures:
|
|||||||
- ARM
|
- ARM
|
||||||
- PowerPC
|
- PowerPC
|
||||||
|
|
||||||
| OS | x86_64 / x86 | ARM | PowerPC | Notes |
|
| OS | x86_64 / x86 | ARM | PowerPC | Notes |
|
||||||
|:---------:|:------------------------:|:-------------------:|:------------------:|:----------:|
|
|:---------:|:------------------:|:------------------:|:------------------:|:-----------------:|
|
||||||
| GNU/Linux | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | Best support |
|
| GNU/Linux | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | Best support |
|
||||||
| Windows | :heavy_check_mark: | :x: | :x: | Some information may be missing. <br> Colors will be used if supported |
|
| Windows | :heavy_check_mark: | :x: | :x: | Some information may be missing. <br> Colors will be used if supported |
|
||||||
| Android | :heavy_exclamation_mark: | :heavy_check_mark: | :x: | Some information may be missing. <br> Not tested under x86_64 |
|
| Android | :heavy_check_mark: | :heavy_check_mark: | :x: | Some information may be missing |
|
||||||
| macOS | :heavy_check_mark: | :x: | :x: | Some information may be missing. <br> Apple M1 support may be added <br> in the future (see [#47](https://github.com/Dr-Noob/cpufetch/issues/47))|
|
| macOS | :heavy_check_mark: | :heavy_check_mark: | :x: | Only the Apple M1 is supported in ARM |
|
||||||
| FreeBSD | :heavy_check_mark: | :x: | :x: | Some information may be missing. |
|
| FreeBSD | :heavy_check_mark: | :x: | :x: | Some information may be missing. |
|
||||||
|
|
||||||
# 2. Installation
|
# 2. Installation
|
||||||
## 2.1 Installing from a package
|
## 2.1 Installing from a package
|
||||||
@@ -60,7 +61,7 @@ Choose the right package for your operating system:
|
|||||||
If there is no available package for your OS, you can download the cpufetch binary from [the releases page](https://github.com/Dr-Noob/cpufetch/releases), or [build cpufetch from source](#22-building-from-source-linuxwindowsmacos) (see below).
|
If there is no available package for your OS, you can download the cpufetch binary from [the releases page](https://github.com/Dr-Noob/cpufetch/releases), or [build cpufetch from source](#22-building-from-source-linuxwindowsmacos) (see below).
|
||||||
|
|
||||||
## 2.2 Building from source (Linux/Windows/macOS)
|
## 2.2 Building from source (Linux/Windows/macOS)
|
||||||
Just clone the repo and use `make` to compile it
|
You will need a C compiler (e.g, `gcc`), and `make` to compile `cpufetch`. To do so, just clone the repo and run `make`:
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/Dr-Noob/cpufetch
|
git clone https://github.com/Dr-Noob/cpufetch
|
||||||
@@ -114,6 +115,11 @@ See [cpufetch programming documentation](https://github.com/Dr-Noob/cpufetch/doc
|
|||||||
See [cpufetch contributing guidelines](https://github.com/Dr-Noob/cpufetch/CONTRIBUTING.md)
|
See [cpufetch contributing guidelines](https://github.com/Dr-Noob/cpufetch/CONTRIBUTING.md)
|
||||||
|
|
||||||
# 7. Acknowledgements
|
# 7. Acknowledgements
|
||||||
Special thanks to [Gonzalocl](https://github.com/Gonzalocl) and [OdnetninI](https://github.com/OdnetninI). They tested `cpufetch` in its beginnings in many different CPUs they have access to, which made it easier to debug and check the correctness of `cpufetch`.
|
Thanks to the fellow contributors and interested people in the project. Special thanks to:
|
||||||
|
- [Gonzalocl](https://github.com/Gonzalocl), [OdnetninI](https://github.com/OdnetninI): Tested cpufetch in the earlier versions of the project in many different CPUs.
|
||||||
|
- [Kyngo](https://github.com/Kyngo): Tested cpufetch in the Apple M1 CPU.
|
||||||
|
- [avollmerhaus](https://github.com/avollmerhaus): Gave me ssh acess to a PowerPC machine, allowing me to develop the PowerPC port.
|
||||||
|
- [bbonev](https://github.com/bbonev), [stephan-cr](https://github.com/stephan-cr): Reviewed the source code.
|
||||||
|
|
||||||
Special thanks too to the fellow contributors and interested people in the project!
|
# 8. cpufetch for GPUs (gpufetch)
|
||||||
|
See [gpufetch](https://github.com/Dr-Noob/gpufetch) project!
|
||||||
|
|||||||
69
cpufetch.1
69
cpufetch.1
@@ -1,35 +1,50 @@
|
|||||||
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.2.
|
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.3. It was also manually adapted to look correctly
|
||||||
.TH CPUFETCH "1" "June 2021" "cpufetch v0.97 (x86_64 build)" "User Commands"
|
.TH CPUFETCH "1" "August 2021" "cpufetch v0.99 (Linux x86_64 build)" "User Commands"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
cpufetch \- Simple yet fancy CPU architecture fetching tool
|
cpufetch \- manual page for cpufetch v0.99 (Linux x86_64 build)
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B cpufetch
|
.B cpufetch
|
||||||
[\fI\,OPTION\/\fR]...
|
[\fI\,OPTION\/\fR]...
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Print detailed information about the CPU architecture. cpufetch displays information like the number of cores, microarchitecture, frequency, cache and peak performance. The program supports x86, x86_64 and ARM architectures and runs on GNU/Linux, Windows, Android and macOS (see https://github.com/Dr-Noob/cpufetch#1-support for more information)
|
Simple yet fancy CPU architecture fetching tool
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
\fB\-c\fR, \fB\-\-color\fR
|
\fB\-c\fR, \fB\-\-color\fR
|
||||||
Set the color scheme (by default, cpufetch uses the system color scheme)
|
Set the color scheme (by default, cpufetch uses the system color scheme)
|
||||||
.TP
|
.TP
|
||||||
\fB\-s\fR, \fB\-\-style\fR
|
\fB\-s\fR, \fB\-\-style\fR
|
||||||
Set the style of CPU art
|
Set the style of CPU logo
|
||||||
.TP
|
.TP
|
||||||
\fB\-d\fR, \fB\-\-debug\fR
|
\fB\-d\fR, \fB\-\-debug\fR
|
||||||
Prints CPU model and cpuid levels (debug purposes)
|
Print CPU model and cpuid levels (debug purposes)
|
||||||
|
.TP
|
||||||
|
\fB\-\-logo\-short\fR
|
||||||
|
Show the short version of the logo
|
||||||
|
.TP
|
||||||
|
\fB\-\-logo\-long\fR
|
||||||
|
Show the long version of the logo
|
||||||
.TP
|
.TP
|
||||||
\fB\-v\fR, \fB\-\-verbose\fR
|
\fB\-v\fR, \fB\-\-verbose\fR
|
||||||
Prints extra information (if available) about how cpufetch tried fetching information
|
Print extra information (if available) about how cpufetch tried fetching information
|
||||||
|
.TP
|
||||||
|
\fB\-\-logo\-intel\-old\fR
|
||||||
|
Show the old Intel logo
|
||||||
|
.TP
|
||||||
|
\fB\-\-logo\-intel\-new\fR
|
||||||
|
Show the new Intel logo
|
||||||
|
.TP
|
||||||
|
\fB\-F\fR, \fB\-\-full\-cpu\-name\fR
|
||||||
|
Show the full CPU name (do not abbreviate it)
|
||||||
.TP
|
.TP
|
||||||
\fB\-r\fR, \fB\-\-raw\fR
|
\fB\-r\fR, \fB\-\-raw\fR
|
||||||
Prints raw cpuid data
|
Print raw cpuid data (debug purposes)
|
||||||
.TP
|
.TP
|
||||||
\fB\-h\fR, \fB\-\-help\fR
|
\fB\-h\fR, \fB\-\-help\fR
|
||||||
Prints this help and exit
|
Print this help and exit
|
||||||
.TP
|
.TP
|
||||||
\fB\-V\fR, \fB\-\-version\fR
|
\fB\-V\fR, \fB\-\-version\fR
|
||||||
Prints cpufetch version and exit
|
Print cpufetch version and exit
|
||||||
.SH "COLORS:"
|
.SH COLORS
|
||||||
.TP
|
.TP
|
||||||
* "intel":
|
* "intel":
|
||||||
Use Intel default color scheme
|
Use Intel default color scheme
|
||||||
@@ -37,16 +52,15 @@ Use Intel default color scheme
|
|||||||
* "amd":
|
* "amd":
|
||||||
Use AMD default color scheme
|
Use AMD default color scheme
|
||||||
.TP
|
.TP
|
||||||
* "ibm":
|
* "ibm",
|
||||||
Use IBM default color scheme
|
Use IBM default color scheme
|
||||||
.TP
|
.TP
|
||||||
* "arm":
|
* "arm":
|
||||||
Use ARM default color scheme
|
Use ARM default color scheme
|
||||||
.TP
|
.TP
|
||||||
* custom:
|
* custom:
|
||||||
If color argument do not match "intel", "amd" or "arm", a custom scheme can be specified.
|
If the argument of \fB\-\-color\fR does not match any of the previous strings, a custom scheme can be specified. 5 colors must be given in RGB with the format: R,G,B:R,G,B:...The first 3 colors are the CPU art color and the next 2 colors are the text colors
|
||||||
4 colors must be given in RGB with the format: R,G,B:R,G,B:...The first 2 colors are the CPU art color and the next 2 colors are the text colors
|
.SH STYLES
|
||||||
.SH "STYLES:"
|
|
||||||
.TP
|
.TP
|
||||||
* "fancy":
|
* "fancy":
|
||||||
Default style
|
Default style
|
||||||
@@ -56,18 +70,21 @@ Old cpufetch style
|
|||||||
.TP
|
.TP
|
||||||
* "legacy":
|
* "legacy":
|
||||||
Fallback style for terminals that do not support colors
|
Fallback style for terminals that do not support colors
|
||||||
.SH "EXAMPLES:"
|
.SH LOGOS
|
||||||
|
.TP
|
||||||
|
cpufetch will try to adapt the logo size and the text to the terminal width. When the output (logo and text) is wider than the terminal width, cpufetch will print a smaller version of the logo (if it exists). This behavior can be overridden by \fB\-\-logo\-short\fR and \fB\-\-logo\-long\fR, which always sets the logo size as specified by the user, even if it is too big. After the logo selection (either automatically or set by the user), cpufetch will check again if the output fits in the terminal. If not, it will use a shorter name for the fields (the left part of the text). If, after all of this, the output still does not fit, cpufetch will cut the text and will only print the text until there is no space left in each line
|
||||||
|
.SH EXAMPLES
|
||||||
|
.TP
|
||||||
Run cpufetch with Intel color scheme:
|
Run cpufetch with Intel color scheme:
|
||||||
.PP
|
.IP
|
||||||
\&./cpufetch \fB\-\-color\fR intel
|
\&./cpufetch \fB\-\-color\fR intel
|
||||||
.PP
|
.TP
|
||||||
Run cpufetch with a custom color scheme:
|
Run cpufetch with a custom color scheme:
|
||||||
.PP
|
.IP
|
||||||
\&./cpufetch \fB\-\-color\fR 239,90,45:210,200,200:100,200,45:0,200,200
|
\&./cpufetch \fB\-\-color\fR 239,90,45:210,200,200:0,0,0:100,200,45:0,200,200
|
||||||
.SH "BUGS:"
|
.SH BUGS
|
||||||
|
.TP
|
||||||
Report bugs to https://github.com/Dr\-Noob/cpufetch/issues
|
Report bugs to https://github.com/Dr\-Noob/cpufetch/issues
|
||||||
.SH "NOTE:"
|
.SH NOTE
|
||||||
Peak performance information is NOT accurate. cpufetch computes peak performance using the max frequency. However, to properly compute peak performance, you need to know the frequency of the CPU running AVX code, which is not be fetched by cpufetch since it depends on each specific CPU. For peak performance measurement see peakperf (https://github.com/Dr\-Noob/peakperf)
|
.TP
|
||||||
.SH "AUTHOR:"
|
Peak performance information is NOT accurate. cpufetch computes peak performance using the max frequency of the CPU. However, to compute the peak performance, you need to know the frequency of the CPU running AVX code. This value is not be fetched by cpufetch since it depends on each specific CPU. To correctly measure peak performance, see: https://github.com/Dr\-Noob/peakperf
|
||||||
Dr-Noob (https://github.com/Dr-Noob)
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Microarchitecture information is acquired from the Main ID Register (MIDR) [[2](
|
|||||||
- `CPU part`
|
- `CPU part`
|
||||||
- `CPU revision`
|
- `CPU revision`
|
||||||
|
|
||||||
The MIDR register can be built with this information. Another posible approach is to read MIDR directly from `/sys/devices/system/cpu/cpu*/regs/identification/midr_el1`
|
The MIDR register can be built with this information. Another possible approach is to read MIDR directly from `/sys/devices/system/cpu/cpu*/regs/identification/midr_el1`
|
||||||
|
|
||||||
With the MIDR available, the approach is the same as the one used in x86_64 architectures. cpufetch has a file that acts like a database that tries to match the MIDR register with the specific CPU microarchitecture.
|
With the MIDR available, the approach is the same as the one used in x86_64 architectures. cpufetch has a file that acts like a database that tries to match the MIDR register with the specific CPU microarchitecture.
|
||||||
|
|
||||||
|
|||||||
103
src/arm/midr.c
103
src/arm/midr.c
@@ -4,8 +4,19 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/auxv.h>
|
|
||||||
#include <asm/hwcap.h>
|
#ifdef __linux__
|
||||||
|
#include <sys/auxv.h>
|
||||||
|
#include <asm/hwcap.h>
|
||||||
|
#elif defined __APPLE__ || __MACH__
|
||||||
|
#include "sysctl.h"
|
||||||
|
// From Linux kernel: arch/arm64/include/asm/cputype.h
|
||||||
|
#define MIDR_APPLE_M1_ICESTORM 0x610F0220
|
||||||
|
#define MIDR_APPLE_M1_FIRESTORM 0x610F0230
|
||||||
|
#ifndef CPUFAMILY_ARM_FIRESTORM_ICESTORM
|
||||||
|
#define CPUFAMILY_ARM_FIRESTORM_ICESTORM 0x1B588BB3
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "../common/global.h"
|
#include "../common/global.h"
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
@@ -46,7 +57,7 @@ struct topology* get_topology_info(struct cpuInfo* cpu, struct cache* cach, uint
|
|||||||
int cores_in_socket = 0;
|
int cores_in_socket = 0;
|
||||||
|
|
||||||
while(socket_idx + 1 > sockets_seen) {
|
while(socket_idx + 1 > sockets_seen) {
|
||||||
if(midr_array[first_core_idx] == midr_array[currrent_core_idx] && currrent_core_idx < ncores) {
|
if(currrent_core_idx < ncores && midr_array[first_core_idx] == midr_array[currrent_core_idx]) {
|
||||||
currrent_core_idx++;
|
currrent_core_idx++;
|
||||||
cores_in_socket++;
|
cores_in_socket++;
|
||||||
}
|
}
|
||||||
@@ -132,6 +143,7 @@ struct features* get_features_info() {
|
|||||||
*ptr = false;
|
*ptr = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
errno = 0;
|
errno = 0;
|
||||||
long hwcaps = getauxval(AT_HWCAP);
|
long hwcaps = getauxval(AT_HWCAP);
|
||||||
|
|
||||||
@@ -161,15 +173,22 @@ struct features* get_features_info() {
|
|||||||
feat->SHA1 = hwcaps & HWCAP2_SHA1;
|
feat->SHA1 = hwcaps & HWCAP2_SHA1;
|
||||||
feat->SHA2 = hwcaps & HWCAP2_SHA2;
|
feat->SHA2 = hwcaps & HWCAP2_SHA2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // ifdef __aarch64__
|
||||||
|
#elif defined __APPLE__ || __MACH__
|
||||||
|
// Must be M1
|
||||||
|
feat->AES = true;
|
||||||
|
feat->CRC32 = true;
|
||||||
|
feat->SHA1 = true;
|
||||||
|
feat->SHA2 = true;
|
||||||
|
feat->NEON = true;
|
||||||
|
#endif // ifdef __linux__
|
||||||
|
|
||||||
return feat;
|
return feat;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cpuInfo* get_cpu_info() {
|
#ifdef __linux__
|
||||||
struct cpuInfo* cpu = emalloc(sizeof(struct cpuInfo));
|
struct cpuInfo* get_cpu_info_linux(struct cpuInfo* cpu) {
|
||||||
init_cpu_info(cpu);
|
init_cpu_info(cpu);
|
||||||
|
|
||||||
int ncores = get_ncores_from_cpuinfo();
|
int ncores = get_ncores_from_cpuinfo();
|
||||||
bool success = false;
|
bool success = false;
|
||||||
int32_t* freq_array = emalloc(sizeof(uint32_t) * ncores);
|
int32_t* freq_array = emalloc(sizeof(uint32_t) * ncores);
|
||||||
@@ -224,6 +243,73 @@ struct cpuInfo* get_cpu_info() {
|
|||||||
return cpu;
|
return cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined __APPLE__ || __MACH__
|
||||||
|
void fill_cpu_info_firestorm_icestorm(struct cpuInfo* cpu) {
|
||||||
|
// 1. Fill ICESTORM
|
||||||
|
struct cpuInfo* ice = cpu;
|
||||||
|
|
||||||
|
ice->midr = MIDR_APPLE_M1_ICESTORM;
|
||||||
|
ice->arch = get_uarch_from_midr(ice->midr, ice);
|
||||||
|
ice->cach = get_cache_info(ice);
|
||||||
|
ice->feat = get_features_info();
|
||||||
|
ice->topo = malloc(sizeof(struct topology));
|
||||||
|
ice->topo->cach = ice->cach;
|
||||||
|
ice->topo->total_cores = 4;
|
||||||
|
ice->freq = malloc(sizeof(struct frequency));
|
||||||
|
ice->freq->base = UNKNOWN_FREQ;
|
||||||
|
ice->freq->max = 2064;
|
||||||
|
ice->hv = malloc(sizeof(struct hypervisor));
|
||||||
|
ice->hv->present = false;
|
||||||
|
ice->next_cpu = malloc(sizeof(struct cpuInfo));
|
||||||
|
|
||||||
|
// 2. Fill FIRESTORM
|
||||||
|
struct cpuInfo* fire = ice->next_cpu;
|
||||||
|
fire->midr = MIDR_APPLE_M1_FIRESTORM;
|
||||||
|
fire->arch = get_uarch_from_midr(fire->midr, fire);
|
||||||
|
fire->cach = get_cache_info(fire);
|
||||||
|
fire->feat = get_features_info();
|
||||||
|
fire->topo = malloc(sizeof(struct topology));
|
||||||
|
fire->topo->cach = fire->cach;
|
||||||
|
fire->topo->total_cores = 4;
|
||||||
|
fire->freq = malloc(sizeof(struct frequency));
|
||||||
|
fire->freq->base = UNKNOWN_FREQ;
|
||||||
|
fire->freq->max = 3200;
|
||||||
|
fire->hv = malloc(sizeof(struct hypervisor));
|
||||||
|
fire->hv->present = false;
|
||||||
|
fire->next_cpu = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cpuInfo* get_cpu_info_mach(struct cpuInfo* cpu) {
|
||||||
|
uint32_t cpu_family = get_sys_info_by_name("hw.cpufamily");
|
||||||
|
|
||||||
|
// Manually fill the cpuInfo assuming that the CPU
|
||||||
|
// is a ARM_FIRESTORM_ICESTORM (Apple M1)
|
||||||
|
if(cpu_family == CPUFAMILY_ARM_FIRESTORM_ICESTORM) {
|
||||||
|
cpu->num_cpus = 2;
|
||||||
|
cpu->soc = get_soc();
|
||||||
|
fill_cpu_info_firestorm_icestorm(cpu);
|
||||||
|
cpu->peak_performance = get_peak_performance(cpu);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printBug("Found invalid cpu_family: 0x%.8X", cpu_family);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cpu;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct cpuInfo* get_cpu_info() {
|
||||||
|
struct cpuInfo* cpu = malloc(sizeof(struct cpuInfo));
|
||||||
|
init_cpu_info(cpu);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
return get_cpu_info_linux(cpu);
|
||||||
|
#elif defined __APPLE__ || __MACH__
|
||||||
|
return get_cpu_info_mach(cpu);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket) {
|
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket) {
|
||||||
uint32_t size = 3+7+1;
|
uint32_t size = 3+7+1;
|
||||||
char* string = emalloc(sizeof(char)*size);
|
char* string = emalloc(sizeof(char)*size);
|
||||||
@@ -234,8 +320,9 @@ char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_soc
|
|||||||
|
|
||||||
char* get_str_features(struct cpuInfo* cpu) {
|
char* get_str_features(struct cpuInfo* cpu) {
|
||||||
struct features* feat = cpu->feat;
|
struct features* feat = cpu->feat;
|
||||||
char* string = emalloc(sizeof(char) * 25);
|
uint32_t max_len = strlen("NEON,SHA1,SHA2,AES,CRC32,") + 1;
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
|
char* string = ecalloc(max_len, sizeof(char));
|
||||||
|
|
||||||
if(feat->NEON) {
|
if(feat->NEON) {
|
||||||
strcat(string, "NEON,");
|
strcat(string, "NEON,");
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ static char* soc_trademark_string[] = {
|
|||||||
[SOC_VENDOR_EXYNOS] = "Exynos ",
|
[SOC_VENDOR_EXYNOS] = "Exynos ",
|
||||||
[SOC_VENDOR_KIRIN] = "Kirin ",
|
[SOC_VENDOR_KIRIN] = "Kirin ",
|
||||||
[SOC_VENDOR_BROADCOM] = "Broadcom BCM",
|
[SOC_VENDOR_BROADCOM] = "Broadcom BCM",
|
||||||
|
[SOC_VENDOR_APPLE] = "Apple "
|
||||||
};
|
};
|
||||||
|
|
||||||
static char* soc_rpi_string[] = {
|
static char* soc_rpi_string[] = {
|
||||||
@@ -369,7 +370,7 @@ bool match_qualcomm(char* soc_name, struct system_on_chip* soc) {
|
|||||||
SOC_EQ(tmp, "MSM8625Q", "200", SOC_SNAPD_MSM8625Q, soc, 45)
|
SOC_EQ(tmp, "MSM8625Q", "200", SOC_SNAPD_MSM8625Q, soc, 45)
|
||||||
SOC_EQ(tmp, "MSM8208", "208", SOC_SNAPD_MSM8208, soc, 28)
|
SOC_EQ(tmp, "MSM8208", "208", SOC_SNAPD_MSM8208, soc, 28)
|
||||||
SOC_EQ(tmp, "MSM8905", "205", SOC_SNAPD_MSM8905, soc, 28)
|
SOC_EQ(tmp, "MSM8905", "205", SOC_SNAPD_MSM8905, soc, 28)
|
||||||
SOC_EQ(tmp, "MSM8909", "210 / 212", SOC_SNAPD_MSM8909, soc, 28) // In the future, we can differenciate them using frequency
|
SOC_EQ(tmp, "MSM8909", "210 / 212", SOC_SNAPD_MSM8909, soc, 28) // In the future, we can differentiate them using frequency
|
||||||
SOC_EQ(tmp, "QM215", "215", SOC_SNAPD_QM215, soc, 28)
|
SOC_EQ(tmp, "QM215", "215", SOC_SNAPD_QM215, soc, 28)
|
||||||
// Snapdragon 4XX //
|
// Snapdragon 4XX //
|
||||||
SOC_EQ(tmp, "APQ8028", "400", SOC_SNAPD_APQ8028, soc, 28)
|
SOC_EQ(tmp, "APQ8028", "400", SOC_SNAPD_APQ8028, soc, 28)
|
||||||
@@ -586,6 +587,7 @@ struct system_on_chip* get_soc() {
|
|||||||
soc->soc_vendor = SOC_VENDOR_UNKNOWN;
|
soc->soc_vendor = SOC_VENDOR_UNKNOWN;
|
||||||
soc->process = UNKNOWN;
|
soc->process = UNKNOWN;
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
bool isRPi = is_raspberry_pi();
|
bool isRPi = is_raspberry_pi();
|
||||||
if(isRPi) {
|
if(isRPi) {
|
||||||
soc = guess_soc_raspbery_pi(soc);
|
soc = guess_soc_raspbery_pi(soc);
|
||||||
@@ -609,8 +611,11 @@ struct system_on_chip* get_soc() {
|
|||||||
printWarn("SoC detection failed using Android: No string found");
|
printWarn("SoC detection failed using Android: No string found");
|
||||||
else if(soc->soc_vendor == SOC_VENDOR_UNKNOWN)
|
else if(soc->soc_vendor == SOC_VENDOR_UNKNOWN)
|
||||||
printWarn("SoC detection failed using Android: Found '%s' string", soc->raw_name);
|
printWarn("SoC detection failed using Android: Found '%s' string", soc->raw_name);
|
||||||
#endif
|
#endif // ifdef __ANDROID__
|
||||||
}
|
}
|
||||||
|
#elif defined __APPLE__ || __MACH__
|
||||||
|
fill_soc(soc, "M1", SOC_APPLE_M1, 5);
|
||||||
|
#endif // ifdef __linux__
|
||||||
|
|
||||||
if(soc->raw_name == NULL) {
|
if(soc->raw_name == NULL) {
|
||||||
soc->raw_name = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN)+1));
|
soc->raw_name = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN)+1));
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ enum {
|
|||||||
SOC_VENDOR_MEDIATEK,
|
SOC_VENDOR_MEDIATEK,
|
||||||
SOC_VENDOR_EXYNOS,
|
SOC_VENDOR_EXYNOS,
|
||||||
SOC_VENDOR_KIRIN,
|
SOC_VENDOR_KIRIN,
|
||||||
SOC_VENDOR_BROADCOM
|
SOC_VENDOR_BROADCOM,
|
||||||
|
SOC_VENDOR_APPLE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct system_on_chip {
|
struct system_on_chip {
|
||||||
|
|||||||
@@ -250,6 +250,8 @@ enum {
|
|||||||
SOC_SNAPD_SM8250,
|
SOC_SNAPD_SM8250,
|
||||||
SOC_SNAPD_SM8250_AB,
|
SOC_SNAPD_SM8250_AB,
|
||||||
SOC_SNAPD_SM8350,
|
SOC_SNAPD_SM8350,
|
||||||
|
// APPLE
|
||||||
|
SOC_APPLE_M1
|
||||||
};
|
};
|
||||||
|
|
||||||
inline static VENDOR get_soc_vendor_from_soc(SOC soc) {
|
inline static VENDOR get_soc_vendor_from_soc(SOC soc) {
|
||||||
@@ -258,6 +260,7 @@ inline static VENDOR get_soc_vendor_from_soc(SOC soc) {
|
|||||||
else if(soc >= SOC_EXYNOS_3475 && soc <= SOC_EXYNOS_880) return SOC_VENDOR_EXYNOS;
|
else if(soc >= SOC_EXYNOS_3475 && soc <= SOC_EXYNOS_880) return SOC_VENDOR_EXYNOS;
|
||||||
else if(soc >= SOC_MTK_MT6889 && soc <= SOC_MTK_MT8783) return SOC_VENDOR_MEDIATEK;
|
else if(soc >= SOC_MTK_MT6889 && soc <= SOC_MTK_MT8783) return SOC_VENDOR_MEDIATEK;
|
||||||
else if(soc >= SOC_SNAPD_QSD8650 && soc <= SOC_SNAPD_SM8350) return SOC_VENDOR_SNAPDRAGON;
|
else if(soc >= SOC_SNAPD_QSD8650 && soc <= SOC_SNAPD_SM8350) return SOC_VENDOR_SNAPDRAGON;
|
||||||
|
else if(soc >= SOC_APPLE_M1 && soc <= SOC_APPLE_M1) return SOC_VENDOR_APPLE;
|
||||||
return SOC_VENDOR_UNKNOWN;
|
return SOC_VENDOR_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
25
src/arm/sysctl.c
Normal file
25
src/arm/sysctl.c
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "../common/global.h"
|
||||||
|
#include "../common/cpu.h"
|
||||||
|
|
||||||
|
uint32_t get_sys_info_by_name(char* name) {
|
||||||
|
size_t size = 0;
|
||||||
|
uint32_t ret = 0;
|
||||||
|
|
||||||
|
if (sysctlbyname(name, NULL, &size, NULL, 0) != 0) {
|
||||||
|
printWarn("sysctlbyname(%s) failed: %s", name, strerror(errno));
|
||||||
|
}
|
||||||
|
else if (size == sizeof(uint32_t)) {
|
||||||
|
sysctlbyname(name, &ret, &size, NULL, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printWarn("sysctl does not support non-integer lookup for '%s'", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
6
src/arm/sysctl.h
Normal file
6
src/arm/sysctl.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef __SYSCTL__
|
||||||
|
#define __SYSCTL__
|
||||||
|
|
||||||
|
uint32_t get_sys_info_by_name(char* name);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -32,6 +32,7 @@ enum {
|
|||||||
ISA_ARMv8_1_A,
|
ISA_ARMv8_1_A,
|
||||||
ISA_ARMv8_2_A,
|
ISA_ARMv8_2_A,
|
||||||
ISA_ARMv8_3_A,
|
ISA_ARMv8_3_A,
|
||||||
|
ISA_ARMv8_4_A,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -91,6 +92,8 @@ enum {
|
|||||||
UARCH_TEMPEST, // Apple A12 processor (big cores).
|
UARCH_TEMPEST, // Apple A12 processor (big cores).
|
||||||
UARCH_LIGHTNING, // Apple A13 processor (big cores).
|
UARCH_LIGHTNING, // Apple A13 processor (big cores).
|
||||||
UARCH_THUNDER, // Apple A13 processor (little cores).
|
UARCH_THUNDER, // Apple A13 processor (little cores).
|
||||||
|
UARCH_ICESTORM, // Apple M1 processor (little cores).
|
||||||
|
UARCH_FIRESTORM, // Apple M1 processor (big cores).
|
||||||
// CAVIUM
|
// CAVIUM
|
||||||
UARCH_THUNDERX, // Cavium ThunderX
|
UARCH_THUNDERX, // Cavium ThunderX
|
||||||
UARCH_THUNDERX2, // Cavium ThunderX2 (originally Broadcom Vulkan).
|
UARCH_THUNDERX2, // Cavium ThunderX2 (originally Broadcom Vulkan).
|
||||||
@@ -148,6 +151,8 @@ static const ISA isas_uarch[] = {
|
|||||||
[UARCH_EXYNOS_M3] = ISA_ARMv8_A,
|
[UARCH_EXYNOS_M3] = ISA_ARMv8_A,
|
||||||
[UARCH_EXYNOS_M4] = ISA_ARMv8_2_A,
|
[UARCH_EXYNOS_M4] = ISA_ARMv8_2_A,
|
||||||
[UARCH_EXYNOS_M5] = ISA_ARMv8_2_A,
|
[UARCH_EXYNOS_M5] = ISA_ARMv8_2_A,
|
||||||
|
[UARCH_ICESTORM] = ISA_ARMv8_4_A,
|
||||||
|
[UARCH_FIRESTORM] = ISA_ARMv8_4_A,
|
||||||
[UARCH_PJ4] = ISA_ARMv7_A,
|
[UARCH_PJ4] = ISA_ARMv7_A,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -162,6 +167,7 @@ static char* isas_string[] = {
|
|||||||
[ISA_ARMv8_1_A] = "ARMv8.1",
|
[ISA_ARMv8_1_A] = "ARMv8.1",
|
||||||
[ISA_ARMv8_2_A] = "ARMv8.2",
|
[ISA_ARMv8_2_A] = "ARMv8.2",
|
||||||
[ISA_ARMv8_3_A] = "ARMv8.3",
|
[ISA_ARMv8_3_A] = "ARMv8.3",
|
||||||
|
[ISA_ARMv8_4_A] = "ARMv8.4"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define UARCH_START if (false) {}
|
#define UARCH_START if (false) {}
|
||||||
@@ -280,6 +286,9 @@ struct uarch* get_uarch_from_midr(uint32_t midr, struct cpuInfo* cpu) {
|
|||||||
CHECK_UARCH(arch, cpu, 'S', 0x003, 1, NA, "Exynos M4", UARCH_EXYNOS_M4, CPU_VENDOR_SAMSUNG) // Exynos 9820
|
CHECK_UARCH(arch, cpu, 'S', 0x003, 1, NA, "Exynos M4", UARCH_EXYNOS_M4, CPU_VENDOR_SAMSUNG) // Exynos 9820
|
||||||
CHECK_UARCH(arch, cpu, 'S', 0x004, 1, NA, "Exynos M5", UARCH_EXYNOS_M5, CPU_VENDOR_SAMSUNG) // Exynos 9820 (this one looks wrong at uarch.c ...)
|
CHECK_UARCH(arch, cpu, 'S', 0x004, 1, NA, "Exynos M5", UARCH_EXYNOS_M5, CPU_VENDOR_SAMSUNG) // Exynos 9820 (this one looks wrong at uarch.c ...)
|
||||||
|
|
||||||
|
CHECK_UARCH(arch, cpu, 'a', 0x022, NA, NA, "Icestorm", UARCH_ICESTORM, CPU_VENDOR_APPLE)
|
||||||
|
CHECK_UARCH(arch, cpu, 'a', 0x023, NA, NA, "Firestorm", UARCH_FIRESTORM, CPU_VENDOR_APPLE)
|
||||||
|
|
||||||
CHECK_UARCH(arch, cpu, 'V', 0x581, NA, NA, "PJ4", UARCH_PJ4, CPU_VENDOR_MARVELL)
|
CHECK_UARCH(arch, cpu, 'V', 0x581, NA, NA, "PJ4", UARCH_PJ4, CPU_VENDOR_MARVELL)
|
||||||
CHECK_UARCH(arch, cpu, 'V', 0x584, NA, NA, "PJ4B-MP", UARCH_PJ4, CPU_VENDOR_MARVELL)
|
CHECK_UARCH(arch, cpu, 'V', 0x584, NA, NA, "PJ4B-MP", UARCH_PJ4, CPU_VENDOR_MARVELL)
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,13 @@
|
|||||||
#include "args.h"
|
#include "args.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
#define NUM_COLORS 4
|
#define NUM_COLORS 5
|
||||||
|
|
||||||
#define COLOR_STR_INTEL "intel"
|
#define COLOR_STR_INTEL "intel"
|
||||||
#define COLOR_STR_AMD "amd"
|
#define COLOR_STR_INTEL_NEW "intel-new"
|
||||||
#define COLOR_STR_IBM "ibm"
|
#define COLOR_STR_AMD "amd"
|
||||||
#define COLOR_STR_ARM "arm"
|
#define COLOR_STR_IBM "ibm"
|
||||||
|
#define COLOR_STR_ARM "arm"
|
||||||
|
|
||||||
static const char *SYTLES_STR_LIST[] = {
|
static const char *SYTLES_STR_LIST[] = {
|
||||||
[STYLE_EMPTY] = NULL,
|
[STYLE_EMPTY] = NULL,
|
||||||
@@ -24,6 +25,11 @@ struct args_struct {
|
|||||||
bool debug_flag;
|
bool debug_flag;
|
||||||
bool help_flag;
|
bool help_flag;
|
||||||
bool raw_flag;
|
bool raw_flag;
|
||||||
|
bool full_cpu_name_flag;
|
||||||
|
bool logo_long;
|
||||||
|
bool logo_short;
|
||||||
|
bool logo_intel_new;
|
||||||
|
bool logo_intel_old;
|
||||||
bool verbose_flag;
|
bool verbose_flag;
|
||||||
bool version_flag;
|
bool version_flag;
|
||||||
STYLE style;
|
STYLE style;
|
||||||
@@ -31,23 +37,33 @@ struct args_struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const char args_chr[] = {
|
const char args_chr[] = {
|
||||||
/* [ARG_CHAR_STYLE] = */ 's',
|
/* [ARG_STYLE] = */ 's',
|
||||||
/* [ARG_CHAR_COLOR] = */ 'c',
|
/* [ARG_COLOR] = */ 'c',
|
||||||
/* [ARG_CHAR_HELP] = */ 'h',
|
/* [ARG_HELP] = */ 'h',
|
||||||
/* [ARG_CHAR_RAW] = */ 'r',
|
/* [ARG_RAW] = */ 'r',
|
||||||
/* [ARG_CHAR_DEBUG] = */ 'd',
|
/* [ARG_FULLCPUNAME] = */ 'F',
|
||||||
/* [ARG_CHAR_VERBOSE] = */ 'v',
|
/* [ARG_LOGO_LONG] = */ 1,
|
||||||
/* [ARG_CHAR_VERSION] = */ 'V',
|
/* [ARG_LOGO_SHORT] = */ 2,
|
||||||
|
/* [ARG_LOGO_INTEL_NEW] = */ 3,
|
||||||
|
/* [ARG_LOGO_INTEL_OLD] = */ 4,
|
||||||
|
/* [ARG_DEBUG] = */ 'd',
|
||||||
|
/* [ARG_VERBOSE] = */ 'v',
|
||||||
|
/* [ARG_VERSION] = */ 'V',
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *args_str[] = {
|
const char *args_str[] = {
|
||||||
/* [ARG_CHAR_STYLE] = */ "style",
|
/* [ARG_STYLE] = */ "style",
|
||||||
/* [ARG_CHAR_COLOR] = */ "color",
|
/* [ARG_COLOR] = */ "color",
|
||||||
/* [ARG_CHAR_HELP] = */ "help",
|
/* [ARG_HELP] = */ "help",
|
||||||
/* [ARG_CHAR_RAW] = */ "raw",
|
/* [ARG_RAW] = */ "raw",
|
||||||
/* [ARG_CHAR_DEBUG] = */ "debug",
|
/* [ARG_FULLCPUNAME] = */ "full-cpu-name",
|
||||||
/* [ARG_CHAR_VERBOSE] = */ "verbose",
|
/* [ARG_LOGO_LONG] = */ "logo-long",
|
||||||
/* [ARG_CHAR_VERSION] = */ "version",
|
/* [ARG_LOGO_SHORT] = */ "logo-short",
|
||||||
|
/* [ARG_LOGO_INTEL_NEW] = */ "logo-intel-new",
|
||||||
|
/* [ARG_LOGO_INTEL_OLD] = */ "logo-intel-old",
|
||||||
|
/* [ARG_DEBUG] = */ "debug",
|
||||||
|
/* [ARG_VERBOSE] = */ "verbose",
|
||||||
|
/* [ARG_VERSION] = */ "version",
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct args_struct args;
|
static struct args_struct args;
|
||||||
@@ -76,6 +92,26 @@ bool show_raw() {
|
|||||||
return args.raw_flag;
|
return args.raw_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool show_full_cpu_name() {
|
||||||
|
return args.full_cpu_name_flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool show_logo_long() {
|
||||||
|
return args.logo_long;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool show_logo_short() {
|
||||||
|
return args.logo_short;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool show_logo_intel_new() {
|
||||||
|
return args.logo_intel_new;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool show_logo_intel_old() {
|
||||||
|
return args.logo_intel_old;
|
||||||
|
}
|
||||||
|
|
||||||
bool verbose_enabled() {
|
bool verbose_enabled() {
|
||||||
return args.verbose_flag;
|
return args.verbose_flag;
|
||||||
}
|
}
|
||||||
@@ -121,6 +157,7 @@ bool parse_color(char* optarg_str, struct color*** cs) {
|
|||||||
bool free_ptr = true;
|
bool free_ptr = true;
|
||||||
|
|
||||||
if(strcmp(optarg_str, COLOR_STR_INTEL) == 0) color_to_copy = COLOR_DEFAULT_INTEL;
|
if(strcmp(optarg_str, COLOR_STR_INTEL) == 0) color_to_copy = COLOR_DEFAULT_INTEL;
|
||||||
|
else if(strcmp(optarg_str, COLOR_STR_INTEL_NEW) == 0) color_to_copy = COLOR_DEFAULT_INTEL_NEW;
|
||||||
else if(strcmp(optarg_str, COLOR_STR_AMD) == 0) color_to_copy = COLOR_DEFAULT_AMD;
|
else if(strcmp(optarg_str, COLOR_STR_AMD) == 0) color_to_copy = COLOR_DEFAULT_AMD;
|
||||||
else if(strcmp(optarg_str, COLOR_STR_IBM) == 0) color_to_copy = COLOR_DEFAULT_IBM;
|
else if(strcmp(optarg_str, COLOR_STR_IBM) == 0) color_to_copy = COLOR_DEFAULT_IBM;
|
||||||
else if(strcmp(optarg_str, COLOR_STR_ARM) == 0) color_to_copy = COLOR_DEFAULT_ARM;
|
else if(strcmp(optarg_str, COLOR_STR_ARM) == 0) color_to_copy = COLOR_DEFAULT_ARM;
|
||||||
@@ -134,14 +171,16 @@ bool parse_color(char* optarg_str, struct color*** cs) {
|
|||||||
strcpy(str_to_parse, color_to_copy);
|
strcpy(str_to_parse, color_to_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sscanf(str_to_parse, "%d,%d,%d:%d,%d,%d:%d,%d,%d:%d,%d,%d",
|
ret = sscanf(str_to_parse, "%d,%d,%d:%d,%d,%d:%d,%d,%d:%d,%d,%d:%d,%d,%d",
|
||||||
&c[0]->R, &c[0]->G, &c[0]->B,
|
&c[0]->R, &c[0]->G, &c[0]->B,
|
||||||
&c[1]->R, &c[1]->G, &c[1]->B,
|
&c[1]->R, &c[1]->G, &c[1]->B,
|
||||||
&c[2]->R, &c[2]->G, &c[2]->B,
|
&c[2]->R, &c[2]->G, &c[2]->B,
|
||||||
&c[3]->R, &c[3]->G, &c[3]->B);
|
&c[3]->R, &c[3]->G, &c[3]->B,
|
||||||
|
&c[4]->R, &c[4]->G, &c[4]->B);
|
||||||
|
|
||||||
if(ret != 12) {
|
int expected_colors = 3 * NUM_COLORS;
|
||||||
printErr("Expected to read 12 values for color but read %d", ret);
|
if(ret != expected_colors) {
|
||||||
|
printErr("Expected to read %d values for color but read %d", expected_colors, ret);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,13 +211,18 @@ char* build_short_options() {
|
|||||||
memset(str, 0, sizeof(char) * (len*2 + 1));
|
memset(str, 0, sizeof(char) * (len*2 + 1));
|
||||||
|
|
||||||
#ifdef ARCH_X86
|
#ifdef ARCH_X86
|
||||||
sprintf(str, "%c:%c:%c%c%c%c%c",
|
sprintf(str, "%c:%c:%c%c%c%c%c%c%c%c%c%c",
|
||||||
c[ARG_STYLE], c[ARG_COLOR], c[ARG_HELP], c[ARG_RAW],
|
c[ARG_STYLE], c[ARG_COLOR], c[ARG_HELP],
|
||||||
|
c[ARG_RAW], c[ARG_FULLCPUNAME],
|
||||||
|
c[ARG_LOGO_SHORT], c[ARG_LOGO_LONG],
|
||||||
|
c[ARG_LOGO_INTEL_NEW], c[ARG_LOGO_INTEL_OLD],
|
||||||
c[ARG_DEBUG], c[ARG_VERBOSE], c[ARG_VERSION]);
|
c[ARG_DEBUG], c[ARG_VERBOSE], c[ARG_VERSION]);
|
||||||
#else
|
#else
|
||||||
sprintf(str, "%c:%c:%c%c%c%c",
|
sprintf(str, "%c:%c:%c%c%c%c%c%c",
|
||||||
c[ARG_STYLE], c[ARG_COLOR], c[ARG_HELP],
|
c[ARG_STYLE], c[ARG_COLOR], c[ARG_HELP],
|
||||||
c[ARG_DEBUG], c[ARG_VERBOSE], c[ARG_VERSION]);
|
c[ARG_LOGO_SHORT], c[ARG_LOGO_LONG],
|
||||||
|
c[ARG_DEBUG], c[ARG_VERBOSE],
|
||||||
|
c[ARG_VERSION]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
@@ -191,22 +235,35 @@ bool parse_args(int argc, char* argv[]) {
|
|||||||
|
|
||||||
bool color_flag = false;
|
bool color_flag = false;
|
||||||
args.debug_flag = false;
|
args.debug_flag = false;
|
||||||
|
args.full_cpu_name_flag = false;
|
||||||
args.raw_flag = false;
|
args.raw_flag = false;
|
||||||
args.verbose_flag = false;
|
args.verbose_flag = false;
|
||||||
|
args.logo_long = false;
|
||||||
|
args.logo_short = false;
|
||||||
|
args.logo_intel_new = false;
|
||||||
|
args.logo_intel_old = false;
|
||||||
args.help_flag = false;
|
args.help_flag = false;
|
||||||
args.style = STYLE_EMPTY;
|
args.style = STYLE_EMPTY;
|
||||||
args.colors = NULL;
|
args.colors = NULL;
|
||||||
|
|
||||||
|
// Temporary enable verbose level to allow printing warnings inside parse_args
|
||||||
|
set_log_level(true);
|
||||||
|
|
||||||
const struct option long_options[] = {
|
const struct option long_options[] = {
|
||||||
{args_str[ARG_STYLE], required_argument, 0, args_chr[ARG_STYLE] },
|
{args_str[ARG_STYLE], required_argument, 0, args_chr[ARG_STYLE] },
|
||||||
{args_str[ARG_COLOR], required_argument, 0, args_chr[ARG_COLOR] },
|
{args_str[ARG_COLOR], required_argument, 0, args_chr[ARG_COLOR] },
|
||||||
{args_str[ARG_HELP], no_argument, 0, args_chr[ARG_HELP] },
|
{args_str[ARG_HELP], no_argument, 0, args_chr[ARG_HELP] },
|
||||||
#ifdef ARCH_X86
|
#ifdef ARCH_X86
|
||||||
{args_str[ARG_RAW], no_argument, 0, args_chr[ARG_RAW] },
|
{args_str[ARG_LOGO_INTEL_NEW], no_argument, 0, args_chr[ARG_LOGO_INTEL_NEW] },
|
||||||
|
{args_str[ARG_LOGO_INTEL_OLD], no_argument, 0, args_chr[ARG_LOGO_INTEL_OLD] },
|
||||||
|
{args_str[ARG_FULLCPUNAME], no_argument, 0, args_chr[ARG_FULLCPUNAME] },
|
||||||
|
{args_str[ARG_RAW], no_argument, 0, args_chr[ARG_RAW] },
|
||||||
#endif
|
#endif
|
||||||
{args_str[ARG_DEBUG], no_argument, 0, args_chr[ARG_DEBUG] },
|
{args_str[ARG_LOGO_SHORT], no_argument, 0, args_chr[ARG_LOGO_SHORT] },
|
||||||
{args_str[ARG_VERBOSE], no_argument, 0, args_chr[ARG_VERBOSE] },
|
{args_str[ARG_LOGO_LONG], no_argument, 0, args_chr[ARG_LOGO_LONG] },
|
||||||
{args_str[ARG_VERSION], no_argument, 0, args_chr[ARG_VERSION] },
|
{args_str[ARG_DEBUG], no_argument, 0, args_chr[ARG_DEBUG] },
|
||||||
|
{args_str[ARG_VERBOSE], no_argument, 0, args_chr[ARG_VERBOSE] },
|
||||||
|
{args_str[ARG_VERSION], no_argument, 0, args_chr[ARG_VERSION] },
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -235,11 +292,25 @@ bool parse_args(int argc, char* argv[]) {
|
|||||||
printErr("Invalid style '%s'",optarg);
|
printErr("Invalid style '%s'",optarg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
else if(opt == args_chr[ARG_HELP]) {
|
else if(opt == args_chr[ARG_HELP]) {
|
||||||
args.help_flag = true;
|
args.help_flag = true;
|
||||||
}
|
}
|
||||||
|
else if(opt == args_chr[ARG_FULLCPUNAME]) {
|
||||||
|
args.full_cpu_name_flag = true;
|
||||||
|
}
|
||||||
|
else if(opt == args_chr[ARG_LOGO_SHORT]) {
|
||||||
|
args.logo_short = true;
|
||||||
|
}
|
||||||
|
else if(opt == args_chr[ARG_LOGO_LONG]) {
|
||||||
|
args.logo_long = true;
|
||||||
|
}
|
||||||
|
else if(opt == args_chr[ARG_LOGO_INTEL_NEW]) {
|
||||||
|
args.logo_intel_new = true;
|
||||||
|
}
|
||||||
|
else if(opt == args_chr[ARG_LOGO_INTEL_OLD]) {
|
||||||
|
args.logo_intel_old = true;
|
||||||
|
}
|
||||||
else if(opt == args_chr[ARG_RAW]) {
|
else if(opt == args_chr[ARG_RAW]) {
|
||||||
args.raw_flag = true;
|
args.raw_flag = true;
|
||||||
}
|
}
|
||||||
@@ -266,10 +337,20 @@ bool parse_args(int argc, char* argv[]) {
|
|||||||
args.help_flag = true;
|
args.help_flag = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((args.help_flag + args.version_flag + color_flag) > 1) {
|
if(args.logo_intel_new && args.logo_intel_old) {
|
||||||
printWarn("You should specify just one option");
|
printWarn("%s and %s cannot be specified together", args_str[ARG_LOGO_INTEL_NEW], args_str[ARG_LOGO_INTEL_OLD]);
|
||||||
args.help_flag = true;
|
args.logo_intel_new = false;
|
||||||
|
args.logo_intel_old = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(args.logo_short && args.logo_long) {
|
||||||
|
printWarn("%s and %s cannot be specified together", args_str[ARG_LOGO_SHORT], args_str[ARG_LOGO_LONG]);
|
||||||
|
args.logo_short = false;
|
||||||
|
args.logo_long = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leave log level untouched after returning
|
||||||
|
set_log_level(false);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ struct color {
|
|||||||
enum {
|
enum {
|
||||||
STYLE_EMPTY,
|
STYLE_EMPTY,
|
||||||
STYLE_FANCY,
|
STYLE_FANCY,
|
||||||
STYLE_WILD,
|
|
||||||
STYLE_RETRO,
|
STYLE_RETRO,
|
||||||
STYLE_LEGACY,
|
STYLE_LEGACY,
|
||||||
STYLE_INVALID
|
STYLE_INVALID
|
||||||
@@ -24,6 +23,11 @@ enum {
|
|||||||
ARG_COLOR,
|
ARG_COLOR,
|
||||||
ARG_HELP,
|
ARG_HELP,
|
||||||
ARG_RAW,
|
ARG_RAW,
|
||||||
|
ARG_FULLCPUNAME,
|
||||||
|
ARG_LOGO_LONG,
|
||||||
|
ARG_LOGO_SHORT,
|
||||||
|
ARG_LOGO_INTEL_NEW,
|
||||||
|
ARG_LOGO_INTEL_OLD,
|
||||||
ARG_DEBUG,
|
ARG_DEBUG,
|
||||||
ARG_VERBOSE,
|
ARG_VERBOSE,
|
||||||
ARG_VERSION
|
ARG_VERSION
|
||||||
@@ -37,6 +41,11 @@ extern const char *args_str[];
|
|||||||
int max_arg_str_length();
|
int max_arg_str_length();
|
||||||
bool parse_args(int argc, char* argv[]);
|
bool parse_args(int argc, char* argv[]);
|
||||||
bool show_help();
|
bool show_help();
|
||||||
|
bool show_full_cpu_name();
|
||||||
|
bool show_logo_long();
|
||||||
|
bool show_logo_short();
|
||||||
|
bool show_logo_intel_new();
|
||||||
|
bool show_logo_intel_old();
|
||||||
bool show_raw();
|
bool show_raw();
|
||||||
bool show_debug();
|
bool show_debug();
|
||||||
bool show_version();
|
bool show_version();
|
||||||
|
|||||||
@@ -1,232 +1,329 @@
|
|||||||
#ifndef __ASCII__
|
#ifndef __ASCII__
|
||||||
#define __ASCII__
|
#define __ASCII__
|
||||||
|
|
||||||
#define NUMBER_OF_LINES 19
|
#define COLOR_NONE ""
|
||||||
#define LINE_SIZE 62
|
#define C_FG_BLACK "\x1b[30;1m"
|
||||||
|
#define C_FG_RED "\x1b[31;1m"
|
||||||
|
#define C_FG_GREEN "\x1b[32;1m"
|
||||||
|
#define C_FG_YELLOW "\x1b[33;1m"
|
||||||
|
#define C_FG_BLUE "\x1b[34;1m"
|
||||||
|
#define C_FG_MAGENTA "\x1b[35;1m"
|
||||||
|
#define C_FG_CYAN "\x1b[36;1m"
|
||||||
|
#define C_FG_WHITE "\x1b[37;1m"
|
||||||
|
#define C_BG_BLACK "\x1b[40;1m"
|
||||||
|
#define C_BG_RED "\x1b[41;1m"
|
||||||
|
#define C_BG_GREEN "\x1b[42;1m"
|
||||||
|
#define C_BG_YELLOW "\x1b[43;1m"
|
||||||
|
#define C_BG_BLUE "\x1b[44;1m"
|
||||||
|
#define C_BG_MAGENTA "\x1b[45;1m"
|
||||||
|
#define C_BG_CYAN "\x1b[46;1m"
|
||||||
|
#define C_BG_WHITE "\x1b[47;1m"
|
||||||
|
#define C_FG_B_BLACK "\x1b[90;1m"
|
||||||
|
#define C_FG_B_RED "\x1b[91;1m"
|
||||||
|
#define C_FG_B_GREEN "\x1b[92;1m"
|
||||||
|
#define C_FG_B_YELLOW "\x1b[93;1m"
|
||||||
|
#define C_FG_B_BLUE "\x1b[94;1m"
|
||||||
|
#define C_FG_B_MAGENTA "\x1b[95;1m"
|
||||||
|
#define C_FG_B_CYAN "\x1b[96;1m"
|
||||||
|
#define C_FG_B_WHITE "\x1b[97;1m"
|
||||||
|
#define COLOR_RESET "\x1b[m"
|
||||||
|
|
||||||
#define AMD_ASCII \
|
struct ascii_logo {
|
||||||
" \
|
char* art;
|
||||||
\
|
uint32_t width;
|
||||||
\
|
uint32_t height;
|
||||||
\
|
bool replace_blocks;
|
||||||
\
|
char color_ascii[3][100];
|
||||||
\
|
char color_text[2][100];
|
||||||
@@@@ @@@ @@@ @@@@@@@@ ############ \
|
};
|
||||||
@@@@@@ @@@@@ @@@@@ @@@ @@@ ########## \
|
|
||||||
@@@ @@@ @@@@@@@@@@@@@ @@@ @@ # ##### \
|
|
||||||
@@@ @@@ @@@ @@@ @@@ @@@ @@ ### ##### \
|
|
||||||
@@@@@@@@@@@@ @@@ @@@ @@@ @@@ ######### ### \
|
|
||||||
@@@ @@@ @@@ @@@ @@@@@@@@@ ######## ## \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
#define INTEL_ASCII \
|
/*
|
||||||
" ################ \
|
* ASCII logos brief documentation
|
||||||
####### ####### \
|
* ----------------------------------------------------
|
||||||
#### #### \
|
* C1, C2, ...: ColorN, gets replaced by printer.c with
|
||||||
### #### \
|
* the color in ascii_logo->color_ascii[N]
|
||||||
### ### \
|
* CR: Color reset, gets replaced by the reset
|
||||||
### ### \
|
* color by printer.c
|
||||||
# ### ### ### \
|
*
|
||||||
## ### ######### ###### ###### ### ### \
|
* Logos with replace_blocks=true are replaced by character
|
||||||
## ### ### ### ### #### #### ### ### \
|
* blocks (actually, spaces with background color), so
|
||||||
## ### ### ### ### ### ### ### ### \
|
* the color in the structure must be C_BG_XXX. When
|
||||||
## ### ### ### ### ########## ### #### \
|
* replace_blocks is true, the characters '#' are replaced
|
||||||
## ### ### ### ### ### ### ##### \
|
* by spaces printed with color_ascii[0], and '@' are
|
||||||
## ## ### ### ##### ######### ## ### \
|
* printed with color_ascii[1]. If replace_blocks=true,
|
||||||
### \
|
* color format specified in ASCIIs ($C1, $C2) are ignored.
|
||||||
### \
|
*
|
||||||
#### #### \
|
* In any case, '$' is a illegal character to be used in
|
||||||
##### ########## \
|
* the ascii logos because it is used to parse colors
|
||||||
########## ################ \
|
*
|
||||||
############################### "
|
* LONG_LOGOS will be printed only if the fit in the screen,
|
||||||
|
* otherwise SHORT_LOGOS will be used
|
||||||
#define SNAPDRAGON_ASCII \
|
*/
|
||||||
" \
|
|
||||||
@@######## \
|
|
||||||
@@@@@########### \
|
|
||||||
@@ @@@@@################# \
|
|
||||||
@@@@@@@@@@#################### \
|
|
||||||
@@@@@@@@@@@@##################### \
|
|
||||||
@@@@@@@@@@@@@@@#################### \
|
|
||||||
@@@@@@@@@@@@@@@@@################### \
|
|
||||||
@@@@@@@@@@@@@@@@@@@@################ \
|
|
||||||
@@@@@@@@@@@@@@@@@@@@############# \
|
|
||||||
@@@@@@@@@@@@@@@@@@############ \
|
|
||||||
@ @@@@@@@@@@@@@@@########### \
|
|
||||||
@@@@@ @@@@@@@@@@@@@########## \
|
|
||||||
@@@@@@@@@ @@@@@@@@@@@@######## \
|
|
||||||
@@@@@@@@@ @@@@@@@@@@####### \
|
|
||||||
@@@@@@@@@@@@@@@@####### \
|
|
||||||
@@@@########### \
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
#define MEDIATEK_ASCII \
|
|
||||||
" \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
## ## ###### ###### # ### @@@@@@ @@@@@@ @@ @@ \
|
|
||||||
### ### # # # # #### @@ @ @@ @@ \
|
|
||||||
######## # ### # # # ## ## @@ @ @@@ @@@@ \
|
|
||||||
## ### ## # # # # ## ## @@ @ @@ @@ \
|
|
||||||
## ## ## ###### ##### # ## ## @@ @@@@@@ @@ @@ \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
#define EXYNOS_ASCII \
|
// SHORT LOGOS //
|
||||||
" \
|
#define ASCII_AMD \
|
||||||
\
|
"$C2 '############### \
|
||||||
\
|
$C2 ,############# \
|
||||||
\
|
$C2 .#### \
|
||||||
\
|
$C2 #. .#### \
|
||||||
\
|
$C2 :##. .#### \
|
||||||
## ## ## \
|
$C2 :###. .#### \
|
||||||
## ## \
|
$C2 #########. :## \
|
||||||
## \
|
$C2 #######. ; \
|
||||||
## ## \
|
$C1 \
|
||||||
## ## ## \
|
$C1 ### ### ### ####### \
|
||||||
\
|
$C1 ## ## ##### ##### ## ## \
|
||||||
SAMSUNG \
|
$C1 ## ## ### #### ### ## ## \
|
||||||
Exynos \
|
$C1 ######### ### ## ### ## ## \
|
||||||
\
|
$C1## ## ### ### ## ## \
|
||||||
\
|
$C1## ## ### ### ####### "
|
||||||
\
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
#define KIRIN_ASCII \
|
|
||||||
" \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
####### \
|
|
||||||
##### #################### \
|
|
||||||
###################################### \
|
|
||||||
####################################### \
|
|
||||||
####################################### \
|
|
||||||
############################## \
|
|
||||||
########################## \
|
|
||||||
######################### \
|
|
||||||
######################## \
|
|
||||||
######################## \
|
|
||||||
######################### \
|
|
||||||
######################### \
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
#define BROADCOM_ASCII \
|
|
||||||
" \
|
|
||||||
################ \
|
|
||||||
########################## \
|
|
||||||
################################ \
|
|
||||||
################@@@@################ \
|
|
||||||
################@@@@@@################ \
|
|
||||||
#################@@@@@@################# \
|
|
||||||
#################@@@@@@@@################# \
|
|
||||||
#################@@@@@@@@################# \
|
|
||||||
################@@@@##@@@@################ \
|
|
||||||
################@@@@##@@@@################ \
|
|
||||||
###############@@@@####@@@@############### \
|
|
||||||
@@@@@@@@@@####@@@@####@@@@####@@@@@@@@@@ \
|
|
||||||
######@@@@@@@@@@######@@@@@@@@@@###### \
|
|
||||||
################################## \
|
|
||||||
############################## \
|
|
||||||
######################## \
|
|
||||||
############### \
|
|
||||||
"
|
|
||||||
|
|
||||||
#define ARM_ASCII \
|
|
||||||
" \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
############ ########## #### ###### ######## \
|
|
||||||
############### ######### ####################### \
|
|
||||||
#### #### #### ##### ####### ##### \
|
|
||||||
#### #### #### #### ##### #### \
|
|
||||||
#### #### #### #### #### #### \
|
|
||||||
#### ##### #### #### #### #### \
|
|
||||||
############### #### #### #### #### \
|
|
||||||
######## #### #### #### #### #### \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
// jp2a --height=17 ibm.jpg
|
#define ASCII_INTEL \
|
||||||
#define IBM_ASCII \
|
"$C1 .#################. \
|
||||||
" \
|
$C1 .#### ####. \
|
||||||
\
|
$C1 .## ### \
|
||||||
\
|
$C1 ## :## ### \
|
||||||
############ ################ ########## ########## \
|
$C1 # ## :## ## \
|
||||||
\
|
$C1 ## ## ######. #### ###### :## ## \
|
||||||
############ ################## ############ ############ \
|
$C1 ## ## ##: ##: ## ## ### :## ### \
|
||||||
\
|
$C1## ## ##: ##: ## :######## :## ## \
|
||||||
###### ###### ###### #################### \
|
$C1## ## ##: ##: ## ##. . :## #### \
|
||||||
\
|
$C1## # ##: ##: #### #####: ## \
|
||||||
###### ############## #################### \
|
$C1 ## \
|
||||||
\
|
$C1 ###. ..o####. \
|
||||||
###### ###### ###### ##### ###### ##### \
|
$C1 ######oo... ..oo####### \
|
||||||
\
|
$C1 o###############o "
|
||||||
############ ################## ######### #### ######### \
|
|
||||||
\
|
|
||||||
############ ################ ######### ## ######### \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
"
|
|
||||||
|
|
||||||
|
#define ASCII_INTEL_NEW \
|
||||||
|
"$C1 MMM oddl MMN \
|
||||||
|
$C1 MMM dMMN MMN \
|
||||||
|
$C1 ... .... ... dMMM.. .cc. NMN \
|
||||||
|
$C1 MMM :MMMdWMMMMMX. dMMMMM, .XMMMMMMNo MMN \
|
||||||
|
$C1 MMM :MMMp dMMM dMMX .NMW WMN. MMN \
|
||||||
|
$C1 MMM :MMM WMM dMMK kMMXooooooNMMx MMN \
|
||||||
|
$C1 MMM :MMM NMM dMMK dMMX MMN \
|
||||||
|
$C1 MMM :MMM NMM dMMMoo OMM0....:Nx. MMN \
|
||||||
|
$C1 MMM :WWW XWW lONMM 'xXMMMMNOc MMN "
|
||||||
|
|
||||||
#define UNKNOWN_ASCII \
|
#define ASCII_SNAPD \
|
||||||
" \
|
" $C1@@$C2######## \
|
||||||
\
|
$C1@@@@@$C2########### \
|
||||||
\
|
$C1@@ @@@@@$C2################# \
|
||||||
\
|
$C1@@@@@@@@@@$C2#################### \
|
||||||
\
|
$C1@@@@@@@@@@@@$C2##################### \
|
||||||
\
|
$C1@@@@@@@@@@@@@@@$C2#################### \
|
||||||
\
|
$C1@@@@@@@@@@@@@@@@@$C2################### \
|
||||||
\
|
$C1@@@@@@@@@@@@@@@@@@@@$C2################ \
|
||||||
\
|
$C1@@@@@@@@@@@@@@@@@@@@$C2############# \
|
||||||
\
|
$C1@@@@@@@@@@@@@@@@@@$C2############ \
|
||||||
\
|
$C1@ @@@@@@@@@@@@@@@$C2########### \
|
||||||
\
|
$C1@@@@@ @@@@@@@@@@@@@$C2########## \
|
||||||
\
|
$C1@@@@@@@@@ @@@@@@@@@@@@$C2######## \
|
||||||
\
|
$C1@@@@@@@@@ @@@@@@@@@@$C2####### \
|
||||||
\
|
$C1@@@@@@@@@@@@@@@@$C2####### \
|
||||||
\
|
$C1@@@@$C2########### "
|
||||||
\
|
|
||||||
\
|
#define ASCII_MTK \
|
||||||
"
|
"$C1 ## ## ###### ###### # ### $C2@@@@@@ @@@@@@ @@ @@ \
|
||||||
|
$C1 ### ### # # # # #### $C2@@ @ @@ @@ \
|
||||||
static const char* ASCII_ARRAY [] = {
|
$C1 ######## # ### # # # ## ## $C2@@ @ @@@ @@@@ \
|
||||||
AMD_ASCII,
|
$C1 ## ### ## # # # # ## ## $C2@@ @ @@ @@ \
|
||||||
INTEL_ASCII,
|
$C1## ## ## ###### ##### # ## ## $C2@@ @@@@@@ @@ @@ "
|
||||||
ARM_ASCII,
|
|
||||||
SNAPDRAGON_ASCII,
|
#define ASCII_EXYNOS \
|
||||||
MEDIATEK_ASCII,
|
"$C2 \
|
||||||
EXYNOS_ASCII,
|
$C2 \
|
||||||
KIRIN_ASCII,
|
$C2 \
|
||||||
BROADCOM_ASCII,
|
$C1##$CR $C1##$CR $C1##$CR \
|
||||||
IBM_ASCII,
|
$C1##$CR $C1##$CR \
|
||||||
UNKNOWN_ASCII
|
$C1##$CR \
|
||||||
};
|
$C1##$CR $C1##$CR \
|
||||||
|
$C1##$CR $C1##$CR $C1##$CR \
|
||||||
|
$C2 \
|
||||||
|
$C2 SAMSUNG \
|
||||||
|
$C2 Exynos \
|
||||||
|
$C2 \
|
||||||
|
$C2 "
|
||||||
|
|
||||||
|
#define ASCII_KIRIN \
|
||||||
|
"$C1 ####### \
|
||||||
|
$C1 ##### #################### \
|
||||||
|
$C1 ###################################### \
|
||||||
|
$C1 ####################################### \
|
||||||
|
$C1 ####################################### \
|
||||||
|
$C1 ############################## \
|
||||||
|
$C1 ########################## \
|
||||||
|
$C1 ######################### \
|
||||||
|
$C1 ######################## \
|
||||||
|
$C1 ######################## \
|
||||||
|
$C1 ######################### \
|
||||||
|
$C1######################### "
|
||||||
|
|
||||||
|
#define ASCII_BROADCOM \
|
||||||
|
"$C2 \
|
||||||
|
$C2 ################ \
|
||||||
|
$C2 ########################## \
|
||||||
|
$C2 ################################ \
|
||||||
|
$C2 ################$C1@@@@$C2################ \
|
||||||
|
$C2 ################$C1@@@@@@$C2################ \
|
||||||
|
$C2 #################$C1@@@@@@$C2################# \
|
||||||
|
$C2#################$C1@@@@@@@@$C2################# \
|
||||||
|
$C2#################$C1@@@@@@@@$C2################# \
|
||||||
|
$C2################$C1@@@@$C2##$C1@@@@$C2################ \
|
||||||
|
$C2################$C1@@@@$C2##$C1@@@@$C2################ \
|
||||||
|
$C2###############$C1@@@@$C2####$C1@@@@$C2############### \
|
||||||
|
$C1 @@@@@@@@@@$C2####$C1@@@@$C2####$C1@@@@$C2####$C1@@@@@@@@@@ \
|
||||||
|
$C2 ######$C1@@@@@@@@@@$C2######$C1@@@@@@@@@@$C2###### \
|
||||||
|
$C2 ################################## \
|
||||||
|
$C2 ############################## \
|
||||||
|
$C2 ######################## \
|
||||||
|
$C2 ############### \
|
||||||
|
$C2 "
|
||||||
|
|
||||||
|
#define ASCII_ARM \
|
||||||
|
"$C1 ##### ## # ##### ## #### ###### \
|
||||||
|
$C1 ### #### ### #### ### ### \
|
||||||
|
$C1### ## ### ### ## ### \
|
||||||
|
$C1 ### #### ### ### ## ### \
|
||||||
|
$C1 ###### ## ### ### ## ### "
|
||||||
|
|
||||||
|
#define ASCII_IBM \
|
||||||
|
"$C1######## ########## ###### ###### \
|
||||||
|
$C1######## ########### ####### ####### \
|
||||||
|
$C1 #### ### #### ###### ###### \
|
||||||
|
$C1 #### ### ### ####### ####### \
|
||||||
|
$C1 #### ######## ############### \
|
||||||
|
$C1 #### ### ### #### ##### #### \
|
||||||
|
$C1 #### ### #### #### ### #### \
|
||||||
|
$C1######## ########### ###### # ###### \
|
||||||
|
$C1######## ########## ###### ###### "
|
||||||
|
|
||||||
|
// inspired by the neofetch mac logo
|
||||||
|
#define ASCII_APPLE \
|
||||||
|
"$C1 .\"c. \
|
||||||
|
$C1 ,xNMM. \
|
||||||
|
$C1 .lMM\" \
|
||||||
|
$C1 MM* \
|
||||||
|
$C1 .;loddo;:. olloddol;. \
|
||||||
|
$C1 cKMMMMMMMMMMNWMMMMMMMMMMM0: \
|
||||||
|
$C1 .KMMMMMMMMMMMMMMMMMMMMMMMW* \
|
||||||
|
$C1 XMMMMMMMMMMMMMMMMMMMMMMMX. \
|
||||||
|
$C1;MMMMMMMMMMMMMMMMMMMMMMMM: \
|
||||||
|
$C1:MMMMMMMMMMMMMMMMMMMMMMMM: \
|
||||||
|
$C1.MMMMMMMMMMMMMMMMMMMMMMMMX. \
|
||||||
|
$C1 kMMMMMMMMMMMMMMMMMMMMMMMMWd. \
|
||||||
|
$C1 'XMMMMMMMMMMMMMMMMMMMMMMMMMMk \
|
||||||
|
$C1 'XMMMMMMMMMMMMMMMMMMMMMMMMK. \
|
||||||
|
$C1 kMMMMMMMMMMMMMMMMMMMMMMd \
|
||||||
|
$C1 'KMMMMMMMWXXWMMMMMMMk. \
|
||||||
|
$C1 \"cooc\"* \"*coo'\" "
|
||||||
|
|
||||||
|
// --------------------- LONG LOGOS ------------------------- //
|
||||||
|
#define ASCII_AMD_L \
|
||||||
|
"$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 @@@@ @@@ @@@ @@@@@@@@ $C2 ############ \
|
||||||
|
$C1 @@@@@@ @@@@@ @@@@@ @@@ @@@ $C2 ########## \
|
||||||
|
$C1 @@@ @@@ @@@@@@@@@@@@@ @@@ @@ $C2 # ##### \
|
||||||
|
$C1 @@@ @@@ @@@ @@@ @@@ @@@ @@ $C2 ### ##### \
|
||||||
|
$C1 @@@@@@@@@@@@ @@@ @@@ @@@ @@@ $C2######### ### \
|
||||||
|
$C1 @@@ @@@ @@@ @@@ @@@@@@@@@ $C2######## ## \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 \
|
||||||
|
$C1 "
|
||||||
|
|
||||||
|
#define ASCII_INTEL_L \
|
||||||
|
"$C1 ###############@ \
|
||||||
|
$C1 ######@ ######@ \
|
||||||
|
$C1 ###@ ###@ \
|
||||||
|
$C1 ##@ ###@ \
|
||||||
|
$C1 ##@ ##@ \
|
||||||
|
$C1 ##@ ##@ \
|
||||||
|
$C1 @ ##@ ##@ ##@ \
|
||||||
|
$C1 #@ ##@ ########@ #####@ #####@ ##@ ##@ \
|
||||||
|
$C1 #@ ##@ ##@ ##@ ##@ ###@ ###@ ##@ ##@ \
|
||||||
|
$C1 #@ ##@ ##@ ##@ ##@ ##@ ##@ ##@ ##@ \
|
||||||
|
$C1 #@ ##@ ##@ ##@ ##@ #########@ ##@ ###@ \
|
||||||
|
$C1 #@ ##@ ##@ ##@ ##@ ##@ ##@ ####@ \
|
||||||
|
$C1 #@ #@ ##@ ##@ ####@ ########@ #@ ##@ \
|
||||||
|
$C1 ##@ \
|
||||||
|
$C1 ##@ \
|
||||||
|
$C1 ###@ ###@ \
|
||||||
|
$C1 ####@ #########@ \
|
||||||
|
$C1 #########@ ###############@ \
|
||||||
|
$C1 ##############################@ "
|
||||||
|
|
||||||
|
#define ASCII_INTEL_L_NEW \
|
||||||
|
" ####################################################### \
|
||||||
|
####################################################### \
|
||||||
|
####%%%#################@@@#####################@@@#### \
|
||||||
|
####%%%#################@@@#####################@@@#### \
|
||||||
|
########################@@@#####################@@@#### \
|
||||||
|
####@@@##@@@#@@@@@@@####@@@@@@####@@@@@@@@@#####@@@#### \
|
||||||
|
####@@@##@@@@@@@@@@@@###@@@@@@##@@@@#####@@@@###@@@#### \
|
||||||
|
####@@@##@@@@#####@@@@##@@@####@@@@#######@@@@##@@@#### \
|
||||||
|
####@@@##@@@#######@@@##@@@####@@@@@@@@@@@@@@@##@@@#### \
|
||||||
|
####@@@##@@@#######@@@##@@@####@@@@#############@@@#### \
|
||||||
|
####@@@##@@@#######@@@##@@@@@@##@@@@#####@@@@###@@@#### \
|
||||||
|
####@@@##@@@#######@@@###@@@@@####@@@@@@@@@#####@@@#### \
|
||||||
|
####################################################### \
|
||||||
|
####################################################### "
|
||||||
|
|
||||||
|
#define ASCII_ARM_L \
|
||||||
|
"$C1 ############ ########## #### ####### ######## \
|
||||||
|
$C1 ############### ######### ######################## \
|
||||||
|
$C1 #### #### #### ##### ######## ##### \
|
||||||
|
$C1#### #### #### #### ###### #### \
|
||||||
|
$C1#### #### #### #### #### #### \
|
||||||
|
$C1 #### ##### #### #### #### #### \
|
||||||
|
$C1 ############### #### #### #### #### \
|
||||||
|
$C1 ######## #### #### #### #### #### "
|
||||||
|
|
||||||
|
#define ASCII_IBM_L \
|
||||||
|
"$C1 ############ ################ ########## ########## \
|
||||||
|
$C1 \
|
||||||
|
$C1 ############ ################## ############ ############ \
|
||||||
|
$C1 \
|
||||||
|
$C1 ###### ###### ###### #################### \
|
||||||
|
$C1 \
|
||||||
|
$C1 ###### ############## #################### \
|
||||||
|
$C1 \
|
||||||
|
$C1 ###### ###### ###### ##### ###### ##### \
|
||||||
|
$C1 \
|
||||||
|
$C1 ############ ################## ######### #### ######### \
|
||||||
|
$C1 \
|
||||||
|
$C1 ############ ################ ######### ## ######### "
|
||||||
|
|
||||||
|
typedef struct ascii_logo asciiL;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------------+
|
||||||
|
// | LOGO | W | H | REPLACE | COLORS LOGO (>0 && <10) | COLORS TEXT (=2) |
|
||||||
|
// ------------------------------------------------------------------------------------------------------+
|
||||||
|
asciiL logo_amd = { ASCII_AMD, 39, 15, false, {C_FG_WHITE, C_FG_GREEN}, {C_FG_WHITE, C_FG_GREEN} };
|
||||||
|
asciiL logo_intel = { ASCII_INTEL, 48, 14, false, {C_FG_CYAN}, {C_FG_CYAN, C_FG_WHITE} };
|
||||||
|
asciiL logo_intel_new = { ASCII_INTEL_NEW, 51, 9, false, {C_FG_CYAN}, {C_FG_CYAN, C_FG_WHITE} };
|
||||||
|
asciiL logo_snapd = { ASCII_SNAPD, 39, 16, false, {C_FG_RED, C_FG_WHITE}, {C_FG_RED, C_FG_WHITE} };
|
||||||
|
asciiL logo_mtk = { ASCII_MTK, 59, 5, false, {C_FG_BLUE, C_FG_YELLOW}, {C_FG_BLUE, C_FG_YELLOW} };
|
||||||
|
asciiL logo_exynos = { ASCII_EXYNOS, 22, 13, true, {C_BG_BLUE, C_FG_WHITE}, {C_FG_BLUE, C_FG_WHITE} };
|
||||||
|
asciiL logo_kirin = { ASCII_KIRIN, 53, 12, false, {C_FG_RED}, {C_FG_WHITE, C_FG_RED} };
|
||||||
|
asciiL logo_broadcom = { ASCII_BROADCOM, 44, 19, false, {C_FG_WHITE, C_FG_RED}, {C_FG_WHITE, C_FG_RED} };
|
||||||
|
asciiL logo_arm = { ASCII_ARM, 42, 5, false, {C_FG_CYAN}, {C_FG_WHITE, C_FG_CYAN} };
|
||||||
|
asciiL logo_ibm = { ASCII_IBM, 42, 9, false, {C_FG_CYAN, C_FG_WHITE}, {C_FG_CYAN, C_FG_WHITE} };
|
||||||
|
asciiL logo_apple = { ASCII_APPLE, 32, 17, false, {C_FG_WHITE}, {C_FG_B_BLACK, C_FG_B_WHITE} };
|
||||||
|
// Long variants | ----------------------------------------------------------------------------------------------------|
|
||||||
|
asciiL logo_amd_l = { ASCII_AMD_L, 62, 19, true, {C_BG_WHITE, C_BG_GREEN}, {C_FG_WHITE, C_FG_GREEN} };
|
||||||
|
asciiL logo_intel_l = { ASCII_INTEL_L, 62, 19, true, {C_BG_CYAN, C_BG_WHITE}, {C_FG_CYAN, C_FG_WHITE} };
|
||||||
|
asciiL logo_intel_l_new = { ASCII_INTEL_L_NEW, 57, 14, true, {C_BG_CYAN, C_BG_WHITE, C_BG_BLUE}, {C_FG_CYAN, C_FG_WHITE} };
|
||||||
|
asciiL logo_arm_l = { ASCII_ARM_L, 60, 8, true, {C_BG_CYAN}, {C_FG_WHITE, C_FG_CYAN} };
|
||||||
|
asciiL logo_ibm_l = { ASCII_IBM_L, 62, 13, true, {C_BG_CYAN, C_FG_WHITE}, {C_FG_CYAN, C_FG_WHITE} };
|
||||||
|
asciiL logo_unknown = { NULL, 0, 0, false, {COLOR_NONE}, {COLOR_NONE, COLOR_NONE} };
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
#include "../arm/uarch.h"
|
#include "../arm/uarch.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define UNUSED(x) (void)(x)
|
||||||
|
|
||||||
#define STRING_YES "Yes"
|
#define STRING_YES "Yes"
|
||||||
#define STRING_NO "No"
|
#define STRING_NO "No"
|
||||||
#define STRING_NONE "None"
|
#define STRING_NONE "None"
|
||||||
@@ -33,7 +35,14 @@ int64_t get_freq(struct frequency* freq) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(ARCH_X86) || defined(ARCH_PPC)
|
#if defined(ARCH_X86) || defined(ARCH_PPC)
|
||||||
char* get_str_cpu_name(struct cpuInfo* cpu) {
|
char* get_str_cpu_name(struct cpuInfo* cpu, bool fcpuname) {
|
||||||
|
#ifdef ARCH_X86
|
||||||
|
if(!fcpuname) {
|
||||||
|
return get_str_cpu_name_abbreviated(cpu);
|
||||||
|
}
|
||||||
|
#elif ARCH_PPC
|
||||||
|
UNUSED(fcpuname);
|
||||||
|
#endif
|
||||||
return cpu->cpu_name;
|
return cpu->cpu_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ enum {
|
|||||||
CPU_VENDOR_AMD,
|
CPU_VENDOR_AMD,
|
||||||
// ARCH_ARM
|
// ARCH_ARM
|
||||||
CPU_VENDOR_ARM,
|
CPU_VENDOR_ARM,
|
||||||
|
CPU_VENDOR_APPLE,
|
||||||
CPU_VENDOR_BROADCOM,
|
CPU_VENDOR_BROADCOM,
|
||||||
CPU_VENDOR_CAVIUM,
|
CPU_VENDOR_CAVIUM,
|
||||||
CPU_VENDOR_NVIDIA,
|
CPU_VENDOR_NVIDIA,
|
||||||
@@ -147,7 +148,7 @@ struct cpuInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if defined(ARCH_X86) || defined(ARCH_PPC)
|
#if defined(ARCH_X86) || defined(ARCH_PPC)
|
||||||
char* get_str_cpu_name(struct cpuInfo* cpu);
|
char* get_str_cpu_name(struct cpuInfo* cpu, bool fcpuname);
|
||||||
char* get_str_sockets(struct topology* topo);
|
char* get_str_sockets(struct topology* topo);
|
||||||
uint32_t get_nsockets(struct topology* topo);
|
uint32_t get_nsockets(struct topology* topo);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -58,9 +58,9 @@ void printBug(const char *fmt, ...) {
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
fprintf(stderr,RED "[ERROR]: "RESET "%s\n",buffer);
|
fprintf(stderr,RED "[ERROR]: "RESET "%s\n",buffer);
|
||||||
#if defined(ARCH_X86) || defined(ARCH_PPC)
|
#if defined(ARCH_X86) || defined(ARCH_PPC)
|
||||||
fprintf(stderr,"Please, create a new issue with this error message and the output of 'cpufetch --debug' in https://github.com/Dr-Noob/cpufetch/issues\n");
|
fprintf(stderr,"Please, create a new issue with this error message and the output of 'cpufetch --debug' on https://github.com/Dr-Noob/cpufetch/issues\n");
|
||||||
#elif ARCH_ARM
|
#elif ARCH_ARM
|
||||||
fprintf(stderr,"Please, create a new issue with this error message, your smartphone/computer model and the output of 'cpufetch --debug' in https://github.com/Dr-Noob/cpufetch/issues\n");
|
fprintf(stderr,"Please, create a new issue with this error message, your smartphone/computer model and the output of 'cpufetch --debug' on https://github.com/Dr-Noob/cpufetch/issues\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,6 +73,23 @@ int max(int a, int b) {
|
|||||||
return a > b ? a : b;
|
return a > b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int min(int a, int b) {
|
||||||
|
return a < b ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strremove(char *str, const char *sub) {
|
||||||
|
char *p, *q, *r;
|
||||||
|
if (*sub && (q = r = strstr(str, sub)) != NULL) {
|
||||||
|
size_t len = strlen(sub);
|
||||||
|
while ((r = strstr(p = r + len, sub)) != NULL) {
|
||||||
|
memmove(q, p, r - p);
|
||||||
|
q += r - p;
|
||||||
|
}
|
||||||
|
memmove(q, p, strlen(p) + 1);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
void* emalloc(size_t size) {
|
void* emalloc(size_t size) {
|
||||||
void* ptr = malloc(size);
|
void* ptr = malloc(size);
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ void set_log_level(bool verbose);
|
|||||||
void printWarn(const char *fmt, ...);
|
void printWarn(const char *fmt, ...);
|
||||||
void printErr(const char *fmt, ...);
|
void printErr(const char *fmt, ...);
|
||||||
void printBug(const char *fmt, ...);
|
void printBug(const char *fmt, ...);
|
||||||
|
int min(int a, int b);
|
||||||
int max(int a, int b);
|
int max(int a, int b);
|
||||||
|
char *strremove(char *str, const char *sub);
|
||||||
void* emalloc(size_t size);
|
void* emalloc(size_t size);
|
||||||
void* ecalloc(size_t nmemb, size_t size);
|
void* ecalloc(size_t nmemb, size_t size);
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
static const char* OS_STR = "Unknown OS";
|
static const char* OS_STR = "Unknown OS";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char* VERSION = "0.99";
|
static const char* VERSION = "1.00";
|
||||||
|
|
||||||
void print_help(char *argv[]) {
|
void print_help(char *argv[]) {
|
||||||
const char **t = args_str;
|
const char **t = args_str;
|
||||||
@@ -43,49 +43,64 @@ void print_help(char *argv[]) {
|
|||||||
printf("Usage: %s [OPTION]...\n", argv[0]);
|
printf("Usage: %s [OPTION]...\n", argv[0]);
|
||||||
printf("Simple yet fancy CPU architecture fetching tool\n\n");
|
printf("Simple yet fancy CPU architecture fetching tool\n\n");
|
||||||
|
|
||||||
printf("Options: \n");
|
printf("OPTIONS: \n");
|
||||||
printf(" -%c, --%s %*s Set the color scheme (by default, cpufetch uses the system color scheme)\n", c[ARG_COLOR], t[ARG_COLOR], (int) (max_len-strlen(t[ARG_COLOR])), "");
|
printf(" -%c, --%s %*s Set the color scheme (by default, cpufetch uses the system color scheme)\n", c[ARG_COLOR], t[ARG_COLOR], (int) (max_len-strlen(t[ARG_COLOR])), "");
|
||||||
printf(" -%c, --%s %*s Set the style of CPU art\n", c[ARG_STYLE], t[ARG_STYLE], (int) (max_len-strlen(t[ARG_STYLE])), "");
|
printf(" -%c, --%s %*s Set the style of CPU logo\n", c[ARG_STYLE], t[ARG_STYLE], (int) (max_len-strlen(t[ARG_STYLE])), "");
|
||||||
#ifdef ARCH_X86
|
#ifdef ARCH_X86
|
||||||
printf(" -%c, --%s %*s Prints CPU model and cpuid levels (debug purposes)\n", c[ARG_DEBUG], t[ARG_DEBUG], (int) (max_len-strlen(t[ARG_DEBUG])), "");
|
printf(" -%c, --%s %*s Print CPU model and cpuid levels (debug purposes)\n", c[ARG_DEBUG], t[ARG_DEBUG], (int) (max_len-strlen(t[ARG_DEBUG])), "");
|
||||||
|
#elif ARCH_PPC
|
||||||
|
printf(" -%c, --%s %*s Print PVR register (debug purposes)\n", c[ARG_DEBUG], t[ARG_DEBUG], (int) (max_len-strlen(t[ARG_DEBUG])), "");
|
||||||
#elif ARCH_ARM
|
#elif ARCH_ARM
|
||||||
printf(" -%c, --%s %*s Prints main ID register values for all cores (debug purposes)\n", c[ARG_DEBUG], t[ARG_DEBUG], (int) (max_len-strlen(t[ARG_DEBUG])), "");
|
printf(" -%c, --%s %*s Print main ID register values (debug purposes)\n", c[ARG_DEBUG], t[ARG_DEBUG], (int) (max_len-strlen(t[ARG_DEBUG])), "");
|
||||||
#endif
|
#endif
|
||||||
printf(" -%c, --%s %*s Prints extra information (if available) about how cpufetch tried fetching information\n", c[ARG_VERBOSE], t[ARG_VERBOSE], (int) (max_len-strlen(t[ARG_VERBOSE])), "");
|
printf(" --%s %*s Show the short version of the logo\n", t[ARG_LOGO_SHORT], (int) (max_len-strlen(t[ARG_LOGO_SHORT])), "");
|
||||||
|
printf(" --%s %*s Show the long version of the logo\n", t[ARG_LOGO_LONG], (int) (max_len-strlen(t[ARG_LOGO_LONG])), "");
|
||||||
|
printf(" -%c, --%s %*s Print extra information (if available) about how cpufetch tried fetching information\n", c[ARG_VERBOSE], t[ARG_VERBOSE], (int) (max_len-strlen(t[ARG_VERBOSE])), "");
|
||||||
#ifdef ARCH_X86
|
#ifdef ARCH_X86
|
||||||
printf(" -%c, --%s %*s Prints raw cpuid data\n", c[ARG_RAW], t[ARG_RAW], (int) (max_len-strlen(t[ARG_RAW])), "");
|
printf(" --%s %*s Show the old Intel logo\n", t[ARG_LOGO_INTEL_OLD], (int) (max_len-strlen(t[ARG_LOGO_INTEL_OLD])), "");
|
||||||
|
printf(" --%s %*s Show the new Intel logo\n", t[ARG_LOGO_INTEL_NEW], (int) (max_len-strlen(t[ARG_LOGO_INTEL_NEW])), "");
|
||||||
|
printf(" -%c, --%s %*s Show the full CPU name (do not abbreviate it)\n", c[ARG_FULLCPUNAME], t[ARG_FULLCPUNAME], (int) (max_len-strlen(t[ARG_FULLCPUNAME])), "");
|
||||||
|
printf(" -%c, --%s %*s Print raw cpuid data (debug purposes)\n", c[ARG_RAW], t[ARG_RAW], (int) (max_len-strlen(t[ARG_RAW])), "");
|
||||||
#endif
|
#endif
|
||||||
printf(" -%c, --%s %*s Prints this help and exit\n", c[ARG_HELP], t[ARG_HELP], (int) (max_len-strlen(t[ARG_HELP])), "");
|
printf(" -%c, --%s %*s Print this help and exit\n", c[ARG_HELP], t[ARG_HELP], (int) (max_len-strlen(t[ARG_HELP])), "");
|
||||||
printf(" -%c, --%s %*s Prints cpufetch version and exit\n", c[ARG_VERSION], t[ARG_VERSION], (int) (max_len-strlen(t[ARG_VERSION])), "");
|
printf(" -%c, --%s %*s Print cpufetch version and exit\n", c[ARG_VERSION], t[ARG_VERSION], (int) (max_len-strlen(t[ARG_VERSION])), "");
|
||||||
|
|
||||||
printf("\nCOLORS: \n");
|
printf("\nCOLORS: \n");
|
||||||
printf(" * \"intel\": Use Intel default color scheme \n");
|
printf(" * \"intel\": Use Intel default color scheme \n");
|
||||||
printf(" * \"amd\": Use AMD default color scheme \n");
|
printf(" * \"amd\": Use AMD default color scheme \n");
|
||||||
printf(" * \"ibm\", Use IBM default color scheme \n");
|
printf(" * \"ibm\", Use IBM default color scheme \n");
|
||||||
printf(" * \"arm\": Use ARM default color scheme \n");
|
printf(" * \"arm\": Use ARM default color scheme \n");
|
||||||
printf(" * custom: If color argument do not match \"intel\", \"amd\", \"ibm\" or \"arm\", a custom scheme can be specified.\n");
|
printf(" * custom: If the argument of --color does not match any of the previous strings, a custom scheme can be specified.\n");
|
||||||
printf(" 4 colors must be given in RGB with the format: R,G,B:R,G,B:...\n");
|
printf(" 5 colors must be given in RGB with the format: R,G,B:R,G,B:...\n");
|
||||||
printf(" The first 2 colors are the CPU art color and the next 2 colors are the text colors\n");
|
printf(" The first 3 colors are the CPU art color and the next 2 colors are the text colors\n");
|
||||||
|
|
||||||
printf("\nSTYLES: \n");
|
printf("\nSTYLES: \n");
|
||||||
printf(" * \"fancy\": Default style\n");
|
printf(" * \"fancy\": Default style\n");
|
||||||
printf(" * \"retro\": Old cpufetch style\n");
|
printf(" * \"retro\": Old cpufetch style\n");
|
||||||
printf(" * \"legacy\": Fallback style for terminals that do not support colors\n");
|
printf(" * \"legacy\": Fallback style for terminals that do not support colors\n");
|
||||||
|
|
||||||
|
printf("\nLOGOS: \n");
|
||||||
|
printf(" cpufetch will try to adapt the logo size and the text to the terminal width. When the output (logo and text) is wider than\n");
|
||||||
|
printf(" the terminal width, cpufetch will print a smaller version of the logo (if it exists). This behavior can be overridden by\n");
|
||||||
|
printf(" --logo-short and --logo-long, which always sets the logo size as specified by the user, even if it is too big. After the\n");
|
||||||
|
printf(" logo selection (either automatically or set by the user), cpufetch will check again if the output fits in the terminal.\n");
|
||||||
|
printf(" If not, it will use a shorter name for the fields (the left part of the text). If, after all of this, the output still does\n");
|
||||||
|
printf(" not fit, cpufetch will cut the text and will only print the text until there is no space left in each line\n");
|
||||||
|
|
||||||
printf("\nEXAMPLES: \n");
|
printf("\nEXAMPLES: \n");
|
||||||
printf(" Run cpufetch with Intel color scheme:\n");
|
printf(" Run cpufetch with Intel color scheme:\n");
|
||||||
printf(" ./cpufetch --color intel\n");
|
printf(" ./cpufetch --color intel\n");
|
||||||
printf(" Run cpufetch with a custom color scheme:\n");
|
printf(" Run cpufetch with a custom color scheme:\n");
|
||||||
printf(" ./cpufetch --color 239,90,45:210,200,200:100,200,45:0,200,200\n");
|
printf(" ./cpufetch --color 239,90,45:210,200,200:0,0,0:100,200,45:0,200,200\n");
|
||||||
|
|
||||||
printf("\nBUGS: \n");
|
printf("\nBUGS: \n");
|
||||||
printf(" Report bugs to https://github.com/Dr-Noob/cpufetch/issues\n");
|
printf(" Report bugs to https://github.com/Dr-Noob/cpufetch/issues\n");
|
||||||
|
|
||||||
printf("\nNOTE: \n");
|
printf("\nNOTE: \n");
|
||||||
printf(" Peak performance information is NOT accurate. cpufetch computes peak performance using the max\n");
|
printf(" Peak performance information is NOT accurate. cpufetch computes peak performance using the max\n");
|
||||||
printf(" frequency. However, to properly compute peak performance, you need to know the frequency of the\n");
|
printf(" frequency of the CPU. However, to compute the peak performance, you need to know the frequency of the\n");
|
||||||
printf(" CPU running AVX code, which is not be fetched by cpufetch since it depends on each specific CPU.\n");
|
printf(" CPU running AVX code. This value is not be fetched by cpufetch since it depends on each specific CPU.\n");
|
||||||
printf(" For peak performance measurement see: https://github.com/Dr-Noob/peakperf\n");
|
printf(" To correctly measure peak performance, see: https://github.com/Dr-Noob/peakperf\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_version() {
|
void print_version() {
|
||||||
@@ -117,7 +132,7 @@ int main(int argc, char* argv[]) {
|
|||||||
print_debug(cpu);
|
print_debug(cpu);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(show_raw()) {
|
if(show_raw()) {
|
||||||
#ifdef ARCH_X86
|
#ifdef ARCH_X86
|
||||||
print_version();
|
print_version();
|
||||||
@@ -128,8 +143,8 @@ int main(int argc, char* argv[]) {
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if(print_cpufetch(cpu, get_style(), get_colors()))
|
if(print_cpufetch(cpu, get_style(), get_colors(), show_full_cpu_name()))
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
else
|
else
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -13,15 +13,19 @@ typedef int STYLE;
|
|||||||
#include "../arm/midr.h"
|
#include "../arm/midr.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define COLOR_DEFAULT_INTEL "15,125,194:230,230,230:40,150,220:230,230,230"
|
// +-----------------------------------+-----------------------+
|
||||||
#define COLOR_DEFAULT_AMD "250,250,250:0,154,102:250,250,250:0,154,102"
|
// | Color logo | Color text |
|
||||||
#define COLOR_DEFAULT_IBM "92,119,172:92,119,172:240,240,240:92,119,172"
|
// | Color 1 | Color 2 | Color 3 | Color 1 | Color 2 |
|
||||||
#define COLOR_DEFAULT_ARM "0,145,189:0,145,189:240,240,240:0,145,189"
|
#define COLOR_DEFAULT_INTEL "015,125,194:230,230,230:000,000,000:040,150,220:230,230,230"
|
||||||
|
#define COLOR_DEFAULT_INTEL_NEW "030,204,251:250,250,250:000,104,181:230,230,230:030,204,251"
|
||||||
|
#define COLOR_DEFAULT_AMD "250,250,250:000,154,102:000,000,000:250,250,250:000,154,102"
|
||||||
|
#define COLOR_DEFAULT_IBM "092,119,172:092,119,172:000,000,000:240,240,240:092,119,172"
|
||||||
|
#define COLOR_DEFAULT_ARM "000,145,189:000,145,189:000,000,000:240,240,240:000,145,189"
|
||||||
|
|
||||||
#ifdef ARCH_X86
|
#ifdef ARCH_X86
|
||||||
void print_levels(struct cpuInfo* cpu);
|
void print_levels(struct cpuInfo* cpu);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool print_cpufetch(struct cpuInfo* cpu, STYLE s, struct color** cs);
|
bool print_cpufetch(struct cpuInfo* cpu, STYLE s, struct color** cs, bool fcpuname);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -116,6 +116,50 @@ char* get_str_cpu_name_internal() {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool abbreviate_intel_cpu_name(char** name) {
|
||||||
|
char* old_name = *name;
|
||||||
|
char* new_name = ecalloc(strlen(old_name) + 1, sizeof(char));
|
||||||
|
|
||||||
|
char* old_name_ptr = old_name;
|
||||||
|
char* new_name_ptr = new_name;
|
||||||
|
char* aux_ptr = NULL;
|
||||||
|
|
||||||
|
// 1. Remove "(R)"
|
||||||
|
old_name_ptr = strstr(old_name_ptr, "Intel(R)");
|
||||||
|
if(old_name_ptr == NULL) return false;
|
||||||
|
strcpy(new_name_ptr, "Intel");
|
||||||
|
new_name_ptr += strlen("Intel");
|
||||||
|
old_name_ptr += strlen("Intel(R)");
|
||||||
|
|
||||||
|
// 2. Remove "(R)" or "(TM)"
|
||||||
|
aux_ptr = strstr(old_name_ptr, "(");
|
||||||
|
if(aux_ptr == NULL) return false;
|
||||||
|
strncpy(new_name_ptr, old_name_ptr, aux_ptr-old_name_ptr);
|
||||||
|
|
||||||
|
new_name_ptr += aux_ptr-old_name_ptr;
|
||||||
|
strcpy(new_name_ptr, " ");
|
||||||
|
new_name_ptr++;
|
||||||
|
old_name_ptr = strstr(aux_ptr, ")");
|
||||||
|
if(old_name_ptr == NULL) return false;
|
||||||
|
old_name_ptr++;
|
||||||
|
while(*old_name_ptr == ' ') old_name_ptr++;
|
||||||
|
|
||||||
|
// 3. Copy the CPU name
|
||||||
|
aux_ptr = strstr(old_name_ptr, "@");
|
||||||
|
if(aux_ptr == NULL) return false;
|
||||||
|
strncpy(new_name_ptr, old_name_ptr, (aux_ptr-1)-old_name_ptr);
|
||||||
|
|
||||||
|
// 4. Remove dummy strings in Intel CPU names
|
||||||
|
strremove(new_name, " CPU");
|
||||||
|
strremove(new_name, " Dual");
|
||||||
|
strremove(new_name, " 0");
|
||||||
|
|
||||||
|
free(old_name);
|
||||||
|
*name = new_name;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
struct uarch* get_cpu_uarch(struct cpuInfo* cpu) {
|
struct uarch* get_cpu_uarch(struct cpuInfo* cpu) {
|
||||||
uint32_t eax = 0x00000001;
|
uint32_t eax = 0x00000001;
|
||||||
uint32_t ebx = 0;
|
uint32_t ebx = 0;
|
||||||
@@ -702,6 +746,15 @@ struct frequency* get_frequency_info(struct cpuInfo* cpu) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// STRING FUNCTIONS
|
// STRING FUNCTIONS
|
||||||
|
char* get_str_cpu_name_abbreviated(struct cpuInfo* cpu) {
|
||||||
|
if(cpu->cpu_vendor == CPU_VENDOR_INTEL) {
|
||||||
|
if(!abbreviate_intel_cpu_name(&cpu->cpu_name)) {
|
||||||
|
printWarn("Failed to abbreviate CPU name");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cpu->cpu_name;
|
||||||
|
}
|
||||||
|
|
||||||
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket) {
|
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket) {
|
||||||
int topo_sockets = dual_socket ? topo->sockets : 1;
|
int topo_sockets = dual_socket ? topo->sockets : 1;
|
||||||
char* string;
|
char* string;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ char* get_str_avx(struct cpuInfo* cpu);
|
|||||||
char* get_str_sse(struct cpuInfo* cpu);
|
char* get_str_sse(struct cpuInfo* cpu);
|
||||||
char* get_str_fma(struct cpuInfo* cpu);
|
char* get_str_fma(struct cpuInfo* cpu);
|
||||||
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket);
|
char* get_str_topology(struct cpuInfo* cpu, struct topology* topo, bool dual_socket);
|
||||||
|
char* get_str_cpu_name_abbreviated(struct cpuInfo* cpu);
|
||||||
|
|
||||||
void print_debug(struct cpuInfo* cpu);
|
void print_debug(struct cpuInfo* cpu);
|
||||||
void print_raw(struct cpuInfo* cpu);
|
void print_raw(struct cpuInfo* cpu);
|
||||||
|
|||||||
@@ -399,6 +399,16 @@ int get_number_of_vpus(struct cpuInfo* cpu) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool choose_new_intel_logo_uarch(struct cpuInfo* cpu) {
|
||||||
|
switch(cpu->arch->uarch) {
|
||||||
|
case UARCH_ROCKET_LAKE:
|
||||||
|
// TODO: case UARCH_TIGER_LAKE: missing?
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char* get_str_uarch(struct cpuInfo* cpu) {
|
char* get_str_uarch(struct cpuInfo* cpu) {
|
||||||
return cpu->arch->uarch_str;
|
return cpu->arch->uarch_str;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t ef, uint32_t f,
|
|||||||
bool vpus_are_AVX512(struct cpuInfo* cpu);
|
bool vpus_are_AVX512(struct cpuInfo* cpu);
|
||||||
bool is_knights_landing(struct cpuInfo* cpu);
|
bool is_knights_landing(struct cpuInfo* cpu);
|
||||||
int get_number_of_vpus(struct cpuInfo* cpu);
|
int get_number_of_vpus(struct cpuInfo* cpu);
|
||||||
|
bool choose_new_intel_logo_uarch(struct cpuInfo* cpu);
|
||||||
char* get_str_uarch(struct cpuInfo* cpu);
|
char* get_str_uarch(struct cpuInfo* cpu);
|
||||||
char* get_str_process(struct cpuInfo* cpu);
|
char* get_str_process(struct cpuInfo* cpu);
|
||||||
void free_uarch_struct(struct uarch* arch);
|
void free_uarch_struct(struct uarch* arch);
|
||||||
|
|||||||
Reference in New Issue
Block a user