From 29cd838eab01ed7110f3ccb2e8c6a35c8a31dbcc Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:21:29 +0200 Subject: Adding upstream version 1:0.1.9998svn3589+dfsg. Signed-off-by: Daniel Baumann --- src/lib/kStuff/kCpu/Makefile.kmk | 42 ++++++++++ src/lib/kStuff/kCpu/kCpuCompare.c | 131 ++++++++++++++++++++++++++++++++ src/lib/kStuff/kCpu/kCpuGetArchAndCpu.c | 57 ++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 src/lib/kStuff/kCpu/Makefile.kmk create mode 100644 src/lib/kStuff/kCpu/kCpuCompare.c create mode 100644 src/lib/kStuff/kCpu/kCpuGetArchAndCpu.c (limited to 'src/lib/kStuff/kCpu') diff --git a/src/lib/kStuff/kCpu/Makefile.kmk b/src/lib/kStuff/kCpu/Makefile.kmk new file mode 100644 index 0000000..505d438 --- /dev/null +++ b/src/lib/kStuff/kCpu/Makefile.kmk @@ -0,0 +1,42 @@ +# $Id: Makefile.kmk 29 2009-07-01 20:30:29Z bird $ +## @file +# kCpu - The CPU and Architecture API, sub-makefile. +# + +# +# Copyright (c) 2006-2007 Knut St. Osmundsen +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# + +DEPTH ?= .. +SUB_DEPTH = .. +include $(PATH_KBUILD)/subheader.kmk + +LIBRARIES += kCpuStatic +kCpuStatic_TEMPLATE = kStuffLIB +kCpuStatic_SOURCES = \ + kCpuCompare.c \ + kCpuGetArchAndCpu.c + +include $(PATH_KBUILD)/subfooter.kmk + diff --git a/src/lib/kStuff/kCpu/kCpuCompare.c b/src/lib/kStuff/kCpu/kCpuCompare.c new file mode 100644 index 0000000..0d351a0 --- /dev/null +++ b/src/lib/kStuff/kCpu/kCpuCompare.c @@ -0,0 +1,131 @@ +/* $Id: kCpuCompare.c 29 2009-07-01 20:30:29Z bird $ */ +/** @file + * kCpu - kCpuCompare. + */ + +/* + * Copyright (c) 2006-2007 Knut St. Osmundsen + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* Header Files * +*******************************************************************************/ +#include +#include + + +/** + * Compares arch+cpu some code was generated for with a arch+cpu for executing it + * to see if it'll work out fine or not. + * + * @returns 0 if the code is compatible with the cpu. + * @returns KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE if the arch+cpu isn't compatible with the code. + * + * @param enmCodeArch The architecture the code was generated for. + * @param enmCodeCpu The cpu the code was generated for. + * @param enmArch The architecture to run it on. + * @param enmCpu The cpu to run it on. + */ +KCPU_DECL(int) kCpuCompare(KCPUARCH enmCodeArch, KCPU enmCodeCpu, KCPUARCH enmArch, KCPU enmCpu) +{ + /* + * Compare arch and cpu. + */ + if (enmCodeArch != enmArch) + return KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + + /* exact match is nice. */ + if (enmCodeCpu == enmCpu) + return 0; + + switch (enmArch) + { + case K_ARCH_X86_16: + if (enmCpu < KCPU_FIRST_X86_16 || enmCpu > KCPU_LAST_X86_16) + return KERR_INVALID_PARAMETER; + + /* intel? */ + if (enmCodeCpu <= KCPU_CORE2_16) + { + /* also intel? */ + if (enmCpu <= KCPU_CORE2_16) + return enmCodeCpu <= enmCpu ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + switch (enmCpu) + { + case KCPU_K6_16: + return enmCodeCpu <= KCPU_I586 ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + case KCPU_K7_16: + case KCPU_K8_16: + default: + return enmCodeCpu <= KCPU_I686 ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + } + } + /* amd */ + return enmCpu >= KCPU_K6_16 && enmCpu <= KCPU_K8_16 + ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + + case K_ARCH_X86_32: + if (enmCpu < KCPU_FIRST_X86_32 || enmCpu > KCPU_LAST_X86_32) + return KERR_INVALID_PARAMETER; + + /* blend? */ + if (enmCodeCpu == KCPU_X86_32_BLEND) + return 0; + + /* intel? */ + if (enmCodeCpu <= KCPU_CORE2_32) + { + /* also intel? */ + if (enmCpu <= KCPU_CORE2_32) + return enmCodeCpu <= enmCpu ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + switch (enmCpu) + { + case KCPU_K6: + return enmCodeCpu <= KCPU_I586 ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + case KCPU_K7: + case KCPU_K8_32: + default: + return enmCodeCpu <= KCPU_I686 ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + } + } + /* amd */ + return enmCpu >= KCPU_K6 && enmCpu <= KCPU_K8_32 + ? 0 : KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + + case K_ARCH_AMD64: + if (enmCpu < KCPU_FIRST_AMD64 || enmCpu > KCPU_LAST_AMD64) + return KERR_INVALID_PARAMETER; + + /* blend? */ + if (enmCodeCpu == KCPU_AMD64_BLEND) + return 0; + /* this is simple for now. */ + return KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; + + default: + break; + } + return KCPU_ERR_ARCH_CPU_NOT_COMPATIBLE; +} + diff --git a/src/lib/kStuff/kCpu/kCpuGetArchAndCpu.c b/src/lib/kStuff/kCpu/kCpuGetArchAndCpu.c new file mode 100644 index 0000000..8e0c00b --- /dev/null +++ b/src/lib/kStuff/kCpu/kCpuGetArchAndCpu.c @@ -0,0 +1,57 @@ +/* $Id: kCpuGetArchAndCpu.c 29 2009-07-01 20:30:29Z bird $ */ +/** @file + * kCpu - kCpuGetArchAndCpu. + */ + +/* + * Copyright (c) 2006-2007 Knut St. Osmundsen + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* Header Files * +*******************************************************************************/ +#include + + +/** + * Gets the arch+cpu of the calling cpu. + * + * @param penmArch Where to store the cpu architecture. + * @param penmCpu Where to store the cpu brand/model. + */ +KCPU_DECL(void) kCpuGetArchAndCpu(PKCPUARCH penmArch, PKCPU penmCpu) +{ +#if K_ARCH == K_ARCH_AMD64 + *penmArch = KCPUARCH_AMD64; + *penmCpu = KCPU_AMD64_BLEND; /** @todo check it using cpu. */ + +#elif K_ARCH == K_ARCH_X86_32 + *penmArch = KCPUARCH_X86_32; + *penmCpu = KCPU_X86_32_BLEND; /** @todo check it using cpu. */ + +#else +# error "Port me" +#endif +} + -- cgit v1.2.3