mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Merge branch 'master' into fix-ubsan-decimal-parse
This commit is contained in:
commit
b156ac3cc1
138
.gitignore
vendored
138
.gitignore
vendored
@ -12,6 +12,7 @@
|
|||||||
/build
|
/build
|
||||||
/build_*
|
/build_*
|
||||||
/build-*
|
/build-*
|
||||||
|
|
||||||
/docs/build
|
/docs/build
|
||||||
/docs/publish
|
/docs/publish
|
||||||
/docs/edit
|
/docs/edit
|
||||||
@ -57,143 +58,9 @@ cmake-build-*
|
|||||||
__pycache__
|
__pycache__
|
||||||
*.pytest_cache
|
*.pytest_cache
|
||||||
|
|
||||||
# ignore generated files
|
|
||||||
*-metrika-yandex
|
|
||||||
|
|
||||||
test.cpp
|
test.cpp
|
||||||
utils/compressor/compressor
|
|
||||||
utils/corrector_utf8/corrector_utf8
|
|
||||||
utils/iotest/iotest
|
|
||||||
utils/iotest/iotest_aio
|
|
||||||
utils/iotest/iotest_nonblock
|
|
||||||
utils/config-processor/config-processor
|
|
||||||
CPackConfig.cmake
|
CPackConfig.cmake
|
||||||
CPackSourceConfig.cmake
|
CPackSourceConfig.cmake
|
||||||
contrib/libpoco/Poco/
|
|
||||||
contrib/libpoco/bin/
|
|
||||||
contrib/libpoco/cmake_uninstall.cmake
|
|
||||||
contrib/libre2/re2_st/
|
|
||||||
src/Client/clickhouse-benchmark
|
|
||||||
src/Client/clickhouse-client
|
|
||||||
src/Client/tests/test-connect
|
|
||||||
src/Common/tests/arena_with_free_lists
|
|
||||||
src/Common/tests/auto_array
|
|
||||||
src/Common/tests/compact_array
|
|
||||||
src/Common/tests/hash_table
|
|
||||||
src/Common/tests/hashes_test
|
|
||||||
src/Common/tests/int_hashes_perf
|
|
||||||
src/Common/tests/lru_cache
|
|
||||||
src/Common/tests/parallel_aggregation
|
|
||||||
src/Common/tests/parallel_aggregation2
|
|
||||||
src/Common/tests/radix_sort
|
|
||||||
src/Common/tests/shell_command_test
|
|
||||||
src/Common/tests/simple_cache
|
|
||||||
src/Common/tests/sip_hash
|
|
||||||
src/Common/tests/sip_hash_perf
|
|
||||||
src/Common/tests/small_table
|
|
||||||
src/Core/tests/exception
|
|
||||||
src/Core/tests/field
|
|
||||||
src/Core/tests/rvo_test
|
|
||||||
src/Core/tests/string_pool
|
|
||||||
src/DataStreams/tests/aggregating_stream
|
|
||||||
src/DataStreams/tests/block_tab_separated_streams
|
|
||||||
src/DataStreams/tests/collapsing_sorted_stream
|
|
||||||
src/DataStreams/tests/expression_stream
|
|
||||||
src/DataStreams/tests/filter_stream
|
|
||||||
src/DataStreams/tests/filter_stream_hitlog
|
|
||||||
src/DataStreams/tests/fork_streams
|
|
||||||
src/DataStreams/tests/glue_streams
|
|
||||||
src/DataStreams/tests/json_streams
|
|
||||||
src/DataStreams/tests/native_streams
|
|
||||||
src/DataStreams/tests/sorting_stream
|
|
||||||
src/DataStreams/tests/tab_separated_streams
|
|
||||||
src/DataStreams/tests/union_stream
|
|
||||||
src/DataStreams/tests/union_stream2
|
|
||||||
src/DataTypes/tests/data_type_string
|
|
||||||
src/DataTypes/tests/data_types_number_fixed
|
|
||||||
src/Functions/tests/functions_arithmetic
|
|
||||||
src/Functions/tests/logical_functions_performance
|
|
||||||
src/Functions/tests/number_traits
|
|
||||||
src/IO/tests/async_write
|
|
||||||
src/IO/tests/cached_compressed_read_buffer
|
|
||||||
src/IO/tests/compressed_buffer
|
|
||||||
src/IO/tests/hashing_read_buffer
|
|
||||||
src/IO/tests/hashing_write_buffer
|
|
||||||
src/IO/tests/io_and_exceptions
|
|
||||||
src/IO/tests/io_operators
|
|
||||||
src/IO/tests/mempbrk
|
|
||||||
src/IO/tests/o_direct_and_dirty_pages
|
|
||||||
src/IO/tests/parse_int_perf
|
|
||||||
src/IO/tests/parse_int_perf2
|
|
||||||
src/IO/tests/read_buffer
|
|
||||||
src/IO/tests/read_buffer_aio
|
|
||||||
src/IO/tests/read_buffer_perf
|
|
||||||
src/IO/tests/read_escaped_string
|
|
||||||
src/IO/tests/read_float_perf
|
|
||||||
src/IO/tests/read_write_int
|
|
||||||
src/IO/tests/valid_utf8
|
|
||||||
src/IO/tests/valid_utf8_perf
|
|
||||||
src/IO/tests/var_uint
|
|
||||||
src/IO/tests/write_buffer
|
|
||||||
src/IO/tests/write_buffer_aio
|
|
||||||
src/IO/tests/write_buffer_perf
|
|
||||||
src/Interpreters/tests/address_patterns
|
|
||||||
src/Interpreters/tests/aggregate
|
|
||||||
src/Interpreters/tests/compiler_test
|
|
||||||
src/Interpreters/tests/create_query
|
|
||||||
src/Interpreters/tests/expression
|
|
||||||
src/Interpreters/tests/expression_analyzer
|
|
||||||
src/Interpreters/tests/hash_map
|
|
||||||
src/Interpreters/tests/hash_map2
|
|
||||||
src/Interpreters/tests/hash_map3
|
|
||||||
src/Interpreters/tests/hash_map_string
|
|
||||||
src/Interpreters/tests/hash_map_string_2
|
|
||||||
src/Interpreters/tests/hash_map_string_3
|
|
||||||
src/Interpreters/tests/hash_map_string_small
|
|
||||||
src/Interpreters/tests/in_join_subqueries_preprocessor
|
|
||||||
src/Interpreters/tests/logical_expressions_optimizer
|
|
||||||
src/Interpreters/tests/select_query
|
|
||||||
src/Interpreters/tests/two_level_hash_map
|
|
||||||
src/Interpreters/tests/users
|
|
||||||
src/Parsers/tests/create_parser
|
|
||||||
src/Parsers/tests/select_parser
|
|
||||||
src/Server/clickhouse-server
|
|
||||||
src/Server/clickhouse-server.init
|
|
||||||
src/Storages/tests/hit_log
|
|
||||||
src/Storages/tests/merge_tree
|
|
||||||
src/Storages/tests/part_checker
|
|
||||||
src/Storages/tests/part_name
|
|
||||||
src/Storages/tests/pk_condition
|
|
||||||
src/Storages/tests/seek_speed_test
|
|
||||||
src/Storages/tests/storage_log
|
|
||||||
src/Storages/tests/system_numbers
|
|
||||||
libs/libcommon/src/revision.h
|
|
||||||
libs/libcommon/src/tests/date_lut2
|
|
||||||
libs/libcommon/src/tests/date_lut3
|
|
||||||
libs/libcommon/src/tests/date_lut4
|
|
||||||
libs/libcommon/src/tests/date_lut_init
|
|
||||||
libs/libcommon/src/tests/multi_version
|
|
||||||
libs/libmysqlxx/src/tests/failover
|
|
||||||
libs/libmysqlxx/src/tests/mysqlxx_test
|
|
||||||
libs/libzkutil/src/tests/zkutil_expiration_test
|
|
||||||
libs/libzkutil/src/tests/zkutil_test
|
|
||||||
libs/libzkutil/src/tests/zkutil_test_async
|
|
||||||
libs/libzkutil/src/tests/zkutil_test_commands
|
|
||||||
libs/libzkutil/src/tests/zkutil_test_lock
|
|
||||||
libs/libzkutil/src/tests/zkutil_zookeeper_holder
|
|
||||||
utils/zookeeper-create-entry-to-download-part/zookeeper-create-entry-to-download-part
|
|
||||||
utils/zookeeper-dump-tree/zookeeper-dump-tree
|
|
||||||
utils/zookeeper-remove-by-list/zookeeper-remove-by-list
|
|
||||||
src/Storages/tests/remove_symlink_directory
|
|
||||||
libs/libcommon/src/tests/json_test
|
|
||||||
utils/compressor/zstd_test
|
|
||||||
utils/wikistat-loader/wikistat-loader
|
|
||||||
src/Common/tests/pod_array
|
|
||||||
|
|
||||||
src/Server/data/*
|
|
||||||
src/Server/metadata/*
|
|
||||||
src/Server/status
|
|
||||||
config-9001.xml
|
|
||||||
|
|
||||||
*-preprocessed.xml
|
*-preprocessed.xml
|
||||||
|
|
||||||
@ -241,9 +108,6 @@ website/package-lock.json
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*/.DS_Store
|
*/.DS_Store
|
||||||
|
|
||||||
# Ignore files for locally disabled tests
|
|
||||||
/src/queries/**/*.disabled
|
|
||||||
|
|
||||||
# cquery cache
|
# cquery cache
|
||||||
/.cquery-cache
|
/.cquery-cache
|
||||||
|
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
stages:
|
|
||||||
- builder
|
|
||||||
- build
|
|
||||||
variables:
|
|
||||||
GIT_SUBMODULE_STRATEGY: recursive
|
|
||||||
builder:
|
|
||||||
stage: builder
|
|
||||||
when: manual
|
|
||||||
services:
|
|
||||||
- docker:dind
|
|
||||||
script:
|
|
||||||
- docker info
|
|
||||||
- apk add --no-cache git curl binutils ca-certificates
|
|
||||||
- docker login -u gitlab -p nopasswd $CI_REGISTRY
|
|
||||||
- docker build -t yandex/clickhouse-builder ./docker/builder
|
|
||||||
- docker tag yandex/clickhouse-builder $CI_REGISTRY/yandex/clickhouse-builder
|
|
||||||
- docker push $CI_REGISTRY/yandex/clickhouse-builder
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
build:
|
|
||||||
stage: build
|
|
||||||
when: manual
|
|
||||||
services:
|
|
||||||
- docker:dind
|
|
||||||
script:
|
|
||||||
- apk add --no-cache git curl binutils ca-certificates
|
|
||||||
- git submodule sync --recursive
|
|
||||||
- git submodule update --init --recursive
|
|
||||||
- docker info
|
|
||||||
- docker login -u gitlab -p nopasswd $CI_REGISTRY
|
|
||||||
- docker pull $CI_REGISTRY/yandex/clickhouse-builder
|
|
||||||
- docker run --rm --volumes-from "${HOSTNAME}-build" --workdir "${CI_PROJECT_DIR}" --env CI_PROJECT_DIR=${CI_PROJECT_DIR} $CI_REGISTRY/yandex/clickhouse-builder /build_gitlab_ci.sh
|
|
||||||
# You can upload your binary to nexus
|
|
||||||
- curl -v --keepalive-time 60 --keepalive --user "$NEXUS_USER:$NEXUS_PASSWORD" -XPUT "http://$NEXUS_HOST/repository/binaries/$CI_PROJECT_NAME" --upload-file ./src/Server/clickhouse
|
|
||||||
# Or download artifacts from gitlab
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- ./src/Server/clickhouse
|
|
||||||
expire_in: 1 day
|
|
||||||
tags:
|
|
||||||
- docker
|
|
17
.gitmodules
vendored
17
.gitmodules
vendored
@ -110,16 +110,16 @@
|
|||||||
branch = v1.25.0
|
branch = v1.25.0
|
||||||
[submodule "contrib/aws"]
|
[submodule "contrib/aws"]
|
||||||
path = contrib/aws
|
path = contrib/aws
|
||||||
url = https://github.com/aws/aws-sdk-cpp.git
|
url = https://github.com/ClickHouse-Extras/aws-sdk-cpp.git
|
||||||
[submodule "aws-c-event-stream"]
|
[submodule "aws-c-event-stream"]
|
||||||
path = contrib/aws-c-event-stream
|
path = contrib/aws-c-event-stream
|
||||||
url = https://github.com/awslabs/aws-c-event-stream.git
|
url = https://github.com/ClickHouse-Extras/aws-c-event-stream.git
|
||||||
[submodule "aws-c-common"]
|
[submodule "aws-c-common"]
|
||||||
path = contrib/aws-c-common
|
path = contrib/aws-c-common
|
||||||
url = https://github.com/awslabs/aws-c-common.git
|
url = https://github.com/ClickHouse-Extras/aws-c-common.git
|
||||||
[submodule "aws-checksums"]
|
[submodule "aws-checksums"]
|
||||||
path = contrib/aws-checksums
|
path = contrib/aws-checksums
|
||||||
url = https://github.com/awslabs/aws-checksums.git
|
url = https://github.com/ClickHouse-Extras/aws-checksums.git
|
||||||
[submodule "contrib/curl"]
|
[submodule "contrib/curl"]
|
||||||
path = contrib/curl
|
path = contrib/curl
|
||||||
url = https://github.com/curl/curl.git
|
url = https://github.com/curl/curl.git
|
||||||
@ -148,9 +148,12 @@
|
|||||||
path = contrib/avro
|
path = contrib/avro
|
||||||
url = https://github.com/ClickHouse-Extras/avro.git
|
url = https://github.com/ClickHouse-Extras/avro.git
|
||||||
ignore = untracked
|
ignore = untracked
|
||||||
[submodule "website/images/feathericons"]
|
|
||||||
path = website/images/feathericons
|
|
||||||
url = https://github.com/feathericons/feather
|
|
||||||
[submodule "contrib/msgpack-c"]
|
[submodule "contrib/msgpack-c"]
|
||||||
path = contrib/msgpack-c
|
path = contrib/msgpack-c
|
||||||
url = https://github.com/msgpack/msgpack-c
|
url = https://github.com/msgpack/msgpack-c
|
||||||
|
[submodule "contrib/libcpuid"]
|
||||||
|
path = contrib/libcpuid
|
||||||
|
url = https://github.com/ClickHouse-Extras/libcpuid.git
|
||||||
|
[submodule "contrib/openldap"]
|
||||||
|
path = contrib/openldap
|
||||||
|
url = https://github.com/openldap/openldap.git
|
||||||
|
23
CHANGELOG.md
23
CHANGELOG.md
@ -1,5 +1,26 @@
|
|||||||
## ClickHouse release v20.3
|
## ClickHouse release v20.3
|
||||||
|
|
||||||
|
### ClickHouse release v20.3.8.53, 2020-04-23
|
||||||
|
|
||||||
|
### Bug Fix
|
||||||
|
* Fixed wrong behaviour of datetime functions for timezones that has altered between positive and negative offsets from UTC (e.g. Pacific/Kiritimati). This fixes [#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||||
|
* Fix possible segfault with `distributed_group_by_no_merge` enabled (introduced in 20.3.7.46 by [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131)). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||||
|
* Fix wrong flattening of `Array(Tuple(...))` data types. This fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||||
|
* Drop disks reservation in Aggregator. This fixes bug in disk space reservation, which may cause big external aggregation to fail even if it could be completed successfully [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat))
|
||||||
|
* Fixed `DROP` vs `OPTIMIZE` race in `ReplicatedMergeTree`. `DROP` could left some garbage in replica path in ZooKeeper if there was concurrent `OPTIMIZE` query. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix))
|
||||||
|
* Fix bug when server cannot attach table after column default was altered. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin))
|
||||||
|
* Do not remove metadata directory when attach database fails before loading tables. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014))
|
||||||
|
* Fixed several bugs when some data was inserted with quorum, then deleted somehow (DROP PARTITION, TTL) and this leaded to the stuck of INSERTs or false-positive exceptions in SELECTs. This fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov))
|
||||||
|
* Fix possible `Pipeline stuck` error in `ConcatProcessor` which could have happened in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai))
|
||||||
|
* Fixed wrong behavior in HashTable that caused compilation error when trying to read HashMap from buffer. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1))
|
||||||
|
* Allow to use `count(*)` with multiple JOINs. Fixes [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2))
|
||||||
|
* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`, otherwise when both settings specified and there are no up-to-date replicas the query will fail (patch from @alex-zaitsev). Fixes: [#2564](https://github.com/ClickHouse/ClickHouse/issues/2564). [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat))
|
||||||
|
* Fix the issue when a query with ARRAY JOIN, ORDER BY and LIMIT may return incomplete result. This fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). Author: [Vadim Plakhtinskiy](https://github.com/VadimPlh). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||||
|
* Check the number and type of arguments when creating BloomFilter index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014))
|
||||||
|
|
||||||
|
### Performance Improvement
|
||||||
|
* Improved performance of queries with explicitly defined sets at right side of `IN` operator and tuples in the left side. This fixes performance regression in version 20.3. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740), [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ))
|
||||||
|
|
||||||
### ClickHouse release v20.3.7.46, 2020-04-17
|
### ClickHouse release v20.3.7.46, 2020-04-17
|
||||||
|
|
||||||
#### Bug Fix
|
#### Bug Fix
|
||||||
@ -765,4 +786,4 @@
|
|||||||
#### Security Fix
|
#### Security Fix
|
||||||
* Fixed the possibility of reading directories structure in tables with `File` table engine. This fixes [#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
* Fixed the possibility of reading directories structure in tables with `File` table engine. This fixes [#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexey-milovidov](https://github.com/alexey-milovidov))
|
||||||
|
|
||||||
## [Changelog for 2019](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/whats_new/changelog/2019.md)
|
## [Changelog for 2019](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/whats-new/changelog/2019.md)
|
||||||
|
109
CMakeLists.txt
109
CMakeLists.txt
@ -30,7 +30,11 @@ set(CMAKE_LINK_DEPENDS_NO_SHARED 1) # Do not relink all depended targets on .so
|
|||||||
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE)
|
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Generate debug library name with a postfix.") # To be consistent with CMakeLists from contrib libs.
|
set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Generate debug library name with a postfix.") # To be consistent with CMakeLists from contrib libs.
|
||||||
|
|
||||||
option(ENABLE_IPO "Enable inter-procedural optimization (aka LTO)" OFF) # need cmake 3.9+
|
# Enable the ability to organize targets into hierarchies of "folders" for capable GUI-based IDEs.
|
||||||
|
# For more info see https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
|
||||||
|
option(ENABLE_IPO "Enable full link time optimization (it's usually impractical; see also ENABLE_THINLTO)" OFF) # need cmake 3.9+
|
||||||
if(ENABLE_IPO)
|
if(ENABLE_IPO)
|
||||||
cmake_policy(SET CMP0069 NEW)
|
cmake_policy(SET CMP0069 NEW)
|
||||||
include(CheckIPOSupported)
|
include(CheckIPOSupported)
|
||||||
@ -53,12 +57,12 @@ endif ()
|
|||||||
include (cmake/find/ccache.cmake)
|
include (cmake/find/ccache.cmake)
|
||||||
|
|
||||||
if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None")
|
if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None")
|
||||||
message (STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO")
|
set (CMAKE_BUILD_TYPE "RelWithDebInfo")
|
||||||
set (CMAKE_BUILD_TYPE "RELWITHDEBINFO")
|
message (STATUS "CMAKE_BUILD_TYPE is not set, set to default = ${CMAKE_BUILD_TYPE}")
|
||||||
endif ()
|
endif ()
|
||||||
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
|
||||||
message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
||||||
|
string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
|
|
||||||
option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON)
|
option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON)
|
||||||
option (MAKE_STATIC_LIBRARIES "Set to FALSE to make shared libraries" ${USE_STATIC_LIBRARIES})
|
option (MAKE_STATIC_LIBRARIES "Set to FALSE to make shared libraries" ${USE_STATIC_LIBRARIES})
|
||||||
@ -99,16 +103,7 @@ endif ()
|
|||||||
include (cmake/add_warning.cmake)
|
include (cmake/add_warning.cmake)
|
||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
set (COMMON_WARNING_FLAGS "${COMMON_WARNING_FLAGS} -Wall") # -Werror is also added inside directories with our own code.
|
set (COMMON_WARNING_FLAGS "${COMMON_WARNING_FLAGS} -Wall") # -Werror and many more is also added inside cmake/warnings.cmake
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (COMPILER_GCC OR COMPILER_CLANG)
|
|
||||||
set (CXX_WARNING_FLAGS "${CXX_WARNING_FLAGS} -Wnon-virtual-dtor")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (COMPILER_GCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "8.3.0")
|
|
||||||
# Warnings in protobuf generating
|
|
||||||
set (CXX_WARNING_FLAGS "${CXX_WARNING_FLAGS} -Wno-array-bounds")
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (COMPILER_CLANG)
|
if (COMPILER_CLANG)
|
||||||
@ -188,16 +183,16 @@ endif ()
|
|||||||
|
|
||||||
option(WITH_COVERAGE "Build with coverage." 0)
|
option(WITH_COVERAGE "Build with coverage." 0)
|
||||||
|
|
||||||
if(WITH_COVERAGE AND COMPILER_CLANG)
|
if (WITH_COVERAGE AND COMPILER_CLANG)
|
||||||
set(COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
|
set(COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
|
||||||
# If we want to disable coverage for specific translation units
|
# If we want to disable coverage for specific translation units
|
||||||
set(WITHOUT_COVERAGE "-fno-profile-instr-generate -fno-coverage-mapping")
|
set(WITHOUT_COVERAGE "-fno-profile-instr-generate -fno-coverage-mapping")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WITH_COVERAGE AND COMPILER_GCC)
|
if (WITH_COVERAGE AND COMPILER_GCC)
|
||||||
set(COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-arcs -ftest-coverage")
|
set(COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||||
set(COVERAGE_OPTION "-lgcov")
|
set(COVERAGE_OPTION "-lgcov")
|
||||||
set(WITHOUT_COVERAGE "-fno-profile-arcs -fno-test-coverage")
|
set(WITHOUT_COVERAGE "-fno-profile-arcs -fno-test-coverage")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set (CMAKE_BUILD_COLOR_MAKEFILE ON)
|
set (CMAKE_BUILD_COLOR_MAKEFILE ON)
|
||||||
@ -210,18 +205,44 @@ set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 ${
|
|||||||
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline ${CMAKE_C_FLAGS_ADD}")
|
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline ${CMAKE_C_FLAGS_ADD}")
|
||||||
|
|
||||||
if (COMPILER_CLANG)
|
if (COMPILER_CLANG)
|
||||||
# Exception unwinding doesn't work in clang release build without this option
|
|
||||||
# TODO investigate that
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
|
|
||||||
|
|
||||||
if (OS_DARWIN)
|
if (OS_DARWIN)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -Wl,-U,_inside_main")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-U,_inside_main")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-U,_inside_main")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Display absolute paths in error messages. Otherwise KDevelop fails to navigate to correct file and opens a new file instead.
|
# Display absolute paths in error messages. Otherwise KDevelop fails to navigate to correct file and opens a new file instead.
|
||||||
set(COMPILER_FLAGS "${COMPILER_FLAGS} -fdiagnostics-absolute-paths")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-absolute-paths")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-absolute-paths")
|
||||||
|
|
||||||
|
option(ENABLE_THINLTO "Enable Thin LTO. Only applicable for clang. It's also suppressed when building with tests or sanitizers." ON)
|
||||||
|
|
||||||
|
# We cannot afford to use LTO when compiling unitests, and it's not enough
|
||||||
|
# to only supply -fno-lto at the final linking stage. So we disable it
|
||||||
|
# completely.
|
||||||
|
if (ENABLE_THINLTO AND NOT ENABLE_TESTS AND NOT SANITIZE)
|
||||||
|
# Link time optimization
|
||||||
|
set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -flto=thin")
|
||||||
|
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -flto=thin")
|
||||||
|
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -flto=thin")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Always prefer llvm tools when using clang. For instance, we cannot use GNU ar when llvm LTO is enabled
|
||||||
|
|
||||||
|
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
||||||
|
if (LLVM_AR_PATH)
|
||||||
|
message(STATUS "Using llvm-ar: ${LLVM_AR_PATH}.")
|
||||||
|
set (CMAKE_AR ${LLVM_AR_PATH})
|
||||||
|
else ()
|
||||||
|
message(WARNING "Cannot find llvm-ar. System ar will be used instead. It does not work with ThinLTO.")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-10" "llvm-ranlib-9" "llvm-ranlib-8")
|
||||||
|
if (LLVM_RANLIB_PATH)
|
||||||
|
message(STATUS "Using llvm-ranlib: ${LLVM_RANLIB_PATH}.")
|
||||||
|
set (CMAKE_RANLIB ${LLVM_RANLIB_PATH})
|
||||||
|
else ()
|
||||||
|
message(WARNING "Cannot find llvm-ranlib. System ranlib will be used instead. It does not work with ThinLTO.")
|
||||||
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
option (ENABLE_LIBRARIES "Enable all libraries (Global default switch)" ON)
|
option (ENABLE_LIBRARIES "Enable all libraries (Global default switch)" ON)
|
||||||
@ -247,7 +268,7 @@ endif ()
|
|||||||
# Make this extra-checks for correct library dependencies.
|
# Make this extra-checks for correct library dependencies.
|
||||||
if (OS_LINUX AND NOT SANITIZE)
|
if (OS_LINUX AND NOT SANITIZE)
|
||||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
|
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
|
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
include(cmake/dbms_glob_sources.cmake)
|
include(cmake/dbms_glob_sources.cmake)
|
||||||
@ -264,7 +285,6 @@ endif ()
|
|||||||
### Add targets below this comment ###
|
### Add targets below this comment ###
|
||||||
######################################
|
######################################
|
||||||
|
|
||||||
string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
|
||||||
set (CMAKE_POSTFIX_VARIABLE "CMAKE_${CMAKE_BUILD_TYPE_UC}_POSTFIX")
|
set (CMAKE_POSTFIX_VARIABLE "CMAKE_${CMAKE_BUILD_TYPE_UC}_POSTFIX")
|
||||||
|
|
||||||
if (MAKE_STATIC_LIBRARIES)
|
if (MAKE_STATIC_LIBRARIES)
|
||||||
@ -305,21 +325,20 @@ endif ()
|
|||||||
|
|
||||||
message (STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE} ; USE_STATIC_LIBRARIES=${USE_STATIC_LIBRARIES} MAKE_STATIC_LIBRARIES=${MAKE_STATIC_LIBRARIES} SPLIT_SHARED=${SPLIT_SHARED_LIBRARIES} UNBUNDLED=${UNBUNDLED} CCACHE=${CCACHE_FOUND} ${CCACHE_VERSION}")
|
message (STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE} ; USE_STATIC_LIBRARIES=${USE_STATIC_LIBRARIES} MAKE_STATIC_LIBRARIES=${MAKE_STATIC_LIBRARIES} SPLIT_SHARED=${SPLIT_SHARED_LIBRARIES} UNBUNDLED=${UNBUNDLED} CCACHE=${CCACHE_FOUND} ${CCACHE_VERSION}")
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include (GNUInstallDirs)
|
||||||
include (cmake/contrib_finder.cmake)
|
include (cmake/contrib_finder.cmake)
|
||||||
include (cmake/lib_name.cmake)
|
include (cmake/lib_name.cmake)
|
||||||
|
|
||||||
find_contrib_lib(double-conversion) # Must be before parquet
|
find_contrib_lib(double-conversion) # Must be before parquet
|
||||||
include (cmake/find/ssl.cmake)
|
include (cmake/find/ssl.cmake)
|
||||||
|
include (cmake/find/ldap.cmake) # after ssl
|
||||||
include (cmake/find/icu.cmake)
|
include (cmake/find/icu.cmake)
|
||||||
include (cmake/find/boost.cmake)
|
include (cmake/find/boost.cmake)
|
||||||
include (cmake/find/zlib.cmake)
|
include (cmake/find/zlib.cmake)
|
||||||
include (cmake/find/zstd.cmake)
|
include (cmake/find/zstd.cmake)
|
||||||
include (cmake/find/ltdl.cmake) # for odbc
|
include (cmake/find/ltdl.cmake) # for odbc
|
||||||
include (cmake/find/termcap.cmake)
|
include (cmake/find/termcap.cmake)
|
||||||
include (cmake/find/odbc.cmake)
|
# openssl, zlib before poco
|
||||||
# openssl, zlib, odbc before poco
|
|
||||||
include (cmake/find/poco.cmake)
|
|
||||||
include (cmake/find/lz4.cmake)
|
include (cmake/find/lz4.cmake)
|
||||||
include (cmake/find/xxhash.cmake)
|
include (cmake/find/xxhash.cmake)
|
||||||
include (cmake/find/sparsehash.cmake)
|
include (cmake/find/sparsehash.cmake)
|
||||||
@ -328,11 +347,8 @@ include (cmake/find/libgsasl.cmake)
|
|||||||
include (cmake/find/rdkafka.cmake)
|
include (cmake/find/rdkafka.cmake)
|
||||||
include (cmake/find/capnp.cmake)
|
include (cmake/find/capnp.cmake)
|
||||||
include (cmake/find/llvm.cmake)
|
include (cmake/find/llvm.cmake)
|
||||||
|
include (cmake/find/opencl.cmake)
|
||||||
include (cmake/find/h3.cmake)
|
include (cmake/find/h3.cmake)
|
||||||
include (cmake/find/cpuid.cmake) # Freebsd, bundled
|
|
||||||
if (NOT USE_CPUID)
|
|
||||||
include (cmake/find/cpuinfo.cmake) # Debian
|
|
||||||
endif()
|
|
||||||
include (cmake/find/libxml2.cmake)
|
include (cmake/find/libxml2.cmake)
|
||||||
include (cmake/find/brotli.cmake)
|
include (cmake/find/brotli.cmake)
|
||||||
include (cmake/find/protobuf.cmake)
|
include (cmake/find/protobuf.cmake)
|
||||||
@ -368,6 +384,16 @@ if (OS_LINUX AND NOT ENABLE_JEMALLOC)
|
|||||||
message (WARNING "Non default allocator is disabled. This is not recommended for production Linux builds.")
|
message (WARNING "Non default allocator is disabled. This is not recommended for production Linux builds.")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (USE_OPENCL)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_OPENCL=1")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_OPENCL=1")
|
||||||
|
|
||||||
|
if (OS_DARWIN)
|
||||||
|
set(OPENCL_LINKER_FLAGS "-framework OpenCL")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OPENCL_LINKER_FLAGS}")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
include (cmake/print_flags.cmake)
|
include (cmake/print_flags.cmake)
|
||||||
|
|
||||||
if (TARGET global-group)
|
if (TARGET global-group)
|
||||||
@ -390,6 +416,9 @@ endmacro()
|
|||||||
set(ConfigIncludePath ${CMAKE_CURRENT_BINARY_DIR}/includes/configs CACHE INTERNAL "Path to generated configuration files.")
|
set(ConfigIncludePath ${CMAKE_CURRENT_BINARY_DIR}/includes/configs CACHE INTERNAL "Path to generated configuration files.")
|
||||||
include_directories(${ConfigIncludePath})
|
include_directories(${ConfigIncludePath})
|
||||||
|
|
||||||
|
# Add as many warnings as possible for our own code.
|
||||||
|
include (cmake/warnings.cmake)
|
||||||
|
|
||||||
add_subdirectory (base)
|
add_subdirectory (base)
|
||||||
add_subdirectory (programs)
|
add_subdirectory (programs)
|
||||||
add_subdirectory (src)
|
add_subdirectory (src)
|
||||||
|
@ -15,6 +15,5 @@ ClickHouse is an open-source column-oriented database management system that all
|
|||||||
|
|
||||||
## Upcoming Events
|
## Upcoming Events
|
||||||
|
|
||||||
* [ClickHouse Online Meetup East (in English)](https://www.eventbrite.com/e/clickhouse-online-meetup-east-registration-102989325846) on April 28, 2020.
|
|
||||||
* [ClickHouse Workshop in Novosibirsk](https://2020.codefest.ru/lecture/1628) on TBD date.
|
* [ClickHouse Workshop in Novosibirsk](https://2020.codefest.ru/lecture/1628) on TBD date.
|
||||||
* [Yandex C++ Open-Source Sprints in Moscow](https://events.yandex.ru/events/otkrytyj-kod-v-yandek-28-03-2020) on TBD date.
|
* [Yandex C++ Open-Source Sprints in Moscow](https://events.yandex.ru/events/otkrytyj-kod-v-yandek-28-03-2020) on TBD date.
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
configure_file (config_common.h.in config_common.h)
|
|
||||||
|
|
||||||
set (SRCS
|
set (SRCS
|
||||||
argsToConfig.cpp
|
argsToConfig.cpp
|
||||||
coverage.cpp
|
coverage.cpp
|
||||||
@ -13,7 +11,7 @@ set (SRCS
|
|||||||
LineReader.cpp
|
LineReader.cpp
|
||||||
mremap.cpp
|
mremap.cpp
|
||||||
phdr_cache.cpp
|
phdr_cache.cpp
|
||||||
preciseExp10.c
|
preciseExp10.cpp
|
||||||
setTerminalEcho.cpp
|
setTerminalEcho.cpp
|
||||||
shift10.cpp
|
shift10.cpp
|
||||||
sleep.cpp
|
sleep.cpp
|
||||||
@ -49,11 +47,7 @@ if (NOT USE_INTERNAL_BOOST_LIBRARY)
|
|||||||
target_include_directories (common SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS})
|
target_include_directories (common SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if(NOT USE_INTERNAL_POCO_LIBRARY)
|
# Allow explicit fallback to readline
|
||||||
target_include_directories (common SYSTEM BEFORE PUBLIC ${Poco_Foundation_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# allow explicitly fallback to readline
|
|
||||||
if (NOT ENABLE_REPLXX AND ENABLE_READLINE)
|
if (NOT ENABLE_REPLXX AND ENABLE_READLINE)
|
||||||
message (STATUS "Attempt to fallback to readline explicitly")
|
message (STATUS "Attempt to fallback to readline explicitly")
|
||||||
set (READLINE_PATHS "/usr/local/opt/readline/lib")
|
set (READLINE_PATHS "/usr/local/opt/readline/lib")
|
||||||
@ -77,12 +71,13 @@ endif ()
|
|||||||
|
|
||||||
target_link_libraries (common
|
target_link_libraries (common
|
||||||
PUBLIC
|
PUBLIC
|
||||||
${Poco_Net_LIBRARY}
|
|
||||||
${Poco_Util_LIBRARY}
|
|
||||||
${Poco_Foundation_LIBRARY}
|
|
||||||
${CITYHASH_LIBRARIES}
|
${CITYHASH_LIBRARIES}
|
||||||
${Boost_SYSTEM_LIBRARY}
|
${Boost_SYSTEM_LIBRARY}
|
||||||
FastMemcpy
|
FastMemcpy
|
||||||
|
Poco::Net
|
||||||
|
Poco::Net::SSL
|
||||||
|
Poco::Util
|
||||||
|
Poco::Foundation
|
||||||
replxx
|
replxx
|
||||||
|
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
@ -31,9 +31,8 @@ UInt8 getDayOfWeek(const cctz::civil_day & date)
|
|||||||
case cctz::weekday::friday: return 5;
|
case cctz::weekday::friday: return 5;
|
||||||
case cctz::weekday::saturday: return 6;
|
case cctz::weekday::saturday: return 6;
|
||||||
case cctz::weekday::sunday: return 7;
|
case cctz::weekday::sunday: return 7;
|
||||||
default:
|
|
||||||
throw Poco::Exception("Logical error: incorrect week day.");
|
|
||||||
}
|
}
|
||||||
|
__builtin_unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -75,6 +74,11 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_)
|
|||||||
values.day_of_week = getDayOfWeek(date);
|
values.day_of_week = getDayOfWeek(date);
|
||||||
values.date = start_of_day;
|
values.date = start_of_day;
|
||||||
|
|
||||||
|
assert(values.year >= DATE_LUT_MIN_YEAR && values.year <= DATE_LUT_MAX_YEAR);
|
||||||
|
assert(values.month >= 1 && values.month <= 12);
|
||||||
|
assert(values.day_of_month >= 1 && values.day_of_month <= 31);
|
||||||
|
assert(values.day_of_week >= 1 && values.day_of_week <= 7);
|
||||||
|
|
||||||
if (values.day_of_month == 1)
|
if (values.day_of_month == 1)
|
||||||
{
|
{
|
||||||
cctz::civil_month month(date);
|
cctz::civil_month month(date);
|
||||||
@ -131,7 +135,7 @@ DateLUTImpl::DateLUTImpl(const std::string & time_zone_)
|
|||||||
/// Fill excessive part of lookup table. This is needed only to simplify handling of overflow cases.
|
/// Fill excessive part of lookup table. This is needed only to simplify handling of overflow cases.
|
||||||
while (i < DATE_LUT_SIZE)
|
while (i < DATE_LUT_SIZE)
|
||||||
{
|
{
|
||||||
lut[i] = lut[DATE_LUT_MAX_DAY_NUM];
|
lut[i] = lut[i - 1];
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,12 @@ using YearWeek = std::pair<UInt16, UInt8>;
|
|||||||
class DateLUTImpl
|
class DateLUTImpl
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DateLUTImpl(const std::string & time_zone);
|
explicit DateLUTImpl(const std::string & time_zone);
|
||||||
|
|
||||||
|
DateLUTImpl(const DateLUTImpl &) = delete;
|
||||||
|
DateLUTImpl & operator=(const DateLUTImpl &) = delete;
|
||||||
|
DateLUTImpl(const DateLUTImpl &&) = delete;
|
||||||
|
DateLUTImpl & operator=(const DateLUTImpl &&) = delete;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// The order of fields matters for alignment and sizeof.
|
/// The order of fields matters for alignment and sizeof.
|
||||||
@ -287,8 +292,8 @@ public:
|
|||||||
if (offset_is_whole_number_of_hours_everytime)
|
if (offset_is_whole_number_of_hours_everytime)
|
||||||
return (t / 60) % 60;
|
return (t / 60) % 60;
|
||||||
|
|
||||||
time_t date = find(t).date;
|
UInt32 date = find(t).date;
|
||||||
return (t - date) / 60 % 60;
|
return (UInt32(t) - date) / 60 % 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline time_t toStartOfMinute(time_t t) const { return t / 60 * 60; }
|
inline time_t toStartOfMinute(time_t t) const { return t / 60 * 60; }
|
||||||
@ -301,9 +306,8 @@ public:
|
|||||||
if (offset_is_whole_number_of_hours_everytime)
|
if (offset_is_whole_number_of_hours_everytime)
|
||||||
return t / 3600 * 3600;
|
return t / 3600 * 3600;
|
||||||
|
|
||||||
time_t date = find(t).date;
|
UInt32 date = find(t).date;
|
||||||
/// Still can return wrong values for time at 1970-01-01 if the UTC offset was non-whole number of hours.
|
return date + (UInt32(t) - date) / 3600 * 3600;
|
||||||
return date + (t - date) / 3600 * 3600;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Number of calendar day since the beginning of UNIX epoch (1970-01-01 is zero)
|
/** Number of calendar day since the beginning of UNIX epoch (1970-01-01 is zero)
|
||||||
|
@ -451,7 +451,10 @@ JSON JSON::operator[] (size_t n) const
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
const_iterator it = begin();
|
const_iterator it = begin();
|
||||||
while (i < n && it != end())
|
while (i < n && it != end())
|
||||||
++it, ++i;
|
{
|
||||||
|
++it;
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
if (i != n)
|
if (i != n)
|
||||||
throw JSONException("JSON: array index " + std::to_string(n) + " out of bounds.");
|
throw JSONException("JSON: array index " + std::to_string(n) + " out of bounds.");
|
||||||
@ -626,7 +629,7 @@ std::string JSON::getString() const
|
|||||||
{
|
{
|
||||||
unicode = Poco::NumberParser::parseHex(hex);
|
unicode = Poco::NumberParser::parseHex(hex);
|
||||||
}
|
}
|
||||||
catch (const Poco::SyntaxException & e)
|
catch (const Poco::SyntaxException &)
|
||||||
{
|
{
|
||||||
throw JSONException("JSON: incorrect syntax: incorrect HEX code.");
|
throw JSONException("JSON: incorrect syntax: incorrect HEX code.");
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include "argsToConfig.h"
|
#include "argsToConfig.h"
|
||||||
|
|
||||||
#include <Poco/Util/Application.h>
|
|
||||||
#include <Poco/Util/LayeredConfiguration.h>
|
#include <Poco/Util/LayeredConfiguration.h>
|
||||||
#include <Poco/Util/MapConfiguration.h>
|
#include <Poco/Util/MapConfiguration.h>
|
||||||
|
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
// .h autogenerated by cmake !
|
|
||||||
|
|
||||||
#cmakedefine01 UNBUNDLED
|
|
@ -1,16 +1,8 @@
|
|||||||
#include <common/demangle.h>
|
#include <common/demangle.h>
|
||||||
|
|
||||||
#if defined(__has_feature)
|
#if defined(_MSC_VER)
|
||||||
#if __has_feature(memory_sanitizer)
|
|
||||||
#define MEMORY_SANITIZER 1
|
|
||||||
#endif
|
|
||||||
#elif defined(__MEMORY_SANITIZER__)
|
|
||||||
#define MEMORY_SANITIZER 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if _MSC_VER || MEMORY_SANITIZER
|
DemangleResult tryDemangle(const char *)
|
||||||
|
|
||||||
DemangleResult tryDemangle(const char * name)
|
|
||||||
{
|
{
|
||||||
return DemangleResult{};
|
return DemangleResult{};
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <common/getThreadId.h>
|
#include <common/getThreadId.h>
|
||||||
|
|
||||||
#if OS_LINUX
|
#if defined(OS_LINUX)
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
#elif OS_FREEBSD
|
#elif defined(OS_FREEBSD)
|
||||||
#include <pthread_np.h>
|
#include <pthread_np.h>
|
||||||
#else
|
#else
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
@ -16,9 +16,9 @@ uint64_t getThreadId()
|
|||||||
{
|
{
|
||||||
if (!current_tid)
|
if (!current_tid)
|
||||||
{
|
{
|
||||||
#if OS_LINUX
|
#if defined(OS_LINUX)
|
||||||
current_tid = syscall(SYS_gettid); /// This call is always successful. - man gettid
|
current_tid = syscall(SYS_gettid); /// This call is always successful. - man gettid
|
||||||
#elif OS_FREEBSD
|
#elif defined(OS_FREEBSD)
|
||||||
current_tid = pthread_getthreadid_np();
|
current_tid = pthread_getthreadid_np();
|
||||||
#else
|
#else
|
||||||
if (0 != pthread_threadid_np(nullptr, ¤t_tid))
|
if (0 != pthread_threadid_np(nullptr, ¤t_tid))
|
||||||
|
@ -3,20 +3,12 @@
|
|||||||
#include <new>
|
#include <new>
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
#if __has_include(<common/config_common.h>)
|
|
||||||
#include <common/config_common.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USE_JEMALLOC
|
#if USE_JEMALLOC
|
||||||
#include <jemalloc/jemalloc.h>
|
# include <jemalloc/jemalloc.h>
|
||||||
|
|
||||||
#if JEMALLOC_VERSION_MAJOR < 4
|
|
||||||
#undef USE_JEMALLOC
|
|
||||||
#define USE_JEMALLOC 0
|
|
||||||
#include <cstdlib>
|
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
#include <cstdlib>
|
#if !USE_JEMALLOC || JEMALLOC_VERSION_MAJOR < 4
|
||||||
|
# include <cstdlib>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -43,7 +35,7 @@ inline ALWAYS_INLINE void deleteImpl(void * ptr) noexcept
|
|||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_JEMALLOC
|
#if USE_JEMALLOC && JEMALLOC_VERSION_MAJOR >= 4
|
||||||
|
|
||||||
inline ALWAYS_INLINE void deleteSized(void * ptr, std::size_t size) noexcept
|
inline ALWAYS_INLINE void deleteSized(void * ptr, std::size_t size) noexcept
|
||||||
{
|
{
|
||||||
|
@ -19,7 +19,7 @@ void * mremap_fallback(
|
|||||||
return MAP_FAILED;
|
return MAP_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if _MSC_VER
|
#if defined(_MSC_VER)
|
||||||
void * new_address = ::operator new(new_size);
|
void * new_address = ::operator new(new_size);
|
||||||
#else
|
#else
|
||||||
void * new_address = mmap(nullptr, new_size, mmap_prot, mmap_flags, mmap_fd, mmap_offset);
|
void * new_address = mmap(nullptr, new_size, mmap_prot, mmap_flags, mmap_fd, mmap_offset);
|
||||||
@ -29,7 +29,7 @@ void * mremap_fallback(
|
|||||||
|
|
||||||
memcpy(new_address, old_address, old_size);
|
memcpy(new_address, old_address, old_size);
|
||||||
|
|
||||||
#if _MSC_VER
|
#if defined(_MSC_VER)
|
||||||
delete old_address;
|
delete old_address;
|
||||||
#else
|
#else
|
||||||
if (munmap(old_address, old_size))
|
if (munmap(old_address, old_size))
|
||||||
|
@ -20,6 +20,14 @@
|
|||||||
#define USE_PHDR_CACHE 1
|
#define USE_PHDR_CACHE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/// Thread Sanitizer uses dl_iterate_phdr function on initialization and fails if we provide our own.
|
||||||
|
#ifdef USE_PHDR_CACHE
|
||||||
|
|
||||||
|
#if defined(__clang__)
|
||||||
|
# pragma clang diagnostic ignored "-Wreserved-id-macro"
|
||||||
|
# pragma clang diagnostic ignored "-Wunused-macros"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __msan_unpoison(X, Y)
|
#define __msan_unpoison(X, Y)
|
||||||
#if defined(__has_feature)
|
#if defined(__has_feature)
|
||||||
# if __has_feature(memory_sanitizer)
|
# if __has_feature(memory_sanitizer)
|
||||||
@ -28,9 +36,6 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Thread Sanitizer uses dl_iterate_phdr function on initialization and fails if we provide our own.
|
|
||||||
#ifdef USE_PHDR_CACHE
|
|
||||||
|
|
||||||
#include <link.h>
|
#include <link.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -1,227 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
https://www.musl-libc.org/
|
|
||||||
http://git.musl-libc.org/cgit/musl/tree/src/math/exp10.c
|
|
||||||
|
|
||||||
musl as a whole is licensed under the following standard MIT license:
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
Copyright © 2005-2014 Rich Felker, et al.
|
|
||||||
|
|
||||||
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.
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
Authors/contributors include:
|
|
||||||
|
|
||||||
Alex Dowad
|
|
||||||
Alexander Monakov
|
|
||||||
Anthony G. Basile
|
|
||||||
Arvid Picciani
|
|
||||||
Bobby Bingham
|
|
||||||
Boris Brezillon
|
|
||||||
Brent Cook
|
|
||||||
Chris Spiegel
|
|
||||||
Clément Vasseur
|
|
||||||
Daniel Micay
|
|
||||||
Denys Vlasenko
|
|
||||||
Emil Renner Berthing
|
|
||||||
Felix Fietkau
|
|
||||||
Felix Janda
|
|
||||||
Gianluca Anzolin
|
|
||||||
Hauke Mehrtens
|
|
||||||
Hiltjo Posthuma
|
|
||||||
Isaac Dunham
|
|
||||||
Jaydeep Patil
|
|
||||||
Jens Gustedt
|
|
||||||
Jeremy Huntwork
|
|
||||||
Jo-Philipp Wich
|
|
||||||
Joakim Sindholt
|
|
||||||
John Spencer
|
|
||||||
Josiah Worcester
|
|
||||||
Justin Cormack
|
|
||||||
Khem Raj
|
|
||||||
Kylie McClain
|
|
||||||
Luca Barbato
|
|
||||||
Luka Perkov
|
|
||||||
M Farkas-Dyck (Strake)
|
|
||||||
Mahesh Bodapati
|
|
||||||
Michael Forney
|
|
||||||
Natanael Copa
|
|
||||||
Nicholas J. Kain
|
|
||||||
orc
|
|
||||||
Pascal Cuoq
|
|
||||||
Petr Hosek
|
|
||||||
Pierre Carrier
|
|
||||||
Rich Felker
|
|
||||||
Richard Pennington
|
|
||||||
Shiz
|
|
||||||
sin
|
|
||||||
Solar Designer
|
|
||||||
Stefan Kristiansson
|
|
||||||
Szabolcs Nagy
|
|
||||||
Timo Teräs
|
|
||||||
Trutz Behn
|
|
||||||
Valentin Ochs
|
|
||||||
William Haddon
|
|
||||||
|
|
||||||
Portions of this software are derived from third-party works licensed
|
|
||||||
under terms compatible with the above MIT license:
|
|
||||||
|
|
||||||
The TRE regular expression implementation (src/regex/reg* and
|
|
||||||
src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed
|
|
||||||
under a 2-clause BSD license (license text in the source files). The
|
|
||||||
included version has been heavily modified by Rich Felker in 2012, in
|
|
||||||
the interests of size, simplicity, and namespace cleanliness.
|
|
||||||
|
|
||||||
Much of the math library code (src/math/ * and src/complex/ *) is
|
|
||||||
Copyright © 1993,2004 Sun Microsystems or
|
|
||||||
Copyright © 2003-2011 David Schultz or
|
|
||||||
Copyright © 2003-2009 Steven G. Kargl or
|
|
||||||
Copyright © 2003-2009 Bruce D. Evans or
|
|
||||||
Copyright © 2008 Stephen L. Moshier
|
|
||||||
and labelled as such in comments in the individual source files. All
|
|
||||||
have been licensed under extremely permissive terms.
|
|
||||||
|
|
||||||
The ARM memcpy code (src/string/arm/memcpy_el.S) is Copyright © 2008
|
|
||||||
The Android Open Source Project and is licensed under a two-clause BSD
|
|
||||||
license. It was taken from Bionic libc, used on Android.
|
|
||||||
|
|
||||||
The implementation of DES for crypt (src/crypt/crypt_des.c) is
|
|
||||||
Copyright © 1994 David Burren. It is licensed under a BSD license.
|
|
||||||
|
|
||||||
The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was
|
|
||||||
originally written by Solar Designer and placed into the public
|
|
||||||
domain. The code also comes with a fallback permissive license for use
|
|
||||||
in jurisdictions that may not recognize the public domain.
|
|
||||||
|
|
||||||
The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011
|
|
||||||
Valentin Ochs and is licensed under an MIT-style license.
|
|
||||||
|
|
||||||
The BSD PRNG implementation (src/prng/random.c) and XSI search API
|
|
||||||
(src/search/ *.c) functions are Copyright © 2011 Szabolcs Nagy and
|
|
||||||
licensed under following terms: "Permission to use, copy, modify,
|
|
||||||
and/or distribute this code for any purpose with or without fee is
|
|
||||||
hereby granted. There is no warranty."
|
|
||||||
|
|
||||||
The x86_64 port was written by Nicholas J. Kain and is licensed under
|
|
||||||
the standard MIT terms.
|
|
||||||
|
|
||||||
The mips and microblaze ports were originally written by Richard
|
|
||||||
Pennington for use in the ellcc project. The original code was adapted
|
|
||||||
by Rich Felker for build system and code conventions during upstream
|
|
||||||
integration. It is licensed under the standard MIT terms.
|
|
||||||
|
|
||||||
The mips64 port was contributed by Imagination Technologies and is
|
|
||||||
licensed under the standard MIT terms.
|
|
||||||
|
|
||||||
The powerpc port was also originally written by Richard Pennington,
|
|
||||||
and later supplemented and integrated by John Spencer. It is licensed
|
|
||||||
under the standard MIT terms.
|
|
||||||
|
|
||||||
All other files which have no copyright comments are original works
|
|
||||||
produced specifically for use as part of this library, written either
|
|
||||||
by Rich Felker, the main author of the library, or by one or more
|
|
||||||
contibutors listed above. Details on authorship of individual files
|
|
||||||
can be found in the git version control history of the project. The
|
|
||||||
omission of copyright and license comments in each file is in the
|
|
||||||
interest of source tree size.
|
|
||||||
|
|
||||||
In addition, permission is hereby granted for all public header files
|
|
||||||
(include/ * and arch/ * /bits/ *) and crt files intended to be linked into
|
|
||||||
applications (crt/ *, ldso/dlstart.c, and arch/ * /crt_arch.h) to omit
|
|
||||||
the copyright notice and permission notice otherwise required by the
|
|
||||||
license, and to use these files without any requirement of
|
|
||||||
attribution. These files include substantial contributions from:
|
|
||||||
|
|
||||||
Bobby Bingham
|
|
||||||
John Spencer
|
|
||||||
Nicholas J. Kain
|
|
||||||
Rich Felker
|
|
||||||
Richard Pennington
|
|
||||||
Stefan Kristiansson
|
|
||||||
Szabolcs Nagy
|
|
||||||
|
|
||||||
all of whom have explicitly granted such permission.
|
|
||||||
|
|
||||||
This file previously contained text expressing a belief that most of
|
|
||||||
the files covered by the above exception were sufficiently trivial not
|
|
||||||
to be subject to copyright, resulting in confusion over whether it
|
|
||||||
negated the permissions granted in the license. In the spirit of
|
|
||||||
permissive licensing, and of not having licensing issues being an
|
|
||||||
obstacle to adoption, that text has been removed.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
double preciseExp10(double x)
|
|
||||||
{
|
|
||||||
if (isnan(x)) return NAN;
|
|
||||||
|
|
||||||
// ranging between DBL_TRUE_MIN and DBL_MAX. Outsiders are treated as zeros or infinities
|
|
||||||
static const double p10[]
|
|
||||||
= {1e-323, 1e-322, 1e-321, 1e-320, 1e-319, 1e-318, 1e-317, 1e-316, 1e-315, 1e-314, 1e-313, 1e-312, 1e-311, 1e-310, 1e-309, 1e-308, 1e-307,
|
|
||||||
1e-306, 1e-305, 1e-304, 1e-303, 1e-302, 1e-301, 1e-300, 1e-299, 1e-298, 1e-297, 1e-296, 1e-295, 1e-294, 1e-293, 1e-292, 1e-291, 1e-290,
|
|
||||||
1e-289, 1e-288, 1e-287, 1e-286, 1e-285, 1e-284, 1e-283, 1e-282, 1e-281, 1e-280, 1e-279, 1e-278, 1e-277, 1e-276, 1e-275, 1e-274, 1e-273,
|
|
||||||
1e-272, 1e-271, 1e-270, 1e-269, 1e-268, 1e-267, 1e-266, 1e-265, 1e-264, 1e-263, 1e-262, 1e-261, 1e-260, 1e-259, 1e-258, 1e-257, 1e-256,
|
|
||||||
1e-255, 1e-254, 1e-253, 1e-252, 1e-251, 1e-250, 1e-249, 1e-248, 1e-247, 1e-246, 1e-245, 1e-244, 1e-243, 1e-242, 1e-241, 1e-240, 1e-239,
|
|
||||||
1e-238, 1e-237, 1e-236, 1e-235, 1e-234, 1e-233, 1e-232, 1e-231, 1e-230, 1e-229, 1e-228, 1e-227, 1e-226, 1e-225, 1e-224, 1e-223, 1e-222,
|
|
||||||
1e-221, 1e-220, 1e-219, 1e-218, 1e-217, 1e-216, 1e-215, 1e-214, 1e-213, 1e-212, 1e-211, 1e-210, 1e-209, 1e-208, 1e-207, 1e-206, 1e-205,
|
|
||||||
1e-204, 1e-203, 1e-202, 1e-201, 1e-200, 1e-199, 1e-198, 1e-197, 1e-196, 1e-195, 1e-194, 1e-193, 1e-192, 1e-191, 1e-190, 1e-189, 1e-188,
|
|
||||||
1e-187, 1e-186, 1e-185, 1e-184, 1e-183, 1e-182, 1e-181, 1e-180, 1e-179, 1e-178, 1e-177, 1e-176, 1e-175, 1e-174, 1e-173, 1e-172, 1e-171,
|
|
||||||
1e-170, 1e-169, 1e-168, 1e-167, 1e-166, 1e-165, 1e-164, 1e-163, 1e-162, 1e-161, 1e-160, 1e-159, 1e-158, 1e-157, 1e-156, 1e-155, 1e-154,
|
|
||||||
1e-153, 1e-152, 1e-151, 1e-150, 1e-149, 1e-148, 1e-147, 1e-146, 1e-145, 1e-144, 1e-143, 1e-142, 1e-141, 1e-140, 1e-139, 1e-138, 1e-137,
|
|
||||||
1e-136, 1e-135, 1e-134, 1e-133, 1e-132, 1e-131, 1e-130, 1e-129, 1e-128, 1e-127, 1e-126, 1e-125, 1e-124, 1e-123, 1e-122, 1e-121, 1e-120,
|
|
||||||
1e-119, 1e-118, 1e-117, 1e-116, 1e-115, 1e-114, 1e-113, 1e-112, 1e-111, 1e-110, 1e-109, 1e-108, 1e-107, 1e-106, 1e-105, 1e-104, 1e-103,
|
|
||||||
1e-102, 1e-101, 1e-100, 1e-99, 1e-98, 1e-97, 1e-96, 1e-95, 1e-94, 1e-93, 1e-92, 1e-91, 1e-90, 1e-89, 1e-88, 1e-87, 1e-86,
|
|
||||||
1e-85, 1e-84, 1e-83, 1e-82, 1e-81, 1e-80, 1e-79, 1e-78, 1e-77, 1e-76, 1e-75, 1e-74, 1e-73, 1e-72, 1e-71, 1e-70, 1e-69,
|
|
||||||
1e-68, 1e-67, 1e-66, 1e-65, 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52,
|
|
||||||
1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35,
|
|
||||||
1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18,
|
|
||||||
1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1,
|
|
||||||
1e0, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16,
|
|
||||||
1e+17, 1e+18, 1e+19, 1e+20, 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33,
|
|
||||||
1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50,
|
|
||||||
1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67,
|
|
||||||
1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, 1e+81, 1e+82, 1e+83, 1e+84,
|
|
||||||
1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, 1e+101,
|
|
||||||
1e+102, 1e+103, 1e+104, 1e+105, 1e+106, 1e+107, 1e+108, 1e+109, 1e+110, 1e+111, 1e+112, 1e+113, 1e+114, 1e+115, 1e+116, 1e+117, 1e+118,
|
|
||||||
1e+119, 1e+120, 1e+121, 1e+122, 1e+123, 1e+124, 1e+125, 1e+126, 1e+127, 1e+128, 1e+129, 1e+130, 1e+131, 1e+132, 1e+133, 1e+134, 1e+135,
|
|
||||||
1e+136, 1e+137, 1e+138, 1e+139, 1e+140, 1e+141, 1e+142, 1e+143, 1e+144, 1e+145, 1e+146, 1e+147, 1e+148, 1e+149, 1e+150, 1e+151, 1e+152,
|
|
||||||
1e+153, 1e+154, 1e+155, 1e+156, 1e+157, 1e+158, 1e+159, 1e+160, 1e+161, 1e+162, 1e+163, 1e+164, 1e+165, 1e+166, 1e+167, 1e+168, 1e+169,
|
|
||||||
1e+170, 1e+171, 1e+172, 1e+173, 1e+174, 1e+175, 1e+176, 1e+177, 1e+178, 1e+179, 1e+180, 1e+181, 1e+182, 1e+183, 1e+184, 1e+185, 1e+186,
|
|
||||||
1e+187, 1e+188, 1e+189, 1e+190, 1e+191, 1e+192, 1e+193, 1e+194, 1e+195, 1e+196, 1e+197, 1e+198, 1e+199, 1e+200, 1e+201, 1e+202, 1e+203,
|
|
||||||
1e+204, 1e+205, 1e+206, 1e+207, 1e+208, 1e+209, 1e+210, 1e+211, 1e+212, 1e+213, 1e+214, 1e+215, 1e+216, 1e+217, 1e+218, 1e+219, 1e+220,
|
|
||||||
1e+221, 1e+222, 1e+223, 1e+224, 1e+225, 1e+226, 1e+227, 1e+228, 1e+229, 1e+230, 1e+231, 1e+232, 1e+233, 1e+234, 1e+235, 1e+236, 1e+237,
|
|
||||||
1e+238, 1e+239, 1e+240, 1e+241, 1e+242, 1e+243, 1e+244, 1e+245, 1e+246, 1e+247, 1e+248, 1e+249, 1e+250, 1e+251, 1e+252, 1e+253, 1e+254,
|
|
||||||
1e+255, 1e+256, 1e+257, 1e+258, 1e+259, 1e+260, 1e+261, 1e+262, 1e+263, 1e+264, 1e+265, 1e+266, 1e+267, 1e+268, 1e+269, 1e+270, 1e+271,
|
|
||||||
1e+272, 1e+273, 1e+274, 1e+275, 1e+276, 1e+277, 1e+278, 1e+279, 1e+280, 1e+281, 1e+282, 1e+283, 1e+284, 1e+285, 1e+286, 1e+287, 1e+288,
|
|
||||||
1e+289, 1e+290, 1e+291, 1e+292, 1e+293, 1e+294, 1e+295, 1e+296, 1e+297, 1e+298, 1e+299, 1e+300, 1e+301, 1e+302, 1e+303, 1e+304, 1e+305,
|
|
||||||
1e+306, 1e+307, 1e+308};
|
|
||||||
|
|
||||||
double n, y = modf(x, &n);
|
|
||||||
if (n > 308) return INFINITY;
|
|
||||||
if (n < -323) return 0;
|
|
||||||
|
|
||||||
// Using lookup table based formula to get accurate results for integer arguments.
|
|
||||||
return exp2(3.32192809488736234787031942948939 * y) * p10[(int)n + 323];
|
|
||||||
}
|
|
227
base/common/preciseExp10.cpp
Normal file
227
base/common/preciseExp10.cpp
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
https://www.musl-libc.org/
|
||||||
|
http://git.musl-libc.org/cgit/musl/tree/src/math/exp10.c
|
||||||
|
|
||||||
|
musl as a whole is licensed under the following standard MIT license:
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Copyright © 2005-2014 Rich Felker, et al.
|
||||||
|
|
||||||
|
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.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Authors/contributors include:
|
||||||
|
|
||||||
|
Alex Dowad
|
||||||
|
Alexander Monakov
|
||||||
|
Anthony G. Basile
|
||||||
|
Arvid Picciani
|
||||||
|
Bobby Bingham
|
||||||
|
Boris Brezillon
|
||||||
|
Brent Cook
|
||||||
|
Chris Spiegel
|
||||||
|
Clément Vasseur
|
||||||
|
Daniel Micay
|
||||||
|
Denys Vlasenko
|
||||||
|
Emil Renner Berthing
|
||||||
|
Felix Fietkau
|
||||||
|
Felix Janda
|
||||||
|
Gianluca Anzolin
|
||||||
|
Hauke Mehrtens
|
||||||
|
Hiltjo Posthuma
|
||||||
|
Isaac Dunham
|
||||||
|
Jaydeep Patil
|
||||||
|
Jens Gustedt
|
||||||
|
Jeremy Huntwork
|
||||||
|
Jo-Philipp Wich
|
||||||
|
Joakim Sindholt
|
||||||
|
John Spencer
|
||||||
|
Josiah Worcester
|
||||||
|
Justin Cormack
|
||||||
|
Khem Raj
|
||||||
|
Kylie McClain
|
||||||
|
Luca Barbato
|
||||||
|
Luka Perkov
|
||||||
|
M Farkas-Dyck (Strake)
|
||||||
|
Mahesh Bodapati
|
||||||
|
Michael Forney
|
||||||
|
Natanael Copa
|
||||||
|
Nicholas J. Kain
|
||||||
|
orc
|
||||||
|
Pascal Cuoq
|
||||||
|
Petr Hosek
|
||||||
|
Pierre Carrier
|
||||||
|
Rich Felker
|
||||||
|
Richard Pennington
|
||||||
|
Shiz
|
||||||
|
sin
|
||||||
|
Solar Designer
|
||||||
|
Stefan Kristiansson
|
||||||
|
Szabolcs Nagy
|
||||||
|
Timo Teräs
|
||||||
|
Trutz Behn
|
||||||
|
Valentin Ochs
|
||||||
|
William Haddon
|
||||||
|
|
||||||
|
Portions of this software are derived from third-party works licensed
|
||||||
|
under terms compatible with the above MIT license:
|
||||||
|
|
||||||
|
The TRE regular expression implementation (src/regex/reg* and
|
||||||
|
src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed
|
||||||
|
under a 2-clause BSD license (license text in the source files). The
|
||||||
|
included version has been heavily modified by Rich Felker in 2012, in
|
||||||
|
the interests of size, simplicity, and namespace cleanliness.
|
||||||
|
|
||||||
|
Much of the math library code (src/math/ * and src/complex/ *) is
|
||||||
|
Copyright © 1993,2004 Sun Microsystems or
|
||||||
|
Copyright © 2003-2011 David Schultz or
|
||||||
|
Copyright © 2003-2009 Steven G. Kargl or
|
||||||
|
Copyright © 2003-2009 Bruce D. Evans or
|
||||||
|
Copyright © 2008 Stephen L. Moshier
|
||||||
|
and labelled as such in comments in the individual source files. All
|
||||||
|
have been licensed under extremely permissive terms.
|
||||||
|
|
||||||
|
The ARM memcpy code (src/string/arm/memcpy_el.S) is Copyright © 2008
|
||||||
|
The Android Open Source Project and is licensed under a two-clause BSD
|
||||||
|
license. It was taken from Bionic libc, used on Android.
|
||||||
|
|
||||||
|
The implementation of DES for crypt (src/crypt/crypt_des.c) is
|
||||||
|
Copyright © 1994 David Burren. It is licensed under a BSD license.
|
||||||
|
|
||||||
|
The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was
|
||||||
|
originally written by Solar Designer and placed into the public
|
||||||
|
domain. The code also comes with a fallback permissive license for use
|
||||||
|
in jurisdictions that may not recognize the public domain.
|
||||||
|
|
||||||
|
The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011
|
||||||
|
Valentin Ochs and is licensed under an MIT-style license.
|
||||||
|
|
||||||
|
The BSD PRNG implementation (src/prng/random.c) and XSI search API
|
||||||
|
(src/search/ *.c) functions are Copyright © 2011 Szabolcs Nagy and
|
||||||
|
licensed under following terms: "Permission to use, copy, modify,
|
||||||
|
and/or distribute this code for any purpose with or without fee is
|
||||||
|
hereby granted. There is no warranty."
|
||||||
|
|
||||||
|
The x86_64 port was written by Nicholas J. Kain and is licensed under
|
||||||
|
the standard MIT terms.
|
||||||
|
|
||||||
|
The mips and microblaze ports were originally written by Richard
|
||||||
|
Pennington for use in the ellcc project. The original code was adapted
|
||||||
|
by Rich Felker for build system and code conventions during upstream
|
||||||
|
integration. It is licensed under the standard MIT terms.
|
||||||
|
|
||||||
|
The mips64 port was contributed by Imagination Technologies and is
|
||||||
|
licensed under the standard MIT terms.
|
||||||
|
|
||||||
|
The powerpc port was also originally written by Richard Pennington,
|
||||||
|
and later supplemented and integrated by John Spencer. It is licensed
|
||||||
|
under the standard MIT terms.
|
||||||
|
|
||||||
|
All other files which have no copyright comments are original works
|
||||||
|
produced specifically for use as part of this library, written either
|
||||||
|
by Rich Felker, the main author of the library, or by one or more
|
||||||
|
contibutors listed above. Details on authorship of individual files
|
||||||
|
can be found in the git version control history of the project. The
|
||||||
|
omission of copyright and license comments in each file is in the
|
||||||
|
interest of source tree size.
|
||||||
|
|
||||||
|
In addition, permission is hereby granted for all public header files
|
||||||
|
(include/ * and arch/ * /bits/ *) and crt files intended to be linked into
|
||||||
|
applications (crt/ *, ldso/dlstart.c, and arch/ * /crt_arch.h) to omit
|
||||||
|
the copyright notice and permission notice otherwise required by the
|
||||||
|
license, and to use these files without any requirement of
|
||||||
|
attribution. These files include substantial contributions from:
|
||||||
|
|
||||||
|
Bobby Bingham
|
||||||
|
John Spencer
|
||||||
|
Nicholas J. Kain
|
||||||
|
Rich Felker
|
||||||
|
Richard Pennington
|
||||||
|
Stefan Kristiansson
|
||||||
|
Szabolcs Nagy
|
||||||
|
|
||||||
|
all of whom have explicitly granted such permission.
|
||||||
|
|
||||||
|
This file previously contained text expressing a belief that most of
|
||||||
|
the files covered by the above exception were sufficiently trivial not
|
||||||
|
to be subject to copyright, resulting in confusion over whether it
|
||||||
|
negated the permissions granted in the license. In the spirit of
|
||||||
|
permissive licensing, and of not having licensing issues being an
|
||||||
|
obstacle to adoption, that text has been removed.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
double preciseExp10(double x)
|
||||||
|
{
|
||||||
|
if (isnan(x)) return NAN;
|
||||||
|
|
||||||
|
// ranging between DBL_TRUE_MIN and DBL_MAX. Outsiders are treated as zeros or infinities
|
||||||
|
static const double p10[]
|
||||||
|
= {1e-323, 1e-322, 1e-321, 1e-320, 1e-319, 1e-318, 1e-317, 1e-316, 1e-315, 1e-314, 1e-313, 1e-312, 1e-311, 1e-310, 1e-309, 1e-308, 1e-307,
|
||||||
|
1e-306, 1e-305, 1e-304, 1e-303, 1e-302, 1e-301, 1e-300, 1e-299, 1e-298, 1e-297, 1e-296, 1e-295, 1e-294, 1e-293, 1e-292, 1e-291, 1e-290,
|
||||||
|
1e-289, 1e-288, 1e-287, 1e-286, 1e-285, 1e-284, 1e-283, 1e-282, 1e-281, 1e-280, 1e-279, 1e-278, 1e-277, 1e-276, 1e-275, 1e-274, 1e-273,
|
||||||
|
1e-272, 1e-271, 1e-270, 1e-269, 1e-268, 1e-267, 1e-266, 1e-265, 1e-264, 1e-263, 1e-262, 1e-261, 1e-260, 1e-259, 1e-258, 1e-257, 1e-256,
|
||||||
|
1e-255, 1e-254, 1e-253, 1e-252, 1e-251, 1e-250, 1e-249, 1e-248, 1e-247, 1e-246, 1e-245, 1e-244, 1e-243, 1e-242, 1e-241, 1e-240, 1e-239,
|
||||||
|
1e-238, 1e-237, 1e-236, 1e-235, 1e-234, 1e-233, 1e-232, 1e-231, 1e-230, 1e-229, 1e-228, 1e-227, 1e-226, 1e-225, 1e-224, 1e-223, 1e-222,
|
||||||
|
1e-221, 1e-220, 1e-219, 1e-218, 1e-217, 1e-216, 1e-215, 1e-214, 1e-213, 1e-212, 1e-211, 1e-210, 1e-209, 1e-208, 1e-207, 1e-206, 1e-205,
|
||||||
|
1e-204, 1e-203, 1e-202, 1e-201, 1e-200, 1e-199, 1e-198, 1e-197, 1e-196, 1e-195, 1e-194, 1e-193, 1e-192, 1e-191, 1e-190, 1e-189, 1e-188,
|
||||||
|
1e-187, 1e-186, 1e-185, 1e-184, 1e-183, 1e-182, 1e-181, 1e-180, 1e-179, 1e-178, 1e-177, 1e-176, 1e-175, 1e-174, 1e-173, 1e-172, 1e-171,
|
||||||
|
1e-170, 1e-169, 1e-168, 1e-167, 1e-166, 1e-165, 1e-164, 1e-163, 1e-162, 1e-161, 1e-160, 1e-159, 1e-158, 1e-157, 1e-156, 1e-155, 1e-154,
|
||||||
|
1e-153, 1e-152, 1e-151, 1e-150, 1e-149, 1e-148, 1e-147, 1e-146, 1e-145, 1e-144, 1e-143, 1e-142, 1e-141, 1e-140, 1e-139, 1e-138, 1e-137,
|
||||||
|
1e-136, 1e-135, 1e-134, 1e-133, 1e-132, 1e-131, 1e-130, 1e-129, 1e-128, 1e-127, 1e-126, 1e-125, 1e-124, 1e-123, 1e-122, 1e-121, 1e-120,
|
||||||
|
1e-119, 1e-118, 1e-117, 1e-116, 1e-115, 1e-114, 1e-113, 1e-112, 1e-111, 1e-110, 1e-109, 1e-108, 1e-107, 1e-106, 1e-105, 1e-104, 1e-103,
|
||||||
|
1e-102, 1e-101, 1e-100, 1e-99, 1e-98, 1e-97, 1e-96, 1e-95, 1e-94, 1e-93, 1e-92, 1e-91, 1e-90, 1e-89, 1e-88, 1e-87, 1e-86,
|
||||||
|
1e-85, 1e-84, 1e-83, 1e-82, 1e-81, 1e-80, 1e-79, 1e-78, 1e-77, 1e-76, 1e-75, 1e-74, 1e-73, 1e-72, 1e-71, 1e-70, 1e-69,
|
||||||
|
1e-68, 1e-67, 1e-66, 1e-65, 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52,
|
||||||
|
1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35,
|
||||||
|
1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18,
|
||||||
|
1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1,
|
||||||
|
1e0, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16,
|
||||||
|
1e+17, 1e+18, 1e+19, 1e+20, 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33,
|
||||||
|
1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50,
|
||||||
|
1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67,
|
||||||
|
1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, 1e+81, 1e+82, 1e+83, 1e+84,
|
||||||
|
1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, 1e+101,
|
||||||
|
1e+102, 1e+103, 1e+104, 1e+105, 1e+106, 1e+107, 1e+108, 1e+109, 1e+110, 1e+111, 1e+112, 1e+113, 1e+114, 1e+115, 1e+116, 1e+117, 1e+118,
|
||||||
|
1e+119, 1e+120, 1e+121, 1e+122, 1e+123, 1e+124, 1e+125, 1e+126, 1e+127, 1e+128, 1e+129, 1e+130, 1e+131, 1e+132, 1e+133, 1e+134, 1e+135,
|
||||||
|
1e+136, 1e+137, 1e+138, 1e+139, 1e+140, 1e+141, 1e+142, 1e+143, 1e+144, 1e+145, 1e+146, 1e+147, 1e+148, 1e+149, 1e+150, 1e+151, 1e+152,
|
||||||
|
1e+153, 1e+154, 1e+155, 1e+156, 1e+157, 1e+158, 1e+159, 1e+160, 1e+161, 1e+162, 1e+163, 1e+164, 1e+165, 1e+166, 1e+167, 1e+168, 1e+169,
|
||||||
|
1e+170, 1e+171, 1e+172, 1e+173, 1e+174, 1e+175, 1e+176, 1e+177, 1e+178, 1e+179, 1e+180, 1e+181, 1e+182, 1e+183, 1e+184, 1e+185, 1e+186,
|
||||||
|
1e+187, 1e+188, 1e+189, 1e+190, 1e+191, 1e+192, 1e+193, 1e+194, 1e+195, 1e+196, 1e+197, 1e+198, 1e+199, 1e+200, 1e+201, 1e+202, 1e+203,
|
||||||
|
1e+204, 1e+205, 1e+206, 1e+207, 1e+208, 1e+209, 1e+210, 1e+211, 1e+212, 1e+213, 1e+214, 1e+215, 1e+216, 1e+217, 1e+218, 1e+219, 1e+220,
|
||||||
|
1e+221, 1e+222, 1e+223, 1e+224, 1e+225, 1e+226, 1e+227, 1e+228, 1e+229, 1e+230, 1e+231, 1e+232, 1e+233, 1e+234, 1e+235, 1e+236, 1e+237,
|
||||||
|
1e+238, 1e+239, 1e+240, 1e+241, 1e+242, 1e+243, 1e+244, 1e+245, 1e+246, 1e+247, 1e+248, 1e+249, 1e+250, 1e+251, 1e+252, 1e+253, 1e+254,
|
||||||
|
1e+255, 1e+256, 1e+257, 1e+258, 1e+259, 1e+260, 1e+261, 1e+262, 1e+263, 1e+264, 1e+265, 1e+266, 1e+267, 1e+268, 1e+269, 1e+270, 1e+271,
|
||||||
|
1e+272, 1e+273, 1e+274, 1e+275, 1e+276, 1e+277, 1e+278, 1e+279, 1e+280, 1e+281, 1e+282, 1e+283, 1e+284, 1e+285, 1e+286, 1e+287, 1e+288,
|
||||||
|
1e+289, 1e+290, 1e+291, 1e+292, 1e+293, 1e+294, 1e+295, 1e+296, 1e+297, 1e+298, 1e+299, 1e+300, 1e+301, 1e+302, 1e+303, 1e+304, 1e+305,
|
||||||
|
1e+306, 1e+307, 1e+308};
|
||||||
|
|
||||||
|
double n, y = modf(x, &n);
|
||||||
|
if (n > 308) return INFINITY;
|
||||||
|
if (n < -323) return 0;
|
||||||
|
|
||||||
|
// Using lookup table based formula to get accurate results for integer arguments.
|
||||||
|
return exp2(3.32192809488736234787031942948939 * y) * p10[static_cast<int>(n) + 323];
|
||||||
|
}
|
@ -8,9 +8,4 @@
|
|||||||
* Note: the function names are different to avoid confusion with symbols from the system libm.
|
* Note: the function names are different to avoid confusion with symbols from the system libm.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
|
|
||||||
double preciseExp10(double x);
|
double preciseExp10(double x);
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -22,7 +22,7 @@ void sleepForNanoseconds(uint64_t nanoseconds)
|
|||||||
#if defined(OS_DARWIN)
|
#if defined(OS_DARWIN)
|
||||||
//https://developer.apple.com/library/archive/technotes/tn2169/_index.html
|
//https://developer.apple.com/library/archive/technotes/tn2169/_index.html
|
||||||
//https://dshil.github.io/blog/missed-os-x-clock-guide/
|
//https://dshil.github.io/blog/missed-os-x-clock-guide/
|
||||||
static mach_timebase_info_data_t timebase_info = {0};
|
static mach_timebase_info_data_t timebase_info{};
|
||||||
if (timebase_info.denom == 0)
|
if (timebase_info.denom == 0)
|
||||||
mach_timebase_info(&timebase_info);
|
mach_timebase_info(&timebase_info);
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#define BOOST_TEST_MODULE StrongTypedef
|
|
||||||
|
|
||||||
#include <common/strong_typedef.h>
|
#include <common/strong_typedef.h>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
@ -12,15 +10,15 @@
|
|||||||
TEST(StrongTypedefSuite, TypedefsOfTheSameType)
|
TEST(StrongTypedefSuite, TypedefsOfTheSameType)
|
||||||
{
|
{
|
||||||
/// check that strong typedefs of same type differ
|
/// check that strong typedefs of same type differ
|
||||||
STRONG_TYPEDEF(int, Int);
|
STRONG_TYPEDEF(int, Int)
|
||||||
STRONG_TYPEDEF(int, AnotherInt);
|
STRONG_TYPEDEF(int, AnotherInt)
|
||||||
|
|
||||||
EXPECT_TRUE(!(std::is_same<Int, AnotherInt>::value));
|
EXPECT_TRUE(!(std::is_same<Int, AnotherInt>::value));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StrongTypedefSuite, Map)
|
TEST(StrongTypedefSuite, Map)
|
||||||
{
|
{
|
||||||
STRONG_TYPEDEF(int, Int);
|
STRONG_TYPEDEF(int, Int)
|
||||||
|
|
||||||
/// check that this code compiles
|
/// check that this code compiles
|
||||||
std::set<Int> int_set;
|
std::set<Int> int_set;
|
||||||
@ -31,13 +29,13 @@ TEST(StrongTypedefSuite, Map)
|
|||||||
|
|
||||||
TEST(StrongTypedefSuite, CopyAndMoveCtor)
|
TEST(StrongTypedefSuite, CopyAndMoveCtor)
|
||||||
{
|
{
|
||||||
STRONG_TYPEDEF(int, Int);
|
STRONG_TYPEDEF(int, Int)
|
||||||
Int a(1);
|
Int a(1);
|
||||||
Int b(2);
|
Int b(2);
|
||||||
a = b;
|
a = b;
|
||||||
EXPECT_EQ(a.toUnderType(), 2);
|
EXPECT_EQ(a.toUnderType(), 2);
|
||||||
|
|
||||||
STRONG_TYPEDEF(std::unique_ptr<int>, IntPtr);
|
STRONG_TYPEDEF(std::unique_ptr<int>, IntPtr)
|
||||||
{
|
{
|
||||||
IntPtr ptr;
|
IntPtr ptr;
|
||||||
ptr = IntPtr(std::make_unique<int>(3));
|
ptr = IntPtr(std::make_unique<int>(3));
|
||||||
@ -57,6 +55,6 @@ TEST(StrongTypedefSuite, NoDefaultCtor)
|
|||||||
NoDefaultCtor(int) {} // NOLINT
|
NoDefaultCtor(int) {} // NOLINT
|
||||||
};
|
};
|
||||||
|
|
||||||
STRONG_TYPEDEF(NoDefaultCtor, MyStruct);
|
STRONG_TYPEDEF(NoDefaultCtor, MyStruct)
|
||||||
MyStruct m(1);
|
MyStruct m(1);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,10 @@ ADDINCL(
|
|||||||
|
|
||||||
CFLAGS (GLOBAL -DARCADIA_BUILD)
|
CFLAGS (GLOBAL -DARCADIA_BUILD)
|
||||||
|
|
||||||
|
CFLAGS (GLOBAL -DUSE_CPUID=1)
|
||||||
|
CFLAGS (GLOBAL -DUSE_JEMALLOC=0)
|
||||||
|
CFLAGS (GLOBAL -DUSE_RAPIDJSON=1)
|
||||||
|
|
||||||
IF (OS_DARWIN)
|
IF (OS_DARWIN)
|
||||||
CFLAGS (GLOBAL -DOS_DARWIN)
|
CFLAGS (GLOBAL -DOS_DARWIN)
|
||||||
ELSEIF (OS_FREEBSD)
|
ELSEIF (OS_FREEBSD)
|
||||||
@ -37,7 +41,7 @@ SRCS(
|
|||||||
LineReader.cpp
|
LineReader.cpp
|
||||||
mremap.cpp
|
mremap.cpp
|
||||||
phdr_cache.cpp
|
phdr_cache.cpp
|
||||||
preciseExp10.c
|
preciseExp10.cpp
|
||||||
setTerminalEcho.cpp
|
setTerminalEcho.cpp
|
||||||
shift10.cpp
|
shift10.cpp
|
||||||
sleep.cpp
|
sleep.cpp
|
||||||
|
@ -52,11 +52,12 @@
|
|||||||
#include <Common/Config/ConfigProcessor.h>
|
#include <Common/Config/ConfigProcessor.h>
|
||||||
|
|
||||||
#if !defined(ARCADIA_BUILD)
|
#if !defined(ARCADIA_BUILD)
|
||||||
# include <Common/config_version.h>
|
# include <Common/config_version.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OS_DARWIN)
|
#if defined(OS_DARWIN)
|
||||||
# define _XOPEN_SOURCE 700 // ucontext is not available without _XOPEN_SOURCE
|
# pragma GCC diagnostic ignored "-Wunused-macros"
|
||||||
|
# define _XOPEN_SOURCE 700 // ucontext is not available without _XOPEN_SOURCE
|
||||||
#endif
|
#endif
|
||||||
#include <ucontext.h>
|
#include <ucontext.h>
|
||||||
|
|
||||||
@ -76,7 +77,7 @@ static void call_default_signal_handler(int sig)
|
|||||||
|
|
||||||
static constexpr size_t max_query_id_size = 127;
|
static constexpr size_t max_query_id_size = 127;
|
||||||
|
|
||||||
static const size_t buf_size =
|
static const size_t signal_pipe_buf_size =
|
||||||
sizeof(int)
|
sizeof(int)
|
||||||
+ sizeof(siginfo_t)
|
+ sizeof(siginfo_t)
|
||||||
+ sizeof(ucontext_t)
|
+ sizeof(ucontext_t)
|
||||||
@ -91,8 +92,8 @@ static void writeSignalIDtoSignalPipe(int sig)
|
|||||||
{
|
{
|
||||||
auto saved_errno = errno; /// We must restore previous value of errno in signal handler.
|
auto saved_errno = errno; /// We must restore previous value of errno in signal handler.
|
||||||
|
|
||||||
char buf[buf_size];
|
char buf[signal_pipe_buf_size];
|
||||||
DB::WriteBufferFromFileDescriptor out(signal_pipe.fds_rw[1], buf_size, buf);
|
DB::WriteBufferFromFileDescriptor out(signal_pipe.fds_rw[1], signal_pipe_buf_size, buf);
|
||||||
DB::writeBinary(sig, out);
|
DB::writeBinary(sig, out);
|
||||||
out.next();
|
out.next();
|
||||||
|
|
||||||
@ -117,8 +118,8 @@ static void signalHandler(int sig, siginfo_t * info, void * context)
|
|||||||
{
|
{
|
||||||
auto saved_errno = errno; /// We must restore previous value of errno in signal handler.
|
auto saved_errno = errno; /// We must restore previous value of errno in signal handler.
|
||||||
|
|
||||||
char buf[buf_size];
|
char buf[signal_pipe_buf_size];
|
||||||
DB::WriteBufferFromFileDescriptorDiscardOnFailure out(signal_pipe.fds_rw[1], buf_size, buf);
|
DB::WriteBufferFromFileDescriptorDiscardOnFailure out(signal_pipe.fds_rw[1], signal_pipe_buf_size, buf);
|
||||||
|
|
||||||
const ucontext_t signal_context = *reinterpret_cast<ucontext_t *>(context);
|
const ucontext_t signal_context = *reinterpret_cast<ucontext_t *>(context);
|
||||||
const StackTrace stack_trace(signal_context);
|
const StackTrace stack_trace(signal_context);
|
||||||
@ -166,10 +167,10 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void run()
|
void run() override
|
||||||
{
|
{
|
||||||
char buf[buf_size];
|
char buf[signal_pipe_buf_size];
|
||||||
DB::ReadBufferFromFileDescriptor in(signal_pipe.fds_rw[0], buf_size, buf);
|
DB::ReadBufferFromFileDescriptor in(signal_pipe.fds_rw[0], signal_pipe_buf_size, buf);
|
||||||
|
|
||||||
while (!in.eof())
|
while (!in.eof())
|
||||||
{
|
{
|
||||||
@ -282,19 +283,56 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SANITIZER)
|
||||||
|
extern "C" void __sanitizer_set_death_callback(void (*)());
|
||||||
|
|
||||||
|
static void sanitizerDeathCallback()
|
||||||
|
{
|
||||||
|
Logger * log = &Logger::get("BaseDaemon");
|
||||||
|
|
||||||
|
StringRef query_id = CurrentThread::getQueryId(); /// This is signal safe.
|
||||||
|
|
||||||
|
{
|
||||||
|
std::stringstream message;
|
||||||
|
message << "(version " << VERSION_STRING << VERSION_OFFICIAL << ")";
|
||||||
|
message << " (from thread " << getThreadId() << ")";
|
||||||
|
if (query_id.size == 0)
|
||||||
|
message << " (no query)";
|
||||||
|
else
|
||||||
|
message << " (query_id: " << query_id << ")";
|
||||||
|
message << " Sanitizer trap.";
|
||||||
|
|
||||||
|
LOG_FATAL(log, message.rdbuf());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Just in case print our own stack trace. In case when llvm-symbolizer does not work.
|
||||||
|
StackTrace stack_trace;
|
||||||
|
if (stack_trace.getSize())
|
||||||
|
{
|
||||||
|
std::stringstream bare_stacktrace;
|
||||||
|
bare_stacktrace << "Stack trace:";
|
||||||
|
for (size_t i = stack_trace.getOffset(); i < stack_trace.getSize(); ++i)
|
||||||
|
bare_stacktrace << ' ' << stack_trace.getFrames()[i];
|
||||||
|
|
||||||
|
LOG_FATAL(log, bare_stacktrace.rdbuf());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Write symbolized stack trace line by line for better grep-ability.
|
||||||
|
stack_trace.toStringEveryLine([&](const std::string & s) { LOG_FATAL(log, s); });
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/** To use with std::set_terminate.
|
/** To use with std::set_terminate.
|
||||||
* Collects slightly more info than __gnu_cxx::__verbose_terminate_handler,
|
* Collects slightly more info than __gnu_cxx::__verbose_terminate_handler,
|
||||||
* and send it to pipe. Other thread will read this info from pipe and asynchronously write it to log.
|
* and send it to pipe. Other thread will read this info from pipe and asynchronously write it to log.
|
||||||
* Look at libstdc++-v3/libsupc++/vterminate.cc for example.
|
* Look at libstdc++-v3/libsupc++/vterminate.cc for example.
|
||||||
*/
|
*/
|
||||||
static void terminate_handler()
|
[[noreturn]] static void terminate_handler()
|
||||||
{
|
{
|
||||||
static thread_local bool terminating = false;
|
static thread_local bool terminating = false;
|
||||||
if (terminating)
|
if (terminating)
|
||||||
{
|
|
||||||
abort();
|
abort();
|
||||||
return; /// Just for convenience.
|
|
||||||
}
|
|
||||||
|
|
||||||
terminating = true;
|
terminating = true;
|
||||||
|
|
||||||
@ -524,12 +562,12 @@ void BaseDaemon::initialize(Application & self)
|
|||||||
/// This must be done before any usage of DateLUT. In particular, before any logging.
|
/// This must be done before any usage of DateLUT. In particular, before any logging.
|
||||||
if (config().has("timezone"))
|
if (config().has("timezone"))
|
||||||
{
|
{
|
||||||
const std::string timezone = config().getString("timezone");
|
const std::string config_timezone = config().getString("timezone");
|
||||||
if (0 != setenv("TZ", timezone.data(), 1))
|
if (0 != setenv("TZ", config_timezone.data(), 1))
|
||||||
throw Poco::Exception("Cannot setenv TZ variable");
|
throw Poco::Exception("Cannot setenv TZ variable");
|
||||||
|
|
||||||
tzset();
|
tzset();
|
||||||
DateLUT::setDefaultTimezone(timezone);
|
DateLUT::setDefaultTimezone(config_timezone);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string log_path = config().getString("logger.log", "");
|
std::string log_path = config().getString("logger.log", "");
|
||||||
@ -547,6 +585,9 @@ void BaseDaemon::initialize(Application & self)
|
|||||||
std::string stderr_path = config().getString("logger.stderr", log_path + "/stderr.log");
|
std::string stderr_path = config().getString("logger.stderr", log_path + "/stderr.log");
|
||||||
if (!freopen(stderr_path.c_str(), "a+", stderr))
|
if (!freopen(stderr_path.c_str(), "a+", stderr))
|
||||||
throw Poco::OpenFileException("Cannot attach stderr to " + stderr_path);
|
throw Poco::OpenFileException("Cannot attach stderr to " + stderr_path);
|
||||||
|
|
||||||
|
/// Disable buffering for stderr
|
||||||
|
setbuf(stderr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!log_path.empty() && is_daemon) || config().has("logger.stdout"))
|
if ((!log_path.empty() && is_daemon) || config().has("logger.stdout"))
|
||||||
@ -633,12 +674,18 @@ void BaseDaemon::initializeTerminationAndSignalProcessing()
|
|||||||
sa.sa_flags = SA_SIGINFO;
|
sa.sa_flags = SA_SIGINFO;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
#if defined(OS_DARWIN)
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
for (auto signal : signals)
|
||||||
|
sigaddset(&sa.sa_mask, signal);
|
||||||
|
#else
|
||||||
if (sigemptyset(&sa.sa_mask))
|
if (sigemptyset(&sa.sa_mask))
|
||||||
throw Poco::Exception("Cannot set signal handler.");
|
throw Poco::Exception("Cannot set signal handler.");
|
||||||
|
|
||||||
for (auto signal : signals)
|
for (auto signal : signals)
|
||||||
if (sigaddset(&sa.sa_mask, signal))
|
if (sigaddset(&sa.sa_mask, signal))
|
||||||
throw Poco::Exception("Cannot set signal handler.");
|
throw Poco::Exception("Cannot set signal handler.");
|
||||||
|
#endif
|
||||||
|
|
||||||
for (auto signal : signals)
|
for (auto signal : signals)
|
||||||
if (sigaction(signal, &sa, nullptr))
|
if (sigaction(signal, &sa, nullptr))
|
||||||
@ -652,6 +699,10 @@ void BaseDaemon::initializeTerminationAndSignalProcessing()
|
|||||||
add_signal_handler({SIGHUP, SIGUSR1}, closeLogsSignalHandler);
|
add_signal_handler({SIGHUP, SIGUSR1}, closeLogsSignalHandler);
|
||||||
add_signal_handler({SIGINT, SIGQUIT, SIGTERM}, terminateRequestedSignalHandler);
|
add_signal_handler({SIGINT, SIGQUIT, SIGTERM}, terminateRequestedSignalHandler);
|
||||||
|
|
||||||
|
#if defined(SANITIZER)
|
||||||
|
__sanitizer_set_death_callback(sanitizerDeathCallback);
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Set up Poco ErrorHandler for Poco Threads.
|
/// Set up Poco ErrorHandler for Poco Threads.
|
||||||
static KillingErrorHandler killing_error_handler;
|
static KillingErrorHandler killing_error_handler;
|
||||||
Poco::ErrorHandler::set(&killing_error_handler);
|
Poco::ErrorHandler::set(&killing_error_handler);
|
||||||
@ -687,37 +738,37 @@ void BaseDaemon::handleNotification(Poco::TaskFailedNotification *_tfn)
|
|||||||
ServerApplication::terminate();
|
ServerApplication::terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseDaemon::defineOptions(Poco::Util::OptionSet& _options)
|
void BaseDaemon::defineOptions(Poco::Util::OptionSet & new_options)
|
||||||
{
|
{
|
||||||
Poco::Util::ServerApplication::defineOptions (_options);
|
new_options.addOption(
|
||||||
|
|
||||||
_options.addOption(
|
|
||||||
Poco::Util::Option("config-file", "C", "load configuration from a given file")
|
Poco::Util::Option("config-file", "C", "load configuration from a given file")
|
||||||
.required(false)
|
.required(false)
|
||||||
.repeatable(false)
|
.repeatable(false)
|
||||||
.argument("<file>")
|
.argument("<file>")
|
||||||
.binding("config-file"));
|
.binding("config-file"));
|
||||||
|
|
||||||
_options.addOption(
|
new_options.addOption(
|
||||||
Poco::Util::Option("log-file", "L", "use given log file")
|
Poco::Util::Option("log-file", "L", "use given log file")
|
||||||
.required(false)
|
.required(false)
|
||||||
.repeatable(false)
|
.repeatable(false)
|
||||||
.argument("<file>")
|
.argument("<file>")
|
||||||
.binding("logger.log"));
|
.binding("logger.log"));
|
||||||
|
|
||||||
_options.addOption(
|
new_options.addOption(
|
||||||
Poco::Util::Option("errorlog-file", "E", "use given log file for errors only")
|
Poco::Util::Option("errorlog-file", "E", "use given log file for errors only")
|
||||||
.required(false)
|
.required(false)
|
||||||
.repeatable(false)
|
.repeatable(false)
|
||||||
.argument("<file>")
|
.argument("<file>")
|
||||||
.binding("logger.errorlog"));
|
.binding("logger.errorlog"));
|
||||||
|
|
||||||
_options.addOption(
|
new_options.addOption(
|
||||||
Poco::Util::Option("pid-file", "P", "use given pidfile")
|
Poco::Util::Option("pid-file", "P", "use given pidfile")
|
||||||
.required(false)
|
.required(false)
|
||||||
.repeatable(false)
|
.repeatable(false)
|
||||||
.argument("<file>")
|
.argument("<file>")
|
||||||
.binding("pid"));
|
.binding("pid"));
|
||||||
|
|
||||||
|
Poco::Util::ServerApplication::defineOptions(new_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isPidRunning(pid_t pid)
|
bool isPidRunning(pid_t pid)
|
||||||
|
@ -58,7 +58,7 @@ public:
|
|||||||
void reloadConfiguration();
|
void reloadConfiguration();
|
||||||
|
|
||||||
/// Определяет параметр командной строки
|
/// Определяет параметр командной строки
|
||||||
void defineOptions(Poco::Util::OptionSet & _options) override;
|
void defineOptions(Poco::Util::OptionSet & new_options) override;
|
||||||
|
|
||||||
/// Заставляет демон завершаться, если хотя бы одна задача завершилась неудачно
|
/// Заставляет демон завершаться, если хотя бы одна задача завершилась неудачно
|
||||||
void exitOnTaskError();
|
void exitOnTaskError();
|
||||||
|
@ -4,4 +4,4 @@ add_library (daemon
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories (daemon PUBLIC ..)
|
target_include_directories (daemon PUBLIC ..)
|
||||||
target_link_libraries (daemon PUBLIC loggers PRIVATE clickhouse_common_io clickhouse_common_config common ${Poco_Net_LIBRARY} ${Poco_Util_LIBRARY} ${EXECINFO_LIBRARIES})
|
target_link_libraries (daemon PUBLIC loggers PRIVATE clickhouse_common_io clickhouse_common_config common ${EXECINFO_LIBRARIES})
|
||||||
|
@ -1,42 +1,62 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <boost/range/counting_range.hpp>
|
#include <boost/range/counting_range.hpp>
|
||||||
#include <boost/range/adaptor/transformed.hpp>
|
#include <boost/range/adaptor/transformed.hpp>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
|
||||||
namespace ext
|
namespace ext
|
||||||
{
|
{
|
||||||
/// For loop adaptor which is used to iterate through a half-closed interval [begin, end).
|
namespace internal
|
||||||
template <typename BeginType, typename EndType>
|
{
|
||||||
inline auto range(BeginType begin, EndType end)
|
template <typename ResultType, typename CountingType, typename BeginType, typename EndType>
|
||||||
|
auto rangeImpl(BeginType begin, EndType end)
|
||||||
{
|
{
|
||||||
using CommonType = typename std::common_type<BeginType, EndType>::type;
|
if constexpr (std::is_same_v<ResultType, CountingType>)
|
||||||
return boost::counting_range<CommonType>(begin, end);
|
return boost::counting_range<CountingType>(static_cast<CountingType>(begin), static_cast<CountingType>(end));
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Type>
|
|
||||||
inline auto range(Type end)
|
|
||||||
{
|
|
||||||
return range<Type, Type>(static_cast<Type>(0), end);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The same as range(), but every value is casted statically to a specified `ValueType`.
|
|
||||||
/// This is useful to iterate through all constants of a enum.
|
|
||||||
template <typename ValueType, typename BeginType, typename EndType>
|
|
||||||
inline auto range_with_static_cast(BeginType begin, EndType end)
|
|
||||||
{
|
|
||||||
using CommonType = typename std::common_type<BeginType, EndType>::type;
|
|
||||||
if constexpr (std::is_same_v<ValueType, CommonType>)
|
|
||||||
return boost::counting_range<CommonType>(begin, end);
|
|
||||||
else
|
else
|
||||||
return boost::counting_range<CommonType>(begin, end)
|
return boost::counting_range<CountingType>(static_cast<CountingType>(begin), static_cast<CountingType>(end))
|
||||||
| boost::adaptors::transformed([](CommonType x) -> ValueType { return static_cast<ValueType>(x); });
|
| boost::adaptors::transformed([](CountingType x) { return static_cast<ResultType>(x); });
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ValueType, typename EndType>
|
|
||||||
inline auto range_with_static_cast(EndType end)
|
|
||||||
{
|
|
||||||
return range_with_static_cast<ValueType, EndType, EndType>(static_cast<EndType>(0), end);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// For loop adaptor which is used to iterate through a half-closed interval [begin, end).
|
||||||
|
/// The parameters `begin` and `end` can have any integral or enum types.
|
||||||
|
template <typename BeginType,
|
||||||
|
typename EndType,
|
||||||
|
typename = std::enable_if_t<
|
||||||
|
(std::is_integral_v<BeginType> || std::is_enum_v<BeginType>) &&
|
||||||
|
(std::is_integral_v<EndType> || std::is_enum_v<EndType>) &&
|
||||||
|
(!std::is_enum_v<BeginType> || !std::is_enum_v<EndType> || std::is_same_v<BeginType, EndType>), void>>
|
||||||
|
inline auto range(BeginType begin, EndType end)
|
||||||
|
{
|
||||||
|
if constexpr (std::is_integral_v<BeginType> && std::is_integral_v<EndType>)
|
||||||
|
{
|
||||||
|
using CommonType = std::common_type_t<BeginType, EndType>;
|
||||||
|
return internal::rangeImpl<CommonType, CommonType>(begin, end);
|
||||||
|
}
|
||||||
|
else if constexpr (std::is_enum_v<BeginType>)
|
||||||
|
{
|
||||||
|
return internal::rangeImpl<BeginType, std::underlying_type_t<BeginType>>(begin, end);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return internal::rangeImpl<EndType, std::underlying_type_t<EndType>>(begin, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// For loop adaptor which is used to iterate through a half-closed interval [0, end).
|
||||||
|
/// The parameter `end` can have any integral or enum type.
|
||||||
|
/// The same as range(0, end).
|
||||||
|
template <typename Type,
|
||||||
|
typename = std::enable_if_t<std::is_integral_v<Type> || std::is_enum_v<Type>, void>>
|
||||||
|
inline auto range(Type end)
|
||||||
|
{
|
||||||
|
if constexpr (std::is_integral_v<Type>)
|
||||||
|
return internal::rangeImpl<Type, Type>(0, end);
|
||||||
|
else
|
||||||
|
return internal::rangeImpl<Type, std::underlying_type_t<Type>>(0, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
include(${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake)
|
include(${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake)
|
||||||
add_headers_and_sources(loggers .)
|
add_headers_and_sources(loggers .)
|
||||||
add_library(loggers ${loggers_sources} ${loggers_headers})
|
add_library(loggers ${loggers_sources} ${loggers_headers})
|
||||||
target_link_libraries(loggers PRIVATE dbms clickhouse_common_io ${Poco_Foundation_LIBRARY})
|
target_link_libraries(loggers PRIVATE dbms clickhouse_common_io)
|
||||||
target_include_directories(loggers PUBLIC ..)
|
target_include_directories(loggers PUBLIC ..)
|
||||||
|
@ -166,12 +166,29 @@ void Loggers::buildLoggers(Poco::Util::AbstractConfiguration & config, Poco::Log
|
|||||||
logger.root().setChannel(logger.getChannel());
|
logger.root().setChannel(logger.getChannel());
|
||||||
|
|
||||||
// Explicitly specified log levels for specific loggers.
|
// Explicitly specified log levels for specific loggers.
|
||||||
Poco::Util::AbstractConfiguration::Keys levels;
|
{
|
||||||
config.keys("logger.levels", levels);
|
Poco::Util::AbstractConfiguration::Keys loggers_level;
|
||||||
|
config.keys("logger.levels", loggers_level);
|
||||||
|
|
||||||
if (!levels.empty())
|
if (!loggers_level.empty())
|
||||||
for (const auto & level : levels)
|
{
|
||||||
logger.root().get(level).setLevel(config.getString("logger.levels." + level, "trace"));
|
for (const auto & key : loggers_level)
|
||||||
|
{
|
||||||
|
if (key == "logger" || key.starts_with("logger["))
|
||||||
|
{
|
||||||
|
const std::string name(config.getString("logger.levels." + key + ".name"));
|
||||||
|
const std::string level(config.getString("logger.levels." + key + ".level"));
|
||||||
|
logger.root().get(name).setLevel(level);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Legacy syntax
|
||||||
|
const std::string level(config.getString("logger.levels." + key, "trace"));
|
||||||
|
logger.root().get(key).setLevel(level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Loggers::closeLogs(Poco::Logger & logger)
|
void Loggers::closeLogs(Poco::Logger & logger)
|
||||||
|
@ -32,7 +32,7 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_link_libraries(mysqlxx PUBLIC common ${Poco_Util_LIBRARY} ${Poco_Foundation_LIBRARY} PRIVATE ${MYSQLCLIENT_LIBRARIES} PUBLIC ${Boost_SYSTEM_LIBRARY} PRIVATE ${ZLIB_LIBRARIES})
|
target_link_libraries(mysqlxx PUBLIC common PRIVATE ${MYSQLCLIENT_LIBRARIES} PUBLIC ${Boost_SYSTEM_LIBRARY} PRIVATE ${ZLIB_LIBRARIES})
|
||||||
if(OPENSSL_LIBRARIES)
|
if(OPENSSL_LIBRARIES)
|
||||||
target_link_libraries(mysqlxx PRIVATE ${OPENSSL_LIBRARIES})
|
target_link_libraries(mysqlxx PRIVATE ${OPENSSL_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
|
@ -18,8 +18,6 @@ std::string errorMessage(MYSQL * driver)
|
|||||||
return res.str();
|
return res.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Для внутренних нужд библиотеки.
|
|
||||||
void checkError(MYSQL * driver)
|
void checkError(MYSQL * driver)
|
||||||
{
|
{
|
||||||
unsigned num = mysql_errno(driver);
|
unsigned num = mysql_errno(driver);
|
||||||
@ -28,8 +26,6 @@ void checkError(MYSQL * driver)
|
|||||||
throw Exception(errorMessage(driver), num);
|
throw Exception(errorMessage(driver), num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Для внутренних нужд библиотеки.
|
|
||||||
void onError(MYSQL * driver)
|
void onError(MYSQL * driver)
|
||||||
{
|
{
|
||||||
throw Exception(errorMessage(driver), mysql_errno(driver));
|
throw Exception(errorMessage(driver), mysql_errno(driver));
|
||||||
|
@ -48,6 +48,6 @@ std::string errorMessage(MYSQL * driver);
|
|||||||
|
|
||||||
/// For internal need of library.
|
/// For internal need of library.
|
||||||
void checkError(MYSQL * driver);
|
void checkError(MYSQL * driver);
|
||||||
void onError(MYSQL * driver);
|
[[noreturn]] void onError(MYSQL * driver);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ public:
|
|||||||
Null() : is_null(true) {}
|
Null() : is_null(true) {}
|
||||||
Null(const Null<T> &) = default;
|
Null(const Null<T> &) = default;
|
||||||
Null(Null<T> &&) noexcept = default;
|
Null(Null<T> &&) noexcept = default;
|
||||||
Null(NullType data) : is_null(true) {}
|
Null(NullType) : is_null(true) {}
|
||||||
explicit Null(const T & data_) : data(data_), is_null(false) {}
|
explicit Null(const T & data_) : data(data_), is_null(false) {}
|
||||||
|
|
||||||
operator T & ()
|
operator T & ()
|
||||||
@ -47,7 +47,7 @@ public:
|
|||||||
Null<T> & operator= (Null<T> &&) noexcept = default;
|
Null<T> & operator= (Null<T> &&) noexcept = default;
|
||||||
Null<T> & operator= (const Null<T> &) = default;
|
Null<T> & operator= (const Null<T> &) = default;
|
||||||
Null<T> & operator= (const T & data_) { is_null = false; data = data_; return *this; }
|
Null<T> & operator= (const T & data_) { is_null = false; data = data_; return *this; }
|
||||||
Null<T> & operator= (const NullType other) { is_null = true; data = T(); return *this; }
|
Null<T> & operator= (const NullType) { is_null = true; data = T(); return *this; }
|
||||||
|
|
||||||
bool isNull() const { return is_null; }
|
bool isNull() const { return is_null; }
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ public:
|
|||||||
|| (is_null == other.is_null && data < other.data);
|
|| (is_null == other.is_null && data < other.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator< (const NullType other) const { return false; }
|
bool operator< (const NullType) const { return false; }
|
||||||
|
|
||||||
bool operator== (const Null<T> & other) const
|
bool operator== (const Null<T> & other) const
|
||||||
{
|
{
|
||||||
@ -69,14 +69,14 @@ public:
|
|||||||
return !is_null && data == other;
|
return !is_null && data == other;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator== (const NullType other) const { return is_null; }
|
bool operator== (const NullType) const { return is_null; }
|
||||||
|
|
||||||
bool operator!= (const Null<T> & other) const
|
bool operator!= (const Null<T> & other) const
|
||||||
{
|
{
|
||||||
return !(*this == other);
|
return !(*this == other);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator!= (const NullType other) const { return !is_null; }
|
bool operator!= (const NullType) const { return !is_null; }
|
||||||
|
|
||||||
bool operator!= (const T & other) const
|
bool operator!= (const T & other) const
|
||||||
{
|
{
|
||||||
|
@ -10,46 +10,47 @@ static bool startsWith(const std::string & s, const char * prefix)
|
|||||||
|
|
||||||
using namespace mysqlxx;
|
using namespace mysqlxx;
|
||||||
|
|
||||||
PoolWithFailover::PoolWithFailover(const Poco::Util::AbstractConfiguration & config,
|
PoolWithFailover::PoolWithFailover(const Poco::Util::AbstractConfiguration & config_,
|
||||||
const std::string & config_name, const unsigned default_connections,
|
const std::string & config_name_, const unsigned default_connections_,
|
||||||
const unsigned max_connections, const size_t max_tries)
|
const unsigned max_connections_, const size_t max_tries_)
|
||||||
: max_tries(max_tries)
|
: max_tries(max_tries_)
|
||||||
{
|
{
|
||||||
shareable = config.getBool(config_name + ".share_connection", false);
|
shareable = config_.getBool(config_name_ + ".share_connection", false);
|
||||||
if (config.has(config_name + ".replica"))
|
if (config_.has(config_name_ + ".replica"))
|
||||||
{
|
{
|
||||||
Poco::Util::AbstractConfiguration::Keys replica_keys;
|
Poco::Util::AbstractConfiguration::Keys replica_keys;
|
||||||
config.keys(config_name, replica_keys);
|
config_.keys(config_name_, replica_keys);
|
||||||
for (const auto & replica_config_key : replica_keys)
|
for (const auto & replica_config_key : replica_keys)
|
||||||
{
|
{
|
||||||
/// There could be another elements in the same level in configuration file, like "password", "port"...
|
/// There could be another elements in the same level in configuration file, like "password", "port"...
|
||||||
if (startsWith(replica_config_key, "replica"))
|
if (startsWith(replica_config_key, "replica"))
|
||||||
{
|
{
|
||||||
std::string replica_name = config_name + "." + replica_config_key;
|
std::string replica_name = config_name_ + "." + replica_config_key;
|
||||||
|
|
||||||
int priority = config.getInt(replica_name + ".priority", 0);
|
int priority = config_.getInt(replica_name + ".priority", 0);
|
||||||
|
|
||||||
replicas_by_priority[priority].emplace_back(
|
replicas_by_priority[priority].emplace_back(
|
||||||
std::make_shared<Pool>(config, replica_name, default_connections, max_connections, config_name.c_str()));
|
std::make_shared<Pool>(config_, replica_name, default_connections_, max_connections_, config_name_.c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
replicas_by_priority[0].emplace_back(
|
replicas_by_priority[0].emplace_back(
|
||||||
std::make_shared<Pool>(config, config_name, default_connections, max_connections));
|
std::make_shared<Pool>(config_, config_name_, default_connections_, max_connections_));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolWithFailover::PoolWithFailover(const std::string & config_name, const unsigned default_connections,
|
PoolWithFailover::PoolWithFailover(const std::string & config_name_, const unsigned default_connections_,
|
||||||
const unsigned max_connections, const size_t max_tries)
|
const unsigned max_connections_, const size_t max_tries_)
|
||||||
: PoolWithFailover{
|
: PoolWithFailover{
|
||||||
Poco::Util::Application::instance().config(), config_name,
|
Poco::Util::Application::instance().config(), config_name_,
|
||||||
default_connections, max_connections, max_tries}
|
default_connections_, max_connections_, max_tries_}
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
PoolWithFailover::PoolWithFailover(const PoolWithFailover & other)
|
PoolWithFailover::PoolWithFailover(const PoolWithFailover & other)
|
||||||
: max_tries{other.max_tries}, config_name{other.config_name}, shareable{other.shareable}
|
: max_tries{other.max_tries}, shareable{other.shareable}
|
||||||
{
|
{
|
||||||
if (shareable)
|
if (shareable)
|
||||||
{
|
{
|
||||||
|
@ -77,7 +77,6 @@ namespace mysqlxx
|
|||||||
size_t max_tries;
|
size_t max_tries;
|
||||||
/// Mutex for set of replicas.
|
/// Mutex for set of replicas.
|
||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
std::string config_name;
|
|
||||||
|
|
||||||
/// Can the Pool be shared
|
/// Can the Pool be shared
|
||||||
bool shareable;
|
bool shareable;
|
||||||
@ -91,16 +90,16 @@ namespace mysqlxx
|
|||||||
* max_connections Maximum number of connections in pool to each replica.
|
* max_connections Maximum number of connections in pool to each replica.
|
||||||
* max_tries_ Max number of connection tries.
|
* max_tries_ Max number of connection tries.
|
||||||
*/
|
*/
|
||||||
PoolWithFailover(const std::string & config_name,
|
PoolWithFailover(const std::string & config_name_,
|
||||||
unsigned default_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
unsigned default_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
||||||
unsigned max_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
unsigned max_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
||||||
size_t max_tries = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES);
|
size_t max_tries_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES);
|
||||||
|
|
||||||
PoolWithFailover(const Poco::Util::AbstractConfiguration & config,
|
PoolWithFailover(const Poco::Util::AbstractConfiguration & config_,
|
||||||
const std::string & config_name,
|
const std::string & config_name_,
|
||||||
unsigned default_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
unsigned default_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
||||||
unsigned max_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
unsigned max_connections_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
||||||
size_t max_tries = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES);
|
size_t max_tries_ = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES);
|
||||||
|
|
||||||
PoolWithFailover(const PoolWithFailover & other);
|
PoolWithFailover(const PoolWithFailover & other);
|
||||||
|
|
||||||
|
@ -11,29 +11,23 @@
|
|||||||
namespace mysqlxx
|
namespace mysqlxx
|
||||||
{
|
{
|
||||||
|
|
||||||
Query::Query(Connection * conn_, const std::string & query_string) : std::ostream(nullptr), conn(conn_)
|
Query::Query(Connection * conn_, const std::string & query_string) : conn(conn_)
|
||||||
{
|
{
|
||||||
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
||||||
mysql_thread_init();
|
mysql_thread_init();
|
||||||
|
|
||||||
init(&query_buf);
|
|
||||||
|
|
||||||
if (!query_string.empty())
|
if (!query_string.empty())
|
||||||
{
|
query_buf << query_string;
|
||||||
query_buf.str(query_string);
|
|
||||||
seekp(0, std::ios::end);
|
|
||||||
}
|
|
||||||
|
|
||||||
imbue(std::locale::classic());
|
query_buf.imbue(std::locale::classic());
|
||||||
}
|
}
|
||||||
|
|
||||||
Query::Query(const Query & other) : std::ostream(nullptr), conn(other.conn)
|
Query::Query(const Query & other) : conn(other.conn)
|
||||||
{
|
{
|
||||||
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
/// Важно в случае, если Query используется не из того же потока, что Connection.
|
||||||
mysql_thread_init();
|
mysql_thread_init();
|
||||||
|
|
||||||
init(&query_buf);
|
query_buf.imbue(std::locale::classic());
|
||||||
imbue(std::locale::classic());
|
|
||||||
|
|
||||||
*this << other.str();
|
*this << other.str();
|
||||||
}
|
}
|
||||||
@ -45,9 +39,7 @@ Query & Query::operator= (const Query & other)
|
|||||||
|
|
||||||
conn = other.conn;
|
conn = other.conn;
|
||||||
|
|
||||||
seekp(0);
|
query_buf.str(other.str());
|
||||||
clear();
|
|
||||||
*this << other.str();
|
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -59,9 +51,7 @@ Query::~Query()
|
|||||||
|
|
||||||
void Query::reset()
|
void Query::reset()
|
||||||
{
|
{
|
||||||
seekp(0);
|
query_buf.str({});
|
||||||
clear();
|
|
||||||
query_buf.str("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Query::executeImpl()
|
void Query::executeImpl()
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <ostream>
|
|
||||||
|
|
||||||
#include <mysqlxx/UseQueryResult.h>
|
#include <mysqlxx/UseQueryResult.h>
|
||||||
#include <mysqlxx/StoreQueryResult.h>
|
#include <mysqlxx/StoreQueryResult.h>
|
||||||
@ -28,7 +27,7 @@ namespace mysqlxx
|
|||||||
*
|
*
|
||||||
* Внимание! Один объект запроса можно использовать только из одного потока.
|
* Внимание! Один объект запроса можно использовать только из одного потока.
|
||||||
*/
|
*/
|
||||||
class Query : public std::ostream
|
class Query
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Query(Connection * conn_, const std::string & query_string = "");
|
Query(Connection * conn_, const std::string & query_string = "");
|
||||||
@ -64,9 +63,21 @@ public:
|
|||||||
return query_buf.str();
|
return query_buf.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto rdbuf() const
|
||||||
|
{
|
||||||
|
return query_buf.rdbuf();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline Query & operator<< (T && x)
|
||||||
|
{
|
||||||
|
query_buf << std::forward<T>(x);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Connection * conn;
|
Connection * conn;
|
||||||
std::stringbuf query_buf;
|
std::ostringstream query_buf;
|
||||||
|
|
||||||
void executeImpl();
|
void executeImpl();
|
||||||
};
|
};
|
||||||
|
@ -22,11 +22,11 @@ class ResultBase
|
|||||||
public:
|
public:
|
||||||
ResultBase(MYSQL_RES * res_, Connection * conn_, const Query * query_);
|
ResultBase(MYSQL_RES * res_, Connection * conn_, const Query * query_);
|
||||||
|
|
||||||
Connection * getConnection() { return conn; }
|
Connection * getConnection() { return conn; }
|
||||||
MYSQL_FIELDS getFields() { return fields; }
|
MYSQL_FIELDS getFields() { return fields; }
|
||||||
unsigned getNumFields() { return num_fields; }
|
unsigned getNumFields() { return num_fields; }
|
||||||
MYSQL_RES * getRes() { return res; }
|
MYSQL_RES * getRes() { return res; }
|
||||||
const Query * getQuery() const { return query; }
|
const Query * getQuery() const { return query; }
|
||||||
|
|
||||||
virtual ~ResultBase();
|
virtual ~ResultBase();
|
||||||
|
|
||||||
|
@ -14,16 +14,15 @@ namespace mysqlxx
|
|||||||
StoreQueryResult::StoreQueryResult(MYSQL_RES * res_, Connection * conn_, const Query * query_) : ResultBase(res_, conn_, query_)
|
StoreQueryResult::StoreQueryResult(MYSQL_RES * res_, Connection * conn_, const Query * query_) : ResultBase(res_, conn_, query_)
|
||||||
{
|
{
|
||||||
UInt64 rows = mysql_num_rows(res);
|
UInt64 rows = mysql_num_rows(res);
|
||||||
UInt32 fields = getNumFields();
|
|
||||||
reserve(rows);
|
reserve(rows);
|
||||||
lengths.resize(rows * fields);
|
lengths.resize(rows * num_fields);
|
||||||
|
|
||||||
for (UInt64 i = 0; MYSQL_ROW row = mysql_fetch_row(res); ++i)
|
for (UInt64 i = 0; MYSQL_ROW row = mysql_fetch_row(res); ++i)
|
||||||
{
|
{
|
||||||
MYSQL_LENGTHS lengths_for_row = mysql_fetch_lengths(res);
|
MYSQL_LENGTHS lengths_for_row = mysql_fetch_lengths(res);
|
||||||
memcpy(&lengths[i * fields], lengths_for_row, sizeof(lengths[0]) * fields);
|
memcpy(&lengths[i * num_fields], lengths_for_row, sizeof(lengths[0]) * num_fields);
|
||||||
|
|
||||||
push_back(Row(row, this, &lengths[i * fields]));
|
push_back(Row(row, this, &lengths[i * num_fields]));
|
||||||
}
|
}
|
||||||
checkError(conn->getDriver());
|
checkError(conn->getDriver());
|
||||||
}
|
}
|
||||||
|
@ -68,10 +68,10 @@ int main(int, char **)
|
|||||||
Queries queries;
|
Queries queries;
|
||||||
queries.push_back(query);
|
queries.push_back(query);
|
||||||
|
|
||||||
for (auto & query : queries)
|
for (auto & q : queries)
|
||||||
{
|
{
|
||||||
std::cerr << query.str() << std::endl;
|
std::cerr << q.str() << std::endl;
|
||||||
std::cerr << query.store().at(0) << std::endl;
|
std::cerr << q.store().at(0) << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,147 +0,0 @@
|
|||||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
||||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
||||||
|
|
||||||
#.rst:
|
|
||||||
# FindMySQL
|
|
||||||
# -------
|
|
||||||
#
|
|
||||||
# Find ODBC Runtime
|
|
||||||
#
|
|
||||||
# This will define the following variables::
|
|
||||||
#
|
|
||||||
# ODBC_FOUND - True if the system has the libraries
|
|
||||||
# ODBC_INCLUDE_DIRS - where to find the headers
|
|
||||||
# ODBC_LIBRARIES - where to find the libraries
|
|
||||||
# ODBC_DEFINITIONS - compile definitons
|
|
||||||
#
|
|
||||||
# Hints:
|
|
||||||
# Set ``ODBC_ROOT_DIR`` to the root directory of an installation.
|
|
||||||
#
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_ODBC QUIET odbc)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
get_filename_component(kit_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot]" REALPATH)
|
|
||||||
get_filename_component(kit81_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot81]" REALPATH)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_path(ODBC_INCLUDE_DIR
|
|
||||||
NAMES sql.h
|
|
||||||
HINTS
|
|
||||||
${ODBC_ROOT_DIR}/include
|
|
||||||
${ODBC_ROOT_INCLUDE_DIRS}
|
|
||||||
PATHS
|
|
||||||
${PC_ODBC_INCLUDE_DIRS}
|
|
||||||
/usr/include
|
|
||||||
/usr/local/include
|
|
||||||
/usr/local/odbc/include
|
|
||||||
/usr/local/iodbc/include
|
|
||||||
"C:/Program Files/ODBC/include"
|
|
||||||
"C:/Program Files/Microsoft SDKs/Windows/v7.0/include"
|
|
||||||
"C:/Program Files/Microsoft SDKs/Windows/v6.0a/include"
|
|
||||||
"C:/ODBC/include"
|
|
||||||
"${kit_dir}/Include/um"
|
|
||||||
"${kit81_dir}/Include/um"
|
|
||||||
PATH_SUFFIXES
|
|
||||||
odbc
|
|
||||||
iodbc
|
|
||||||
DOC "Specify the directory containing sql.h."
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT ODBC_INCLUDE_DIR AND WIN32)
|
|
||||||
set(ODBC_INCLUDE_DIR "")
|
|
||||||
else()
|
|
||||||
set(REQUIRED_INCLUDE_DIR ODBC_INCLUDE_DIR)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
set(WIN_ARCH x64)
|
|
||||||
elseif(WIN32 AND CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
||||||
set(WIN_ARCH x86)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(ODBC_LIBRARY
|
|
||||||
NAMES unixodbc iodbc odbc odbc32
|
|
||||||
HINTS
|
|
||||||
${ODBC_ROOT_DIR}/lib
|
|
||||||
${ODBC_ROOT_LIBRARY_DIRS}
|
|
||||||
PATHS
|
|
||||||
${PC_ODBC_LIBRARY_DIRS}
|
|
||||||
/usr/lib
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/local/odbc/lib
|
|
||||||
/usr/local/iodbc/lib
|
|
||||||
"C:/Program Files/ODBC/lib"
|
|
||||||
"C:/ODBC/lib/debug"
|
|
||||||
"C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib"
|
|
||||||
"${kit81_dir}/Lib/winv6.3/um"
|
|
||||||
"${kit_dir}/Lib/win8/um"
|
|
||||||
PATH_SUFIXES
|
|
||||||
odbc
|
|
||||||
${WIN_ARCH}
|
|
||||||
DOC "Specify the ODBC driver manager library here."
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT ODBC_LIBRARY AND WIN32)
|
|
||||||
# List names of ODBC libraries on Windows
|
|
||||||
set(ODBC_LIBRARY odbc32.lib)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# List additional libraries required to use ODBC library
|
|
||||||
if(WIN32 AND MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
|
||||||
set(_odbc_required_libs_names odbccp32;ws2_32)
|
|
||||||
endif()
|
|
||||||
foreach(_lib_name IN LISTS _odbc_required_libs_names)
|
|
||||||
find_library(_lib_path
|
|
||||||
NAMES ${_lib_name}
|
|
||||||
HINTS
|
|
||||||
${ODBC_ROOT_DIR}/lib
|
|
||||||
${ODBC_ROOT_LIBRARY_DIRS}
|
|
||||||
PATHS
|
|
||||||
${PC_ODBC_LIBRARY_DIRS}
|
|
||||||
/usr/lib
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/local/odbc/lib
|
|
||||||
/usr/local/iodbc/lib
|
|
||||||
"C:/Program Files/ODBC/lib"
|
|
||||||
"C:/ODBC/lib/debug"
|
|
||||||
"C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib"
|
|
||||||
PATH_SUFFIXES
|
|
||||||
odbc
|
|
||||||
)
|
|
||||||
if (_lib_path)
|
|
||||||
list(APPEND _odbc_required_libs_paths ${_lib_path})
|
|
||||||
endif()
|
|
||||||
unset(_lib_path CACHE)
|
|
||||||
endforeach()
|
|
||||||
unset(_odbc_lib_paths)
|
|
||||||
unset(_odbc_required_libs_names)
|
|
||||||
|
|
||||||
|
|
||||||
find_package_handle_standard_args(ODBC
|
|
||||||
FOUND_VAR ODBC_FOUND
|
|
||||||
REQUIRED_VARS
|
|
||||||
ODBC_LIBRARY
|
|
||||||
${REQUIRED_INCLUDE_DIR}
|
|
||||||
VERSION_VAR ODBC_VERSION
|
|
||||||
)
|
|
||||||
|
|
||||||
if(ODBC_FOUND)
|
|
||||||
set(ODBC_LIBRARIES ${ODBC_LIBRARY} ${_odbc_required_libs_paths} ${LTDL_LIBRARY})
|
|
||||||
set(ODBC_INCLUDE_DIRS ${ODBC_INCLUDE_DIR})
|
|
||||||
set(ODBC_DEFINITIONS ${PC_ODBC_CFLAGS_OTHER})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ODBC_FOUND AND NOT TARGET ODBC::ODBC)
|
|
||||||
add_library(ODBC::ODBC UNKNOWN IMPORTED)
|
|
||||||
set_target_properties(ODBC::ODBC PROPERTIES
|
|
||||||
IMPORTED_LOCATION "${ODBC_LIBRARY}"
|
|
||||||
INTERFACE_LINK_LIBRARIES "${_odbc_required_libs_paths}"
|
|
||||||
INTERFACE_COMPILE_OPTIONS "${PC_ODBC_CFLAGS_OTHER}"
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${ODBC_INCLUDE_DIR}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(ODBC_LIBRARY ODBC_INCLUDE_DIR)
|
|
55
cmake/Modules/FindOpenLDAP.cmake
Normal file
55
cmake/Modules/FindOpenLDAP.cmake
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# Find OpenLDAP libraries.
|
||||||
|
#
|
||||||
|
# Can be configured with:
|
||||||
|
# OPENLDAP_ROOT_DIR - path to the OpenLDAP installation prefix
|
||||||
|
# OPENLDAP_USE_STATIC_LIBS - look for static version of the libraries
|
||||||
|
# OPENLDAP_USE_REENTRANT_LIBS - look for thread-safe version of the libraries
|
||||||
|
#
|
||||||
|
# Sets values of:
|
||||||
|
# OPENLDAP_FOUND - TRUE if found
|
||||||
|
# OPENLDAP_INCLUDE_DIR - path to the include directory
|
||||||
|
# OPENLDAP_LIBRARIES - paths to the libldap and liblber libraries
|
||||||
|
# OPENLDAP_LDAP_LIBRARY - paths to the libldap library
|
||||||
|
# OPENLDAP_LBER_LIBRARY - paths to the liblber library
|
||||||
|
#
|
||||||
|
|
||||||
|
if(OPENLDAP_USE_STATIC_LIBS)
|
||||||
|
set(_orig_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
if(WIN32)
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".a" ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
else()
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_r_suffix)
|
||||||
|
if(OPENLDAP_USE_REENTRANT_LIBS)
|
||||||
|
set(_r_suffix "_r")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OPENLDAP_ROOT_DIR)
|
||||||
|
find_path(OPENLDAP_INCLUDE_DIR NAMES "ldap.h" "lber.h" PATHS "${OPENLDAP_ROOT_DIR}" PATH_SUFFIXES "include" NO_DEFAULT_PATH)
|
||||||
|
find_library(OPENLDAP_LDAP_LIBRARY NAMES "ldap${_r_suffix}" PATHS "${OPENLDAP_ROOT_DIR}" PATH_SUFFIXES "lib" NO_DEFAULT_PATH)
|
||||||
|
find_library(OPENLDAP_LBER_LIBRARY NAMES "lber" PATHS "${OPENLDAP_ROOT_DIR}" PATH_SUFFIXES "lib" NO_DEFAULT_PATH)
|
||||||
|
else()
|
||||||
|
find_path(OPENLDAP_INCLUDE_DIR NAMES "ldap.h" "lber.h")
|
||||||
|
find_library(OPENLDAP_LDAP_LIBRARY NAMES "ldap${_r_suffix}")
|
||||||
|
find_library(OPENLDAP_LBER_LIBRARY NAMES "lber")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
unset(_r_suffix)
|
||||||
|
|
||||||
|
set(OPENLDAP_LIBRARIES ${OPENLDAP_LDAP_LIBRARY} ${OPENLDAP_LBER_LIBRARY})
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(
|
||||||
|
OpenLDAP DEFAULT_MSG
|
||||||
|
OPENLDAP_INCLUDE_DIR OPENLDAP_LDAP_LIBRARY OPENLDAP_LBER_LIBRARY
|
||||||
|
)
|
||||||
|
|
||||||
|
mark_as_advanced(OPENLDAP_INCLUDE_DIR OPENLDAP_LIBRARIES OPENLDAP_LDAP_LIBRARY OPENLDAP_LBER_LIBRARY)
|
||||||
|
|
||||||
|
if(OPENLDAP_USE_STATIC_LIBS)
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_orig_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
unset(_orig_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||||
|
endif()
|
@ -1,247 +0,0 @@
|
|||||||
# https://github.com/astahl/poco-cmake/blob/master/cmake/FindPoco.cmake
|
|
||||||
|
|
||||||
# - finds the Poco C++ libraries
|
|
||||||
# This module finds the Applied Informatics Poco libraries.
|
|
||||||
# It supports the following components:
|
|
||||||
#
|
|
||||||
# Util (loaded by default)
|
|
||||||
# Foundation (loaded by default)
|
|
||||||
# XML
|
|
||||||
# Zip
|
|
||||||
# Crypto
|
|
||||||
# Data
|
|
||||||
# Net
|
|
||||||
# NetSSL
|
|
||||||
# OSP
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# set(ENV{Poco_DIR} path/to/poco/sdk)
|
|
||||||
# find_package(Poco REQUIRED OSP Data Crypto)
|
|
||||||
#
|
|
||||||
# On completion, the script defines the following variables:
|
|
||||||
#
|
|
||||||
# - Compound variables:
|
|
||||||
# Poco_FOUND
|
|
||||||
# - true if all requested components were found.
|
|
||||||
# Poco_LIBRARIES
|
|
||||||
# - contains release (and debug if available) libraries for all requested components.
|
|
||||||
# It has the form "optimized LIB1 debug LIBd1 optimized LIB2 ...", ready for use with the target_link_libraries command.
|
|
||||||
# Poco_INCLUDE_DIRS
|
|
||||||
# - Contains include directories for all requested components.
|
|
||||||
#
|
|
||||||
# - Component variables:
|
|
||||||
# Poco_Xxx_FOUND
|
|
||||||
# - Where Xxx is the properly cased component name (eg. 'Util', 'OSP').
|
|
||||||
# True if a component's library or debug library was found successfully.
|
|
||||||
# Poco_Xxx_LIBRARY
|
|
||||||
# - Library for component Xxx.
|
|
||||||
# Poco_Xxx_LIBRARY_DEBUG
|
|
||||||
# - debug library for component Xxx
|
|
||||||
# Poco_Xxx_INCLUDE_DIR
|
|
||||||
# - include directory for component Xxx
|
|
||||||
#
|
|
||||||
# - OSP BundleCreator variables: (i.e. bundle.exe on windows, bundle on unix-likes)
|
|
||||||
# (is only discovered if OSP is a requested component)
|
|
||||||
# Poco_OSP_Bundle_EXECUTABLE_FOUND
|
|
||||||
# - true if the bundle-creator executable was found.
|
|
||||||
# Poco_OSP_Bundle_EXECUTABLE
|
|
||||||
# - the path to the bundle-creator executable.
|
|
||||||
#
|
|
||||||
# Author: Andreas Stahl andreas.stahl@tu-dresden.de
|
|
||||||
|
|
||||||
set(Poco_HINTS
|
|
||||||
/usr/local
|
|
||||||
/usr/local/include/Poco
|
|
||||||
C:/AppliedInformatics
|
|
||||||
${Poco_DIR}
|
|
||||||
$ENV{Poco_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT Poco_ROOT_DIR)
|
|
||||||
# look for the root directory, first for the source-tree variant
|
|
||||||
find_path(Poco_ROOT_DIR
|
|
||||||
NAMES Foundation/include/Poco/Poco.h
|
|
||||||
HINTS ${Poco_HINTS}
|
|
||||||
)
|
|
||||||
if(NOT Poco_ROOT_DIR)
|
|
||||||
# this means poco may have a different directory structure, maybe it was installed, let's check for that
|
|
||||||
message(STATUS "Looking for Poco install directory structure.")
|
|
||||||
find_path(Poco_ROOT_DIR
|
|
||||||
NAMES include/Poco/Poco.h
|
|
||||||
HINTS ${Poco_HINTS}
|
|
||||||
)
|
|
||||||
if(NOT Poco_ROOT_DIR)
|
|
||||||
# poco was still not found -> Fail
|
|
||||||
if(Poco_FIND_REQUIRED)
|
|
||||||
message(FATAL_ERROR "Poco: Could not find Poco install directory")
|
|
||||||
endif()
|
|
||||||
if(NOT Poco_FIND_QUIETLY)
|
|
||||||
message(STATUS "Poco: Could not find Poco install directory")
|
|
||||||
endif()
|
|
||||||
return()
|
|
||||||
else()
|
|
||||||
# poco was found with the make install directory structure
|
|
||||||
message(STATUS "Assuming Poco install directory structure at ${Poco_ROOT_DIR}.")
|
|
||||||
set(Poco_INSTALLED true)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# add dynamic library directory
|
|
||||||
if(WIN32)
|
|
||||||
find_path(Poco_RUNTIME_LIBRARY_DIRS
|
|
||||||
NAMES PocoFoundation.dll
|
|
||||||
HINTS ${Poco_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES
|
|
||||||
bin
|
|
||||||
lib
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# if installed directory structure, set full include dir
|
|
||||||
if(Poco_INSTALLED)
|
|
||||||
set(Poco_INCLUDE_DIRS ${Poco_ROOT_DIR}/include/ CACHE PATH "The global include path for Poco")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# append the default minimum components to the list to find
|
|
||||||
list(APPEND components
|
|
||||||
${Poco_FIND_COMPONENTS}
|
|
||||||
# default components:
|
|
||||||
"Util"
|
|
||||||
"Foundation"
|
|
||||||
)
|
|
||||||
list(REMOVE_DUPLICATES components) # remove duplicate defaults
|
|
||||||
|
|
||||||
foreach( component ${components} )
|
|
||||||
#if(NOT Poco_${component}_FOUND)
|
|
||||||
|
|
||||||
# include directory for the component
|
|
||||||
if(NOT Poco_${component}_INCLUDE_DIR)
|
|
||||||
set (component_alt "${component}")
|
|
||||||
set (component_root "${component}")
|
|
||||||
if (${component} STREQUAL "DataODBC")
|
|
||||||
set (component_top "Data")
|
|
||||||
set (component_in "ODBC")
|
|
||||||
set (component_root "Data/ODBC")
|
|
||||||
endif ()
|
|
||||||
if (${component} STREQUAL "SQLODBC")
|
|
||||||
set (component_top "SQL")
|
|
||||||
set (component_in "ODBC")
|
|
||||||
set (component_root "SQL/ODBC")
|
|
||||||
endif ()
|
|
||||||
if (${component} STREQUAL "NetSSL")
|
|
||||||
set (component_alt "Net")
|
|
||||||
set (component_root "NetSSL_OpenSSL")
|
|
||||||
endif ()
|
|
||||||
find_path(Poco_${component}_INCLUDE_DIR
|
|
||||||
NAMES
|
|
||||||
Poco/${component}.h # e.g. Foundation.h
|
|
||||||
Poco/${component}/${component}.h # e.g. OSP/OSP.h Util/Util.h
|
|
||||||
Poco/${component_alt}/${component}.h # e.g. Net/NetSSL.h
|
|
||||||
Poco/${component_top}/${component_in}/${component_in}.h # e.g. Data/ODBC/ODBC.h
|
|
||||||
HINTS
|
|
||||||
${Poco_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES
|
|
||||||
include
|
|
||||||
${component_root}/include
|
|
||||||
)
|
|
||||||
# message(STATUS "poco include debug: {component}: ${Poco_${component}_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
if(NOT Poco_${component}_INCLUDE_DIR)
|
|
||||||
message(WARNING "Poco_${component}_INCLUDE_DIR NOT FOUND")
|
|
||||||
else()
|
|
||||||
list(APPEND Poco_INCLUDE_DIRS ${Poco_${component}_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# release library
|
|
||||||
if(NOT Poco_${component}_LIBRARY)
|
|
||||||
find_library(
|
|
||||||
Poco_${component}_LIBRARY
|
|
||||||
NAMES Poco${component}
|
|
||||||
HINTS ${Poco_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES
|
|
||||||
lib
|
|
||||||
bin
|
|
||||||
)
|
|
||||||
if(Poco_${component}_LIBRARY)
|
|
||||||
message(STATUS "Found Poco ${component}: ${Poco_${component}_LIBRARY}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if(Poco_${component}_LIBRARY)
|
|
||||||
list(APPEND Poco_LIBRARIES "optimized" ${Poco_${component}_LIBRARY} )
|
|
||||||
mark_as_advanced(Poco_${component}_LIBRARY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# debug library
|
|
||||||
if(NOT Poco_${component}_LIBRARY_DEBUG)
|
|
||||||
find_library(
|
|
||||||
Poco_${component}_LIBRARY_DEBUG
|
|
||||||
Names Poco${component}d
|
|
||||||
HINTS ${Poco_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES
|
|
||||||
lib
|
|
||||||
bin
|
|
||||||
)
|
|
||||||
if(Poco_${component}_LIBRARY_DEBUG)
|
|
||||||
message(STATUS "Found Poco ${component} (debug): ${Poco_${component}_LIBRARY_DEBUG}")
|
|
||||||
endif()
|
|
||||||
endif(NOT Poco_${component}_LIBRARY_DEBUG)
|
|
||||||
if(Poco_${component}_LIBRARY_DEBUG)
|
|
||||||
list(APPEND Poco_LIBRARIES "debug" ${Poco_${component}_LIBRARY_DEBUG})
|
|
||||||
mark_as_advanced(Poco_${component}_LIBRARY_DEBUG)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# mark component as found or handle not finding it
|
|
||||||
if(Poco_${component}_LIBRARY_DEBUG OR Poco_${component}_LIBRARY)
|
|
||||||
set(Poco_${component}_FOUND TRUE)
|
|
||||||
elseif(NOT Poco_FIND_QUIETLY)
|
|
||||||
message(WARNING "Could not find Poco component ${component}!")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# message(STATUS "Poco component ${component}: Poco_${component}_LIBRARY : Poco_${component}_INCLUDE_DIR")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
if(Poco_DataODBC_LIBRARY)
|
|
||||||
list(APPEND Poco_DataODBC_LIBRARY ${ODBC_LIBRARIES} ${LTDL_LIBRARY})
|
|
||||||
list(APPEND Poco_INCLUDE_DIRS ${ODBC_INCLUDE_DIRS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(Poco_SQLODBC_LIBRARY)
|
|
||||||
list(APPEND Poco_SQLODBC_LIBRARY ${ODBC_LIBRARIES} ${LTDL_LIBRARY})
|
|
||||||
list(APPEND Poco_INCLUDE_DIRS ${ODBC_INCLUDE_DIRS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(Poco_NetSSL_LIBRARY)
|
|
||||||
list(APPEND Poco_NetSSL_LIBRARY ${OPENSSL_LIBRARIES})
|
|
||||||
list(APPEND Poco_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(DEFINED Poco_LIBRARIES)
|
|
||||||
set(Poco_FOUND true)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(${Poco_OSP_FOUND})
|
|
||||||
# find the osp bundle program
|
|
||||||
find_program(
|
|
||||||
Poco_OSP_Bundle_EXECUTABLE
|
|
||||||
NAMES bundle
|
|
||||||
HINTS
|
|
||||||
${Poco_RUNTIME_LIBRARY_DIRS}
|
|
||||||
${Poco_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES
|
|
||||||
bin
|
|
||||||
OSP/BundleCreator/bin/Darwin/x86_64
|
|
||||||
OSP/BundleCreator/bin/Darwin/i386
|
|
||||||
DOC "The executable that bundles OSP packages according to a .bndlspec specification."
|
|
||||||
)
|
|
||||||
if(Poco_OSP_Bundle_EXECUTABLE)
|
|
||||||
set(Poco_OSP_Bundle_EXECUTABLE_FOUND true)
|
|
||||||
endif()
|
|
||||||
# include bundle script file
|
|
||||||
find_file(Poco_OSP_Bundles_file NAMES PocoBundles.cmake HINTS ${CMAKE_MODULE_PATH})
|
|
||||||
if(${Poco_OSP_Bundles_file})
|
|
||||||
include(${Poco_OSP_Bundles_file})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "Found Poco: ${Poco_LIBRARIES}")
|
|
@ -1,32 +0,0 @@
|
|||||||
# ARM: Cannot cpuid_get_raw_data: CPUID instruction is not supported
|
|
||||||
if (NOT ARCH_ARM)
|
|
||||||
option (USE_INTERNAL_CPUID_LIBRARY "Set to FALSE to use system cpuid library instead of bundled" ${NOT_UNBUNDLED})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (USE_INTERNAL_CPUID_LIBRARY AND NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/libcpuid/CMakeLists.txt")
|
|
||||||
message (WARNING "submodule contrib/libcpuid is missing. to fix try run: \n git submodule update --init --recursive")
|
|
||||||
set (USE_INTERNAL_CPUID_LIBRARY 0)
|
|
||||||
set (MISSING_INTERNAL_CPUID_LIBRARY 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT USE_INTERNAL_CPUID_LIBRARY)
|
|
||||||
find_library (CPUID_LIBRARY cpuid)
|
|
||||||
find_path (CPUID_INCLUDE_DIR NAMES libcpuid/libcpuid.h PATHS ${CPUID_INCLUDE_PATHS})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (CPUID_LIBRARY AND CPUID_INCLUDE_DIR)
|
|
||||||
if (OS_FREEBSD)
|
|
||||||
# need in /usr/local/include/libcpuid/libcpuid_types.h
|
|
||||||
# Freebsd: /usr/local/include/libcpuid/libcpuid_types.h:61:29: error: conflicting declaration 'typedef long long int int64_t'
|
|
||||||
add_definitions(-DHAVE_STDINT_H)
|
|
||||||
# TODO: make virtual target cpuid:cpuid with COMPILE_DEFINITIONS property
|
|
||||||
endif ()
|
|
||||||
set (USE_CPUID 1)
|
|
||||||
elseif (NOT ARCH_ARM AND NOT MISSING_INTERNAL_CPUID_LIBRARY)
|
|
||||||
set (CPUID_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/libcpuid/include)
|
|
||||||
set (USE_INTERNAL_CPUID_LIBRARY 1)
|
|
||||||
set (CPUID_LIBRARY cpuid)
|
|
||||||
set (USE_CPUID 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
message (STATUS "Using cpuid=${USE_CPUID}: ${CPUID_INCLUDE_DIR} : ${CPUID_LIBRARY}")
|
|
@ -1,24 +0,0 @@
|
|||||||
option(USE_INTERNAL_CPUINFO_LIBRARY "Set to FALSE to use system cpuinfo library instead of bundled" ${NOT_UNBUNDLED})
|
|
||||||
|
|
||||||
# Now we have no contrib/libcpuinfo, use from system.
|
|
||||||
if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/libcpuinfo/include")
|
|
||||||
#message (WARNING "submodule contrib/libcpuinfo is missing. to fix try run: \n git submodule update --init --recursive")
|
|
||||||
set (USE_INTERNAL_CPUINFO_LIBRARY 0)
|
|
||||||
set (MISSING_INTERNAL_CPUINFO_LIBRARY 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if(NOT USE_INTERNAL_CPUINFO_LIBRARY)
|
|
||||||
find_library(CPUINFO_LIBRARY cpuinfo)
|
|
||||||
find_path(CPUINFO_INCLUDE_DIR NAMES cpuinfo.h PATHS ${CPUINFO_INCLUDE_PATHS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CPUINFO_LIBRARY AND CPUINFO_INCLUDE_DIR)
|
|
||||||
set(USE_CPUINFO 1)
|
|
||||||
elseif(NOT MISSING_INTERNAL_CPUINFO_LIBRARY)
|
|
||||||
set(CPUINFO_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/libcpuinfo/include)
|
|
||||||
set(USE_INTERNAL_CPUINFO_LIBRARY 1)
|
|
||||||
set(CPUINFO_LIBRARY cpuinfo)
|
|
||||||
set(USE_CPUINFO 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "Using cpuinfo=${USE_CPUINFO}: ${CPUINFO_INCLUDE_DIR} : ${CPUINFO_LIBRARY}")
|
|
76
cmake/find/ldap.cmake
Normal file
76
cmake/find/ldap.cmake
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
option (ENABLE_LDAP "Enable LDAP" ${ENABLE_LIBRARIES})
|
||||||
|
|
||||||
|
if (ENABLE_LDAP)
|
||||||
|
option (USE_INTERNAL_LDAP_LIBRARY "Set to FALSE to use system *LDAP library instead of bundled" ${NOT_UNBUNDLED})
|
||||||
|
|
||||||
|
if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/openldap/README")
|
||||||
|
if (USE_INTERNAL_LDAP_LIBRARY)
|
||||||
|
message (WARNING "Submodule contrib/openldap is missing. To fix try running:\n git submodule update --init --recursive")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set (USE_INTERNAL_LDAP_LIBRARY 0)
|
||||||
|
set (MISSING_INTERNAL_LDAP_LIBRARY 1)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set (OPENLDAP_USE_STATIC_LIBS ${USE_STATIC_LIBRARIES})
|
||||||
|
set (OPENLDAP_USE_REENTRANT_LIBS 1)
|
||||||
|
|
||||||
|
if (NOT USE_INTERNAL_LDAP_LIBRARY)
|
||||||
|
if (APPLE AND NOT OPENLDAP_ROOT_DIR)
|
||||||
|
set (OPENLDAP_ROOT_DIR "/usr/local/opt/openldap")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
find_package (OpenLDAP)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT OPENLDAP_FOUND AND NOT MISSING_INTERNAL_LDAP_LIBRARY)
|
||||||
|
string (TOLOWER "${CMAKE_SYSTEM_NAME}" _system_name)
|
||||||
|
string (TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _system_processor)
|
||||||
|
|
||||||
|
if (
|
||||||
|
"${_system_processor}" STREQUAL "amd64" OR
|
||||||
|
"${_system_processor}" STREQUAL "x64"
|
||||||
|
)
|
||||||
|
set (_system_processor "x86_64")
|
||||||
|
elseif (
|
||||||
|
"${_system_processor}" STREQUAL "arm64"
|
||||||
|
)
|
||||||
|
set (_system_processor "aarch64")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (
|
||||||
|
( "${_system_name}" STREQUAL "linux" AND "${_system_processor}" STREQUAL "x86_64" ) OR
|
||||||
|
( "${_system_name}" STREQUAL "linux" AND "${_system_processor}" STREQUAL "aarch64" ) OR
|
||||||
|
( "${_system_name}" STREQUAL "freebsd" AND "${_system_processor}" STREQUAL "x86_64" ) OR
|
||||||
|
( "${_system_name}" STREQUAL "darwin" AND "${_system_processor}" STREQUAL "x86_64" )
|
||||||
|
)
|
||||||
|
set (_ldap_supported_platform TRUE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT _ldap_supported_platform)
|
||||||
|
message (WARNING "LDAP support using the bundled library is not implemented for ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_PROCESSOR} platform.")
|
||||||
|
elseif (NOT USE_SSL)
|
||||||
|
message (WARNING "LDAP support using the bundled library is not possible if SSL is not used.")
|
||||||
|
else ()
|
||||||
|
set (USE_INTERNAL_LDAP_LIBRARY 1)
|
||||||
|
set (OPENLDAP_ROOT_DIR "${ClickHouse_SOURCE_DIR}/contrib/openldap")
|
||||||
|
set (OPENLDAP_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/openldap/include")
|
||||||
|
# Below, 'ldap'/'ldap_r' and 'lber' will be resolved to
|
||||||
|
# the targets defined in contrib/openldap-cmake/CMakeLists.txt
|
||||||
|
if (OPENLDAP_USE_REENTRANT_LIBS)
|
||||||
|
set (OPENLDAP_LDAP_LIBRARY "ldap_r")
|
||||||
|
else ()
|
||||||
|
set (OPENLDAP_LDAP_LIBRARY "ldap")
|
||||||
|
endif()
|
||||||
|
set (OPENLDAP_LBER_LIBRARY "lber")
|
||||||
|
set (OPENLDAP_LIBRARIES ${OPENLDAP_LDAP_LIBRARY} ${OPENLDAP_LBER_LIBRARY})
|
||||||
|
set (OPENLDAP_FOUND 1)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (OPENLDAP_FOUND)
|
||||||
|
set (USE_LDAP 1)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
message (STATUS "Using ldap=${USE_LDAP}: ${OPENLDAP_INCLUDE_DIR} : ${OPENLDAP_LIBRARIES}")
|
@ -1,37 +0,0 @@
|
|||||||
# This file copied from contrib/poco/cmake/FindODBC.cmake to allow build without submodules
|
|
||||||
|
|
||||||
if(OS_LINUX)
|
|
||||||
option (ENABLE_ODBC "Enable ODBC" ${ENABLE_LIBRARIES})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ENABLE_ODBC)
|
|
||||||
if (OS_LINUX)
|
|
||||||
option(USE_INTERNAL_ODBC_LIBRARY "Set to FALSE to use system odbc library instead of bundled" ${NOT_UNBUNDLED})
|
|
||||||
else ()
|
|
||||||
option(USE_INTERNAL_ODBC_LIBRARY "Set to FALSE to use system odbc library instead of bundled" OFF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(USE_INTERNAL_ODBC_LIBRARY AND NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/unixodbc/README")
|
|
||||||
message(WARNING "submodule contrib/unixodbc is missing. to fix try run: \n git submodule update --init --recursive")
|
|
||||||
set(USE_INTERNAL_ODBC_LIBRARY 0)
|
|
||||||
set(MISSING_INTERNAL_ODBC_LIBRARY 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(ODBC_INCLUDE_DIRS ) # Include directories will be either used automatically by target_include_directories or set later.
|
|
||||||
if(USE_INTERNAL_ODBC_LIBRARY AND NOT MISSING_INTERNAL_ODBC_LIBRARY)
|
|
||||||
set(ODBC_LIBRARY unixodbc)
|
|
||||||
set(ODBC_LIBRARIES ${ODBC_LIBRARY})
|
|
||||||
set(ODBC_INCLUDE_DIRS "${ClickHouse_SOURCE_DIR}/contrib/unixodbc/include")
|
|
||||||
set(ODBC_FOUND 1)
|
|
||||||
else()
|
|
||||||
find_package(ODBC)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if(ODBC_FOUND)
|
|
||||||
set(USE_ODBC 1)
|
|
||||||
set(ODBC_INCLUDE_DIRECTORIES ${ODBC_INCLUDE_DIRS}) # for old poco
|
|
||||||
set(ODBC_INCLUDE_DIR ${ODBC_INCLUDE_DIRS}) # for old poco
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "Using odbc=${USE_ODBC}: ${ODBC_INCLUDE_DIRS} : ${ODBC_LIBRARIES}")
|
|
||||||
endif()
|
|
17
cmake/find/opencl.cmake
Normal file
17
cmake/find/opencl.cmake
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
if(ENABLE_OPENCL)
|
||||||
|
|
||||||
|
# Intel OpenCl driver: sudo apt install intel-opencl-icd
|
||||||
|
# TODO It's possible to add it as submodules: https://github.com/intel/compute-runtime/releases
|
||||||
|
|
||||||
|
# OpenCL applications should link wiht ICD loader
|
||||||
|
# sudo apt install opencl-headers ocl-icd-libopencl1
|
||||||
|
# sudo ln -s /usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0 /usr/lib/libOpenCL.so
|
||||||
|
|
||||||
|
find_package(OpenCL REQUIRED)
|
||||||
|
if(OpenCL_FOUND)
|
||||||
|
set(USE_OPENCL 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Using opencl=${USE_OPENCL}: ${OpenCL_INCLUDE_DIRS} : ${OpenCL_LIBRARIES}")
|
@ -70,6 +70,7 @@ elseif(NOT MISSING_INTERNAL_PARQUET_LIBRARY AND NOT OS_FREEBSD)
|
|||||||
|
|
||||||
set(USE_PARQUET 1)
|
set(USE_PARQUET 1)
|
||||||
set(USE_ORC 1)
|
set(USE_ORC 1)
|
||||||
|
set(USE_ARROW 1)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -1,178 +0,0 @@
|
|||||||
option (USE_INTERNAL_POCO_LIBRARY "Set to FALSE to use system poco library instead of bundled" ${NOT_UNBUNDLED})
|
|
||||||
|
|
||||||
if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/poco/CMakeLists.txt")
|
|
||||||
if (USE_INTERNAL_POCO_LIBRARY)
|
|
||||||
message (WARNING "submodule contrib/poco is missing. to fix try run: \n git submodule update --init --recursive")
|
|
||||||
endif ()
|
|
||||||
set (USE_INTERNAL_POCO_LIBRARY 0)
|
|
||||||
set (MISSING_INTERNAL_POCO_LIBRARY 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT ENABLE_LIBRARIES)
|
|
||||||
set (ENABLE_POCO_NETSSL ${ENABLE_LIBRARIES} CACHE BOOL "")
|
|
||||||
set (ENABLE_POCO_MONGODB ${ENABLE_LIBRARIES} CACHE BOOL "")
|
|
||||||
set (ENABLE_POCO_REDIS ${ENABLE_LIBRARIES} CACHE BOOL "")
|
|
||||||
set (ENABLE_POCO_ODBC ${ENABLE_LIBRARIES} CACHE BOOL "")
|
|
||||||
set (ENABLE_POCO_SQL ${ENABLE_LIBRARIES} CACHE BOOL "")
|
|
||||||
set (ENABLE_POCO_JSON ${ENABLE_LIBRARIES} CACHE BOOL "")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set (POCO_COMPONENTS Net XML SQL Data)
|
|
||||||
if (NOT DEFINED ENABLE_POCO_NETSSL OR ENABLE_POCO_NETSSL)
|
|
||||||
list (APPEND POCO_COMPONENTS Crypto NetSSL)
|
|
||||||
endif ()
|
|
||||||
if (NOT DEFINED ENABLE_POCO_MONGODB OR ENABLE_POCO_MONGODB)
|
|
||||||
set(ENABLE_POCO_MONGODB 1 CACHE BOOL "")
|
|
||||||
list (APPEND POCO_COMPONENTS MongoDB)
|
|
||||||
else ()
|
|
||||||
set(ENABLE_POCO_MONGODB 0 CACHE BOOL "")
|
|
||||||
endif ()
|
|
||||||
if (NOT DEFINED ENABLE_POCO_REDIS OR ENABLE_POCO_REDIS)
|
|
||||||
list (APPEND POCO_COMPONENTS Redis)
|
|
||||||
endif ()
|
|
||||||
# TODO: after new poco release with SQL library rename ENABLE_POCO_ODBC -> ENABLE_POCO_SQLODBC
|
|
||||||
if (NOT DEFINED ENABLE_POCO_ODBC OR ENABLE_POCO_ODBC)
|
|
||||||
list (APPEND POCO_COMPONENTS DataODBC)
|
|
||||||
list (APPEND POCO_COMPONENTS SQLODBC)
|
|
||||||
endif ()
|
|
||||||
if (NOT DEFINED ENABLE_POCO_JSON OR ENABLE_POCO_JSON)
|
|
||||||
list (APPEND POCO_COMPONENTS JSON)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT USE_INTERNAL_POCO_LIBRARY)
|
|
||||||
find_package (Poco COMPONENTS ${POCO_COMPONENTS})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (Poco_INCLUDE_DIRS AND Poco_Foundation_LIBRARY)
|
|
||||||
elseif (NOT MISSING_INTERNAL_POCO_LIBRARY)
|
|
||||||
set (USE_INTERNAL_POCO_LIBRARY 1)
|
|
||||||
|
|
||||||
set (ENABLE_ZIP 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_PAGECOMPILER 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_PAGECOMPILER_FILE2PAGE 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_DATA_SQLITE 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_DATA_MYSQL 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_DATA_POSTGRESQL 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_ENCODINGS 0 CACHE BOOL "")
|
|
||||||
set (ENABLE_MONGODB ${ENABLE_POCO_MONGODB} CACHE BOOL "" FORCE)
|
|
||||||
|
|
||||||
# new after 2.0.0:
|
|
||||||
set (POCO_ENABLE_ZIP 0 CACHE BOOL "")
|
|
||||||
set (POCO_ENABLE_PAGECOMPILER 0 CACHE BOOL "")
|
|
||||||
set (POCO_ENABLE_PAGECOMPILER_FILE2PAGE 0 CACHE BOOL "")
|
|
||||||
set (POCO_ENABLE_SQL_SQLITE 0 CACHE BOOL "")
|
|
||||||
set (POCO_ENABLE_SQL_MYSQL 0 CACHE BOOL "")
|
|
||||||
set (POCO_ENABLE_SQL_POSTGRESQL 0 CACHE BOOL "")
|
|
||||||
|
|
||||||
set (POCO_UNBUNDLED 1 CACHE BOOL "")
|
|
||||||
set (POCO_UNBUNDLED_PCRE 0 CACHE BOOL "")
|
|
||||||
set (POCO_UNBUNDLED_EXPAT 0 CACHE BOOL "")
|
|
||||||
set (POCO_STATIC ${MAKE_STATIC_LIBRARIES} CACHE BOOL "")
|
|
||||||
set (POCO_VERBOSE_MESSAGES 1 CACHE BOOL "")
|
|
||||||
|
|
||||||
|
|
||||||
# used in internal compiler
|
|
||||||
list (APPEND Poco_INCLUDE_DIRS
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/Foundation/include/"
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/Util/include/"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (ENABLE_POCO_MONGODB)
|
|
||||||
set (Poco_MongoDB_LIBRARY PocoMongoDB)
|
|
||||||
set (Poco_MongoDB_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/poco/MongoDB/include/")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT DEFINED ENABLE_POCO_REDIS OR ENABLE_POCO_REDIS)
|
|
||||||
set (Poco_Redis_LIBRARY PocoRedis)
|
|
||||||
set (Poco_Redis_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/poco/Redis/include/")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (EXISTS "${ClickHouse_SOURCE_DIR}/contrib/poco/SQL/ODBC/include/")
|
|
||||||
set (Poco_SQL_FOUND 1)
|
|
||||||
set (Poco_SQL_LIBRARY PocoSQL)
|
|
||||||
set (Poco_SQL_INCLUDE_DIR
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/SQL/include"
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/Data/include"
|
|
||||||
)
|
|
||||||
if ((NOT DEFINED POCO_ENABLE_SQL_ODBC OR POCO_ENABLE_SQL_ODBC) AND ODBC_FOUND)
|
|
||||||
set (Poco_SQLODBC_INCLUDE_DIR
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/SQL/ODBC/include/"
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/Data/ODBC/include/"
|
|
||||||
${ODBC_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
set (Poco_SQLODBC_LIBRARY PocoSQLODBC ${ODBC_LIBRARIES} ${LTDL_LIBRARY})
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
set (Poco_Data_FOUND 1)
|
|
||||||
set (Poco_Data_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/poco/Data/include")
|
|
||||||
set (Poco_Data_LIBRARY PocoData)
|
|
||||||
if ((NOT DEFINED ENABLE_DATA_ODBC OR ENABLE_DATA_ODBC) AND ODBC_FOUND)
|
|
||||||
set (USE_POCO_DATAODBC 1)
|
|
||||||
set (Poco_DataODBC_INCLUDE_DIR
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/poco/Data/ODBC/include/"
|
|
||||||
${ODBC_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
set (Poco_DataODBC_LIBRARY PocoDataODBC ${ODBC_LIBRARIES} ${LTDL_LIBRARY})
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT DEFINED ENABLE_POCO_JSON OR ENABLE_POCO_JSON)
|
|
||||||
set (Poco_JSON_LIBRARY PocoJSON)
|
|
||||||
set (Poco_JSON_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/poco/JSON/include/")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (OPENSSL_FOUND AND (NOT DEFINED ENABLE_POCO_NETSSL OR ENABLE_POCO_NETSSL))
|
|
||||||
set (Poco_NetSSL_LIBRARY PocoNetSSL ${OPENSSL_LIBRARIES})
|
|
||||||
set (Poco_Crypto_LIBRARY PocoCrypto ${OPENSSL_LIBRARIES})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (USE_STATIC_LIBRARIES AND USE_INTERNAL_ZLIB_LIBRARY)
|
|
||||||
list (APPEND Poco_INCLUDE_DIRS
|
|
||||||
"${ClickHouse_SOURCE_DIR}/contrib/${INTERNAL_ZLIB_NAME}/"
|
|
||||||
"${ClickHouse_BINARY_DIR}/contrib/${INTERNAL_ZLIB_NAME}/"
|
|
||||||
)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set (Poco_Foundation_LIBRARY PocoFoundation)
|
|
||||||
set (Poco_Util_LIBRARY PocoUtil)
|
|
||||||
set (Poco_Net_LIBRARY PocoNet)
|
|
||||||
set (Poco_XML_LIBRARY PocoXML)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (Poco_NetSSL_LIBRARY AND Poco_Crypto_LIBRARY)
|
|
||||||
set (USE_POCO_NETSSL 1)
|
|
||||||
endif ()
|
|
||||||
if (Poco_MongoDB_LIBRARY)
|
|
||||||
set (USE_POCO_MONGODB 1)
|
|
||||||
endif ()
|
|
||||||
if (Poco_Redis_LIBRARY)
|
|
||||||
set (USE_POCO_REDIS 1)
|
|
||||||
endif ()
|
|
||||||
if (Poco_DataODBC_LIBRARY AND ODBC_FOUND)
|
|
||||||
set (USE_POCO_DATAODBC 1)
|
|
||||||
endif ()
|
|
||||||
if (Poco_SQLODBC_LIBRARY AND ODBC_FOUND)
|
|
||||||
set (USE_POCO_SQLODBC 1)
|
|
||||||
endif ()
|
|
||||||
if (Poco_JSON_LIBRARY)
|
|
||||||
set (USE_POCO_JSON 1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
message(STATUS "Using Poco: ${Poco_INCLUDE_DIRS} : ${Poco_Foundation_LIBRARY},${Poco_Util_LIBRARY},${Poco_Net_LIBRARY},${Poco_NetSSL_LIBRARY},${Poco_Crypto_LIBRARY},${Poco_XML_LIBRARY},${Poco_Data_LIBRARY},${Poco_DataODBC_LIBRARY},${Poco_SQL_LIBRARY},${Poco_SQLODBC_LIBRARY},${Poco_MongoDB_LIBRARY},${Poco_Redis_LIBRARY},${Poco_JSON_LIBRARY}; MongoDB=${USE_POCO_MONGODB}, Redis=${USE_POCO_REDIS}, DataODBC=${USE_POCO_DATAODBC}, NetSSL=${USE_POCO_NETSSL}, JSON=${USE_POCO_JSON}")
|
|
||||||
|
|
||||||
# How to make sutable poco:
|
|
||||||
# use branch:
|
|
||||||
# develop OR poco-1.7.9-release + 6a49c94d18c654d7a20b8c8ea47071b1fdd4813b
|
|
||||||
# and merge:
|
|
||||||
# ClickHouse-Extras/clickhouse_unbundled
|
|
||||||
# ClickHouse-Extras/clickhouse_unbundled_zlib
|
|
||||||
# ClickHouse-Extras/clickhouse_task
|
|
||||||
# ClickHouse-Extras/clickhouse_misc
|
|
||||||
# ClickHouse-Extras/clickhouse_anl
|
|
||||||
# ClickHouse-Extras/clickhouse_http_header https://github.com/pocoproject/poco/pull/1574
|
|
||||||
# ClickHouse-Extras/clickhouse_socket
|
|
||||||
# ClickHouse-Extras/clickhouse_warning
|
|
||||||
# ClickHouse-Extras/clickhouse-purge-logs-on-no-space
|
|
||||||
# ClickHouse-Extras/clickhouse_freebsd
|
|
||||||
# ClickHouse-Extras/clikhouse_no_zlib
|
|
||||||
# ClickHouse-Extras/clickhouse-fix-atomic
|
|
@ -27,7 +27,7 @@ elseif(NOT MISSING_INTERNAL_PROTOBUF_LIBRARY)
|
|||||||
set(Protobuf_PROTOC_LIBRARY libprotoc)
|
set(Protobuf_PROTOC_LIBRARY libprotoc)
|
||||||
set(Protobuf_LITE_LIBRARY libprotobuf-lite)
|
set(Protobuf_LITE_LIBRARY libprotobuf-lite)
|
||||||
|
|
||||||
set(Protobuf_PROTOC_EXECUTABLE ${ClickHouse_BINARY_DIR}/contrib/protobuf/cmake/protoc)
|
set(Protobuf_PROTOC_EXECUTABLE "$<TARGET_FILE:protoc>")
|
||||||
|
|
||||||
if(NOT DEFINED PROTOBUF_GENERATE_CPP_APPEND_PATH)
|
if(NOT DEFINED PROTOBUF_GENERATE_CPP_APPEND_PATH)
|
||||||
set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE)
|
set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE)
|
||||||
|
@ -7,6 +7,9 @@ set (CMAKE_SYSROOT "${CMAKE_CURRENT_LIST_DIR}/../toolchain/freebsd-x86_64")
|
|||||||
|
|
||||||
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # disable linkage check - it doesn't work in CMake
|
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # disable linkage check - it doesn't work in CMake
|
||||||
|
|
||||||
|
set (CMAKE_AR "/usr/bin/ar" CACHE FILEPATH "" FORCE)
|
||||||
|
set (CMAKE_RANLIB "/usr/bin/ranlib" CACHE FILEPATH "" FORCE)
|
||||||
|
|
||||||
set (LINKER_NAME "lld" CACHE STRING "" FORCE)
|
set (LINKER_NAME "lld" CACHE STRING "" FORCE)
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
||||||
|
@ -21,7 +21,7 @@ set(CMAKE_C_STANDARD_LIBRARIES ${DEFAULT_LIBS})
|
|||||||
# glibc-compatibility library relies to fixed version of libc headers
|
# glibc-compatibility library relies to fixed version of libc headers
|
||||||
# (because minor changes in function attributes between different glibc versions will introduce incompatibilities)
|
# (because minor changes in function attributes between different glibc versions will introduce incompatibilities)
|
||||||
# This is for x86_64. For other architectures we have separate toolchains.
|
# This is for x86_64. For other architectures we have separate toolchains.
|
||||||
if (ARCH_AMD64)
|
if (ARCH_AMD64 AND NOT_UNBUNDLED)
|
||||||
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${ClickHouse_SOURCE_DIR}/contrib/libc-headers/x86_64-linux-gnu ${ClickHouse_SOURCE_DIR}/contrib/libc-headers)
|
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${ClickHouse_SOURCE_DIR}/contrib/libc-headers/x86_64-linux-gnu ${ClickHouse_SOURCE_DIR}/contrib/libc-headers)
|
||||||
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${ClickHouse_SOURCE_DIR}/contrib/libc-headers/x86_64-linux-gnu ${ClickHouse_SOURCE_DIR}/contrib/libc-headers)
|
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${ClickHouse_SOURCE_DIR}/contrib/libc-headers/x86_64-linux-gnu ${ClickHouse_SOURCE_DIR}/contrib/libc-headers)
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -26,10 +26,6 @@ if (TARGET ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
|||||||
list(APPEND dirs ${dirs1})
|
list(APPEND dirs ${dirs1})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (USE_INTERNAL_POCO_LIBRARY)
|
|
||||||
list(APPEND dirs "./contrib/poco/Foundation/include")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
list(REMOVE_DUPLICATES dirs)
|
list(REMOVE_DUPLICATES dirs)
|
||||||
file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/include_directories.txt "")
|
file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/include_directories.txt "")
|
||||||
foreach (dir ${dirs})
|
foreach (dir ${dirs})
|
||||||
|
@ -36,8 +36,10 @@ if (SANITIZE)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
elseif (SANITIZE STREQUAL "thread")
|
elseif (SANITIZE STREQUAL "thread")
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} -fsanitize=thread")
|
set (TSAN_FLAGS "-fsanitize=thread -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/tests/tsan_suppressions.txt")
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} -fsanitize=thread")
|
|
||||||
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SAN_FLAGS} ${TSAN_FLAGS}")
|
||||||
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SAN_FLAGS} ${TSAN_FLAGS}")
|
||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
|
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
|
||||||
endif()
|
endif()
|
||||||
|
@ -27,6 +27,7 @@ if (CMAKE_CROSSCOMPILING)
|
|||||||
elseif (OS_FREEBSD)
|
elseif (OS_FREEBSD)
|
||||||
# FIXME: broken dependencies
|
# FIXME: broken dependencies
|
||||||
set (ENABLE_PROTOBUF OFF CACHE INTERNAL "")
|
set (ENABLE_PROTOBUF OFF CACHE INTERNAL "")
|
||||||
|
set (ENABLE_EMBEDDED_COMPILER OFF CACHE INTERNAL "")
|
||||||
else ()
|
else ()
|
||||||
message (FATAL_ERROR "Trying to cross-compile to unsupported system: ${CMAKE_SYSTEM_NAME}!")
|
message (FATAL_ERROR "Trying to cross-compile to unsupported system: ${CMAKE_SYSTEM_NAME}!")
|
||||||
endif ()
|
endif ()
|
||||||
|
2
cmake/toolchain/freebsd-x86_64/README.txt
Normal file
2
cmake/toolchain/freebsd-x86_64/README.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
wget https://clickhouse-datasets.s3.yandex.net/toolchains/toolchains/freebsd-11.3-toolchain.tar.xz
|
||||||
|
tar xJf freebsd-11.3-toolchain.tar.xz --strip-components=1
|
@ -1,6 +1,8 @@
|
|||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
set (COMPILER_GCC 1)
|
set (COMPILER_GCC 1)
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|AppleClang")
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "AppleClang")
|
||||||
|
set (COMPILER_CLANG 1) # Safe to treat AppleClang as a regular Clang, in general.
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
set (COMPILER_CLANG 1)
|
set (COMPILER_CLANG 1)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
@ -11,10 +13,25 @@ if (COMPILER_GCC)
|
|||||||
message (FATAL_ERROR "GCC version must be at least ${GCC_MINIMUM_VERSION}. For example, if GCC ${GCC_MINIMUM_VERSION} is available under gcc-${GCC_MINIMUM_VERSION}, g++-${GCC_MINIMUM_VERSION} names, do the following: export CC=gcc-${GCC_MINIMUM_VERSION} CXX=g++-${GCC_MINIMUM_VERSION}; rm -rf CMakeCache.txt CMakeFiles; and re run cmake or ./release.")
|
message (FATAL_ERROR "GCC version must be at least ${GCC_MINIMUM_VERSION}. For example, if GCC ${GCC_MINIMUM_VERSION} is available under gcc-${GCC_MINIMUM_VERSION}, g++-${GCC_MINIMUM_VERSION} names, do the following: export CC=gcc-${GCC_MINIMUM_VERSION} CXX=g++-${GCC_MINIMUM_VERSION}; rm -rf CMakeCache.txt CMakeFiles; and re run cmake or ./release.")
|
||||||
endif ()
|
endif ()
|
||||||
elseif (COMPILER_CLANG)
|
elseif (COMPILER_CLANG)
|
||||||
# Require minimum version of clang
|
# Require minimum version of clang/apple-clang
|
||||||
set (CLANG_MINIMUM_VERSION 8)
|
if (CMAKE_CXX_COMPILER_ID MATCHES "AppleClang")
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${CLANG_MINIMUM_VERSION})
|
# AppleClang 10.0.1 (Xcode 10.2) corresponds to LLVM/Clang upstream version 7.0.0
|
||||||
message (FATAL_ERROR "Clang version must be at least ${CLANG_MINIMUM_VERSION}.")
|
# AppleClang 11.0.0 (Xcode 11.0) corresponds to LLVM/Clang upstream version 8.0.0
|
||||||
|
set (XCODE_MINIMUM_VERSION 10.2)
|
||||||
|
set (APPLE_CLANG_MINIMUM_VERSION 10.0.1)
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${APPLE_CLANG_MINIMUM_VERSION})
|
||||||
|
message (FATAL_ERROR "AppleClang compiler version must be at least ${APPLE_CLANG_MINIMUM_VERSION} (Xcode ${XCODE_MINIMUM_VERSION}).")
|
||||||
|
elseif (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.0.0)
|
||||||
|
# char8_t is available staring (upstream vanilla) Clang 7, but prior to Clang 8,
|
||||||
|
# it is not enabled by -std=c++20 and can be enabled with an explicit -fchar8_t.
|
||||||
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fchar8_t")
|
||||||
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fchar8_t")
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
set (CLANG_MINIMUM_VERSION 8)
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${CLANG_MINIMUM_VERSION})
|
||||||
|
message (FATAL_ERROR "Clang version must be at least ${CLANG_MINIMUM_VERSION}.")
|
||||||
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
else ()
|
else ()
|
||||||
message (WARNING "You are using an unsupported compiler. Compilation has only been tested with Clang and GCC.")
|
message (WARNING "You are using an unsupported compiler. Compilation has only been tested with Clang and GCC.")
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
# This strings autochanged from release_lib.sh:
|
# This strings autochanged from release_lib.sh:
|
||||||
set(VERSION_REVISION 54434)
|
set(VERSION_REVISION 54435)
|
||||||
set(VERSION_MAJOR 20)
|
set(VERSION_MAJOR 20)
|
||||||
set(VERSION_MINOR 4)
|
set(VERSION_MINOR 5)
|
||||||
set(VERSION_PATCH 1)
|
set(VERSION_PATCH 1)
|
||||||
set(VERSION_GITHASH 05da1bff8b5826608d05618dab984cdf8f96e679)
|
set(VERSION_GITHASH 91df18a906dcffdbee6816e5389df6c65f86e35f)
|
||||||
set(VERSION_DESCRIBE v20.4.1.1-prestable)
|
set(VERSION_DESCRIBE v20.5.1.1-prestable)
|
||||||
set(VERSION_STRING 20.4.1.1)
|
set(VERSION_STRING 20.5.1.1)
|
||||||
# end of autochange
|
# end of autochange
|
||||||
|
|
||||||
set(VERSION_EXTRA "" CACHE STRING "")
|
set(VERSION_EXTRA "" CACHE STRING "")
|
||||||
|
165
cmake/warnings.cmake
Normal file
165
cmake/warnings.cmake
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
# Our principle is to enable as many warnings as possible and always do it with "warnings as errors" flag.
|
||||||
|
#
|
||||||
|
# But it comes with some cost:
|
||||||
|
# - we have to disable some warnings in 3rd party libraries (they are located in "contrib" directory)
|
||||||
|
# - we have to include headers of these libraries as -isystem to avoid warnings from headers
|
||||||
|
# (this is the same behaviour as if these libraries were located in /usr/include)
|
||||||
|
# - sometimes warnings from 3rd party libraries may come from macro substitutions in our code
|
||||||
|
# and we have to wrap them with #pragma GCC/clang diagnostic ignored
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (USE_DEBUG_HELPERS)
|
||||||
|
set (INCLUDE_DEBUG_HELPERS "-I${ClickHouse_SOURCE_DIR}/base -include ${ClickHouse_SOURCE_DIR}/src/Core/iostream_debug_helpers.h")
|
||||||
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${INCLUDE_DEBUG_HELPERS}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Add some warnings that are not available even with -Wall -Wextra -Wpedantic.
|
||||||
|
|
||||||
|
option (WEVERYTHING "Enables -Weverything option with some exceptions. This is intended for exploration of new compiler warnings that may be found to be useful. Only makes sense for clang." ON)
|
||||||
|
|
||||||
|
if (COMPILER_CLANG)
|
||||||
|
add_warning(pedantic)
|
||||||
|
no_warning(vla-extension)
|
||||||
|
no_warning(zero-length-array)
|
||||||
|
|
||||||
|
add_warning(comma)
|
||||||
|
add_warning(conditional-uninitialized)
|
||||||
|
add_warning(covered-switch-default)
|
||||||
|
add_warning(deprecated)
|
||||||
|
add_warning(embedded-directive)
|
||||||
|
add_warning(empty-init-stmt) # linux-only
|
||||||
|
add_warning(extra-semi-stmt) # linux-only
|
||||||
|
add_warning(extra-semi)
|
||||||
|
add_warning(gnu-case-range)
|
||||||
|
add_warning(inconsistent-missing-destructor-override)
|
||||||
|
add_warning(newline-eof)
|
||||||
|
add_warning(old-style-cast)
|
||||||
|
add_warning(range-loop-analysis)
|
||||||
|
add_warning(redundant-parens)
|
||||||
|
add_warning(reserved-id-macro)
|
||||||
|
add_warning(shadow-field) # clang 8+
|
||||||
|
add_warning(shadow-uncaptured-local)
|
||||||
|
add_warning(shadow)
|
||||||
|
add_warning(string-plus-int) # clang 8+
|
||||||
|
add_warning(undef)
|
||||||
|
add_warning(unreachable-code-return)
|
||||||
|
add_warning(unreachable-code)
|
||||||
|
add_warning(unused-exception-parameter)
|
||||||
|
add_warning(unused-macros)
|
||||||
|
add_warning(unused-member-function)
|
||||||
|
add_warning(zero-as-null-pointer-constant)
|
||||||
|
|
||||||
|
if (WEVERYTHING)
|
||||||
|
add_warning(everything)
|
||||||
|
no_warning(c++98-compat-pedantic)
|
||||||
|
no_warning(c++98-compat)
|
||||||
|
no_warning(c99-extensions)
|
||||||
|
no_warning(conversion)
|
||||||
|
no_warning(ctad-maybe-unsupported) # clang 9+, linux-only
|
||||||
|
no_warning(deprecated-dynamic-exception-spec)
|
||||||
|
no_warning(disabled-macro-expansion)
|
||||||
|
no_warning(documentation-unknown-command)
|
||||||
|
no_warning(double-promotion)
|
||||||
|
no_warning(exit-time-destructors)
|
||||||
|
no_warning(float-equal)
|
||||||
|
no_warning(global-constructors)
|
||||||
|
no_warning(missing-prototypes)
|
||||||
|
no_warning(missing-variable-declarations)
|
||||||
|
no_warning(nested-anon-types)
|
||||||
|
no_warning(packed)
|
||||||
|
no_warning(padded)
|
||||||
|
no_warning(return-std-move-in-c++11) # clang 7+
|
||||||
|
no_warning(shift-sign-overflow)
|
||||||
|
no_warning(sign-conversion)
|
||||||
|
no_warning(switch-enum)
|
||||||
|
no_warning(undefined-func-template)
|
||||||
|
no_warning(unused-template)
|
||||||
|
no_warning(vla)
|
||||||
|
no_warning(weak-template-vtables)
|
||||||
|
no_warning(weak-vtables)
|
||||||
|
|
||||||
|
# TODO Enable conversion, sign-conversion, double-promotion warnings.
|
||||||
|
endif ()
|
||||||
|
elseif (COMPILER_GCC)
|
||||||
|
# Add compiler options only to c++ compiler
|
||||||
|
function(add_cxx_compile_options option)
|
||||||
|
add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:${option}>")
|
||||||
|
endfunction()
|
||||||
|
# Warn about boolean expression compared with an integer value different from true/false
|
||||||
|
add_cxx_compile_options(-Wbool-compare)
|
||||||
|
# Warn whenever a pointer is cast such that the required alignment of the target is increased.
|
||||||
|
add_cxx_compile_options(-Wcast-align)
|
||||||
|
# Warn whenever a pointer is cast so as to remove a type qualifier from the target type.
|
||||||
|
add_cxx_compile_options(-Wcast-qual)
|
||||||
|
# Warn when deleting a pointer to incomplete type, which may cause undefined behavior at runtime
|
||||||
|
add_cxx_compile_options(-Wdelete-incomplete)
|
||||||
|
# Warn if a requested optimization pass is disabled. Code is too big or too complex
|
||||||
|
add_cxx_compile_options(-Wdisabled-optimization)
|
||||||
|
# Warn about duplicated conditions in an if-else-if chain
|
||||||
|
add_cxx_compile_options(-Wduplicated-cond)
|
||||||
|
# Warn about a comparison between values of different enumerated types
|
||||||
|
add_cxx_compile_options(-Wenum-compare)
|
||||||
|
# Warn about uninitialized variables that are initialized with themselves
|
||||||
|
add_cxx_compile_options(-Winit-self)
|
||||||
|
# Warn about logical not used on the left hand side operand of a comparison
|
||||||
|
add_cxx_compile_options(-Wlogical-not-parentheses)
|
||||||
|
# Warn about suspicious uses of logical operators in expressions
|
||||||
|
add_cxx_compile_options(-Wlogical-op)
|
||||||
|
# Warn if there exists a path from the function entry to a use of the variable that is uninitialized.
|
||||||
|
add_cxx_compile_options(-Wmaybe-uninitialized)
|
||||||
|
# Warn when the indentation of the code does not reflect the block structure
|
||||||
|
add_cxx_compile_options(-Wmisleading-indentation)
|
||||||
|
# Warn if a global function is defined without a previous declaration - disabled because of build times
|
||||||
|
# add_cxx_compile_options(-Wmissing-declarations)
|
||||||
|
# Warn if a user-supplied include directory does not exist
|
||||||
|
add_cxx_compile_options(-Wmissing-include-dirs)
|
||||||
|
# Obvious
|
||||||
|
add_cxx_compile_options(-Wnon-virtual-dtor)
|
||||||
|
# Obvious
|
||||||
|
add_cxx_compile_options(-Wno-return-local-addr)
|
||||||
|
# This warning is disabled due to false positives if compiled with libc++: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90037
|
||||||
|
#add_cxx_compile_options(-Wnull-dereference)
|
||||||
|
# Obvious
|
||||||
|
add_cxx_compile_options(-Wodr)
|
||||||
|
# Obvious
|
||||||
|
add_cxx_compile_options(-Wold-style-cast)
|
||||||
|
# Warn when a function declaration hides virtual functions from a base class
|
||||||
|
# add_cxx_compile_options(-Woverloaded-virtual)
|
||||||
|
# Warn about placement new expressions with undefined behavior
|
||||||
|
add_cxx_compile_options(-Wplacement-new=2)
|
||||||
|
# Warn about anything that depends on the “size of” a function type or of void
|
||||||
|
add_cxx_compile_options(-Wpointer-arith)
|
||||||
|
# Warn if anything is declared more than once in the same scope
|
||||||
|
add_cxx_compile_options(-Wredundant-decls)
|
||||||
|
# Member initialization reordering
|
||||||
|
add_cxx_compile_options(-Wreorder)
|
||||||
|
# Obvious
|
||||||
|
add_cxx_compile_options(-Wshadow)
|
||||||
|
# Warn if left shifting a negative value
|
||||||
|
add_cxx_compile_options(-Wshift-negative-value)
|
||||||
|
# Warn about a definition of an unsized deallocation function
|
||||||
|
add_cxx_compile_options(-Wsized-deallocation)
|
||||||
|
# Warn when the sizeof operator is applied to a parameter that is declared as an array in a function definition
|
||||||
|
add_cxx_compile_options(-Wsizeof-array-argument)
|
||||||
|
# Warn for suspicious length parameters to certain string and memory built-in functions if the argument uses sizeof
|
||||||
|
add_cxx_compile_options(-Wsizeof-pointer-memaccess)
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 9)
|
||||||
|
# Warn about overriding virtual functions that are not marked with the override keyword
|
||||||
|
add_cxx_compile_options(-Wsuggest-override)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Warn whenever a switch statement has an index of boolean type and the case values are outside the range of a boolean type
|
||||||
|
add_cxx_compile_options(-Wswitch-bool)
|
||||||
|
# Warn if a self-comparison always evaluates to true or false
|
||||||
|
add_cxx_compile_options(-Wtautological-compare)
|
||||||
|
# Warn about trampolines generated for pointers to nested functions
|
||||||
|
add_cxx_compile_options(-Wtrampolines)
|
||||||
|
# Obvious
|
||||||
|
add_cxx_compile_options(-Wunused)
|
||||||
|
# Warn if vector operation is not implemented via SIMD capabilities of the architecture
|
||||||
|
add_cxx_compile_options(-Wvector-operation-performance)
|
||||||
|
endif ()
|
108
contrib/CMakeLists.txt
vendored
108
contrib/CMakeLists.txt
vendored
@ -1,10 +1,39 @@
|
|||||||
# Third-party libraries may have substandard code.
|
# Third-party libraries may have substandard code.
|
||||||
|
|
||||||
|
# Put all targets defined here and in added subfolders under "contrib/" folder in GUI-based IDEs by default.
|
||||||
|
# Some of third-party projects may override CMAKE_FOLDER or FOLDER property of their targets, so they will
|
||||||
|
# appear not in "contrib/" as originally planned here.
|
||||||
|
get_filename_component (_current_dir_name "${CMAKE_CURRENT_LIST_DIR}" NAME)
|
||||||
|
if (CMAKE_FOLDER)
|
||||||
|
set (CMAKE_FOLDER "${CMAKE_FOLDER}/${_current_dir_name}")
|
||||||
|
else ()
|
||||||
|
set (CMAKE_FOLDER "${_current_dir_name}")
|
||||||
|
endif ()
|
||||||
|
unset (_current_dir_name)
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
|
||||||
|
|
||||||
set_property(DIRECTORY PROPERTY EXCLUDE_FROM_ALL 1)
|
set_property(DIRECTORY PROPERTY EXCLUDE_FROM_ALL 1)
|
||||||
|
|
||||||
|
add_subdirectory (cctz-cmake)
|
||||||
|
add_subdirectory (consistent-hashing-sumbur)
|
||||||
|
add_subdirectory (consistent-hashing)
|
||||||
|
add_subdirectory (croaring)
|
||||||
|
add_subdirectory (FastMemcpy)
|
||||||
|
add_subdirectory (grpc-cmake)
|
||||||
|
add_subdirectory (jemalloc-cmake)
|
||||||
|
add_subdirectory (libcpuid-cmake)
|
||||||
|
add_subdirectory (murmurhash)
|
||||||
|
add_subdirectory (replxx-cmake)
|
||||||
|
add_subdirectory (ryu-cmake)
|
||||||
|
add_subdirectory (unixodbc-cmake)
|
||||||
|
|
||||||
|
add_subdirectory (poco-cmake)
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: refactor the contrib libraries below this comment.
|
||||||
|
|
||||||
if (USE_INTERNAL_BOOST_LIBRARY)
|
if (USE_INTERNAL_BOOST_LIBRARY)
|
||||||
add_subdirectory (boost-cmake)
|
add_subdirectory (boost-cmake)
|
||||||
endif ()
|
endif ()
|
||||||
@ -27,8 +56,6 @@ if (USE_INTERNAL_DOUBLE_CONVERSION_LIBRARY)
|
|||||||
add_subdirectory (double-conversion-cmake)
|
add_subdirectory (double-conversion-cmake)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_subdirectory (ryu-cmake)
|
|
||||||
|
|
||||||
if (USE_INTERNAL_CITYHASH_LIBRARY)
|
if (USE_INTERNAL_CITYHASH_LIBRARY)
|
||||||
add_subdirectory (cityhash102)
|
add_subdirectory (cityhash102)
|
||||||
endif ()
|
endif ()
|
||||||
@ -41,9 +68,6 @@ if (USE_INTERNAL_METROHASH_LIBRARY)
|
|||||||
add_subdirectory (libmetrohash)
|
add_subdirectory (libmetrohash)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_subdirectory (murmurhash)
|
|
||||||
add_subdirectory (croaring)
|
|
||||||
|
|
||||||
if (USE_INTERNAL_BTRIE_LIBRARY)
|
if (USE_INTERNAL_BTRIE_LIBRARY)
|
||||||
add_subdirectory (libbtrie)
|
add_subdirectory (libbtrie)
|
||||||
endif ()
|
endif ()
|
||||||
@ -75,14 +99,6 @@ if (USE_INTERNAL_ZLIB_LIBRARY)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_subdirectory (cctz-cmake)
|
|
||||||
|
|
||||||
add_subdirectory (jemalloc-cmake)
|
|
||||||
|
|
||||||
if (USE_INTERNAL_CPUID_LIBRARY)
|
|
||||||
add_subdirectory (libcpuid)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (USE_INTERNAL_H3_LIBRARY)
|
if (USE_INTERNAL_H3_LIBRARY)
|
||||||
add_subdirectory(h3-cmake)
|
add_subdirectory(h3-cmake)
|
||||||
endif ()
|
endif ()
|
||||||
@ -90,12 +106,14 @@ endif ()
|
|||||||
if (USE_INTERNAL_SSL_LIBRARY)
|
if (USE_INTERNAL_SSL_LIBRARY)
|
||||||
add_subdirectory (openssl-cmake)
|
add_subdirectory (openssl-cmake)
|
||||||
|
|
||||||
# This is for Poco library
|
|
||||||
set (POCO_SKIP_OPENSSL_FIND 1)
|
|
||||||
add_library(OpenSSL::Crypto ALIAS ${OPENSSL_CRYPTO_LIBRARY})
|
add_library(OpenSSL::Crypto ALIAS ${OPENSSL_CRYPTO_LIBRARY})
|
||||||
add_library(OpenSSL::SSL ALIAS ${OPENSSL_SSL_LIBRARY})
|
add_library(OpenSSL::SSL ALIAS ${OPENSSL_SSL_LIBRARY})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (ENABLE_LDAP AND USE_INTERNAL_LDAP_LIBRARY)
|
||||||
|
add_subdirectory (openldap-cmake)
|
||||||
|
endif ()
|
||||||
|
|
||||||
function(mysql_support)
|
function(mysql_support)
|
||||||
set(CLIENT_PLUGIN_CACHING_SHA2_PASSWORD STATIC)
|
set(CLIENT_PLUGIN_CACHING_SHA2_PASSWORD STATIC)
|
||||||
set(CLIENT_PLUGIN_SHA256_PASSWORD STATIC)
|
set(CLIENT_PLUGIN_SHA256_PASSWORD STATIC)
|
||||||
@ -131,11 +149,6 @@ if (USE_RDKAFKA)
|
|||||||
add_subdirectory (cppkafka-cmake)
|
add_subdirectory (cppkafka-cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_ODBC AND USE_INTERNAL_ODBC_LIBRARY)
|
|
||||||
add_subdirectory (unixodbc-cmake)
|
|
||||||
add_library(ODBC::ODBC ALIAS ${ODBC_LIBRARIES})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (ENABLE_ICU AND USE_INTERNAL_ICU_LIBRARY)
|
if (ENABLE_ICU AND USE_INTERNAL_ICU_LIBRARY)
|
||||||
add_subdirectory (icu-cmake)
|
add_subdirectory (icu-cmake)
|
||||||
endif ()
|
endif ()
|
||||||
@ -174,24 +187,27 @@ if (USE_INTERNAL_PARQUET_LIBRARY_NATIVE_CMAKE)
|
|||||||
set (PARQUET_ARROW_LINKAGE "static" CACHE INTERNAL "")
|
set (PARQUET_ARROW_LINKAGE "static" CACHE INTERNAL "")
|
||||||
set (ARROW_TEST_LINKAGE "static" CACHE INTERNAL "")
|
set (ARROW_TEST_LINKAGE "static" CACHE INTERNAL "")
|
||||||
set (ARROW_BUILD_STATIC ${MAKE_STATIC_LIBRARIES} CACHE INTERNAL "")
|
set (ARROW_BUILD_STATIC ${MAKE_STATIC_LIBRARIES} CACHE INTERNAL "")
|
||||||
else()
|
else ()
|
||||||
set (PARQUET_ARROW_LINKAGE "shared" CACHE INTERNAL "")
|
set (PARQUET_ARROW_LINKAGE "shared" CACHE INTERNAL "")
|
||||||
set (ARROW_TEST_LINKAGE "shared" CACHE INTERNAL "")
|
set (ARROW_TEST_LINKAGE "shared" CACHE INTERNAL "")
|
||||||
endif()
|
endif ()
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO")
|
if (CMAKE_BUILD_TYPE_UC STREQUAL "RELWITHDEBINFO")
|
||||||
set(_save_build_type ${CMAKE_BUILD_TYPE})
|
set (_save_build_type ${CMAKE_BUILD_TYPE})
|
||||||
set(CMAKE_BUILD_TYPE RELEASE)
|
set (CMAKE_BUILD_TYPE Release)
|
||||||
endif()
|
string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# Because Arrow uses CMAKE_SOURCE_DIR as a project path
|
# Because Arrow uses CMAKE_SOURCE_DIR as a project path
|
||||||
# Hopefully will be fixed in https://github.com/apache/arrow/pull/2676
|
# Hopefully will be fixed in https://github.com/apache/arrow/pull/2676
|
||||||
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/cmake_modules")
|
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/cmake_modules")
|
||||||
add_subdirectory (arrow/cpp)
|
add_subdirectory (arrow/cpp)
|
||||||
|
|
||||||
if(_save_build_type)
|
if (_save_build_type)
|
||||||
set(CMAKE_BUILD_TYPE ${_save_build_type})
|
set (CMAKE_BUILD_TYPE ${_save_build_type})
|
||||||
endif()
|
unset (_save_build_type)
|
||||||
|
string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
|
endif ()
|
||||||
|
|
||||||
else()
|
else()
|
||||||
add_subdirectory(arrow-cmake)
|
add_subdirectory(arrow-cmake)
|
||||||
@ -207,29 +223,6 @@ if (USE_INTERNAL_AVRO_LIBRARY)
|
|||||||
add_subdirectory(avro-cmake)
|
add_subdirectory(avro-cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (USE_INTERNAL_POCO_LIBRARY)
|
|
||||||
set (POCO_VERBOSE_MESSAGES 0 CACHE INTERNAL "")
|
|
||||||
set (save_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
||||||
set (save_CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
|
|
||||||
set (_save ${ENABLE_TESTS})
|
|
||||||
set (ENABLE_TESTS 0)
|
|
||||||
set (POCO_ENABLE_TESTS 0)
|
|
||||||
set (CMAKE_DISABLE_FIND_PACKAGE_ZLIB 1)
|
|
||||||
if (MSVC OR NOT USE_POCO_DATAODBC)
|
|
||||||
set (ENABLE_DATA_ODBC 0 CACHE INTERNAL "") # TODO (build fail)
|
|
||||||
endif ()
|
|
||||||
add_subdirectory (poco)
|
|
||||||
unset (CMAKE_DISABLE_FIND_PACKAGE_ZLIB)
|
|
||||||
set (ENABLE_TESTS ${_save})
|
|
||||||
set (CMAKE_CXX_FLAGS ${save_CMAKE_CXX_FLAGS})
|
|
||||||
set (CMAKE_C_FLAGS ${save_CMAKE_C_FLAGS})
|
|
||||||
|
|
||||||
if (OPENSSL_FOUND AND TARGET Crypto AND (NOT DEFINED ENABLE_POCO_NETSSL OR ENABLE_POCO_NETSSL))
|
|
||||||
# Bug in poco https://github.com/pocoproject/poco/pull/2100 found on macos
|
|
||||||
target_include_directories(Crypto SYSTEM PUBLIC ${OPENSSL_INCLUDE_DIR})
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if(USE_INTERNAL_GTEST_LIBRARY)
|
if(USE_INTERNAL_GTEST_LIBRARY)
|
||||||
# Google Test from sources
|
# Google Test from sources
|
||||||
add_subdirectory(${ClickHouse_SOURCE_DIR}/contrib/googletest/googletest ${CMAKE_CURRENT_BINARY_DIR}/googletest)
|
add_subdirectory(${ClickHouse_SOURCE_DIR}/contrib/googletest/googletest ${CMAKE_CURRENT_BINARY_DIR}/googletest)
|
||||||
@ -321,17 +314,6 @@ if (USE_SIMDJSON)
|
|||||||
add_subdirectory (simdjson-cmake)
|
add_subdirectory (simdjson-cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (USE_MIMALLOC)
|
|
||||||
add_subdirectory (mimalloc)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (USE_FASTOPS)
|
if (USE_FASTOPS)
|
||||||
add_subdirectory (fastops-cmake)
|
add_subdirectory (fastops-cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(grpc-cmake)
|
|
||||||
|
|
||||||
add_subdirectory(replxx-cmake)
|
|
||||||
add_subdirectory(FastMemcpy)
|
|
||||||
add_subdirectory(consistent-hashing)
|
|
||||||
add_subdirectory(consistent-hashing-sumbur)
|
|
||||||
|
@ -83,7 +83,7 @@ add_custom_command(OUTPUT orc_proto.pb.h orc_proto.pb.cc
|
|||||||
set(FLATBUFFERS_SRC_DIR ${ClickHouse_SOURCE_DIR}/contrib/flatbuffers)
|
set(FLATBUFFERS_SRC_DIR ${ClickHouse_SOURCE_DIR}/contrib/flatbuffers)
|
||||||
set(FLATBUFFERS_BINARY_DIR ${ClickHouse_BINARY_DIR}/contrib/flatbuffers)
|
set(FLATBUFFERS_BINARY_DIR ${ClickHouse_BINARY_DIR}/contrib/flatbuffers)
|
||||||
set(FLATBUFFERS_INCLUDE_DIR ${FLATBUFFERS_SRC_DIR}/include)
|
set(FLATBUFFERS_INCLUDE_DIR ${FLATBUFFERS_SRC_DIR}/include)
|
||||||
set(FLATBUFFERS_COMPILER "${FLATBUFFERS_BINARY_DIR}/flatc")
|
set(FLATBUFFERS_COMPILER "$<TARGET_FILE:flatc>")
|
||||||
|
|
||||||
# set flatbuffers CMake options
|
# set flatbuffers CMake options
|
||||||
if (${USE_STATIC_LIBRARIES})
|
if (${USE_STATIC_LIBRARIES})
|
||||||
|
2
contrib/aws
vendored
2
contrib/aws
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 45dd8552d3c492defca79d2720bcc809e35654da
|
Subproject commit fb5c604525f5151d75a856462653e7e38b559b79
|
@ -83,7 +83,7 @@ set(S3_INCLUDES
|
|||||||
|
|
||||||
add_library(aws_s3_checksums ${AWS_CHECKSUMS_SOURCES})
|
add_library(aws_s3_checksums ${AWS_CHECKSUMS_SOURCES})
|
||||||
target_include_directories(aws_s3_checksums PUBLIC "${AWS_CHECKSUMS_LIBRARY_DIR}/include/")
|
target_include_directories(aws_s3_checksums PUBLIC "${AWS_CHECKSUMS_LIBRARY_DIR}/include/")
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "" OR CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG")
|
||||||
target_compile_definitions(aws_s3_checksums PRIVATE "-DDEBUG_BUILD")
|
target_compile_definitions(aws_s3_checksums PRIVATE "-DDEBUG_BUILD")
|
||||||
endif()
|
endif()
|
||||||
set_target_properties(aws_s3_checksums PROPERTIES LINKER_LANGUAGE C)
|
set_target_properties(aws_s3_checksums PROPERTIES LINKER_LANGUAGE C)
|
||||||
|
@ -31,3 +31,13 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_include_directories(base64 SYSTEM PUBLIC ${LIBRARY_DIR})
|
target_include_directories(base64 SYSTEM PUBLIC ${LIBRARY_DIR})
|
||||||
|
|
||||||
|
if (XCODE OR XCODE_VERSION)
|
||||||
|
# https://gitlab.kitware.com/cmake/cmake/issues/17457
|
||||||
|
# Some native build systems may not like targets that have only object files, so consider adding at least one real source file
|
||||||
|
# This applies to Xcode.
|
||||||
|
if (NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/dummy.c")
|
||||||
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c" "")
|
||||||
|
endif ()
|
||||||
|
target_sources(base64 PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c")
|
||||||
|
endif ()
|
||||||
|
2
contrib/boost
vendored
2
contrib/boost
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 86be2aef20bee2356b744e5569eed6eaded85dbe
|
Subproject commit a04e72c0464f0c31d3384f18f0c0db36a05538e0
|
2
contrib/cctz
vendored
2
contrib/cctz
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 5a3f785329cecdd2b68cd950e0647e9246774ef2
|
Subproject commit 7a2db4ece6e0f1b246173cbdb62711ae258ee841
|
@ -26,11 +26,15 @@ if (USE_INTERNAL_CCTZ)
|
|||||||
|
|
||||||
# Build a libray with embedded tzdata
|
# Build a libray with embedded tzdata
|
||||||
|
|
||||||
# We invoke 'ld' and 'objcopy' directly because lld linker has no option to generate object file with binary data.
|
|
||||||
# Note: we can invoke specific ld from toolchain and relax condition on ARCH_AMD64.
|
|
||||||
|
|
||||||
if (OS_LINUX AND ARCH_AMD64)
|
if (OS_LINUX AND ARCH_AMD64)
|
||||||
|
|
||||||
|
find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")
|
||||||
|
if (OBJCOPY_PATH)
|
||||||
|
message(STATUS "Using objcopy: ${OBJCOPY_PATH}.")
|
||||||
|
else ()
|
||||||
|
message(FATAL_ERROR "Cannot find objcopy.")
|
||||||
|
endif ()
|
||||||
|
|
||||||
set (TIMEZONES
|
set (TIMEZONES
|
||||||
Africa/Abidjan
|
Africa/Abidjan
|
||||||
Africa/Accra
|
Africa/Accra
|
||||||
@ -605,8 +609,8 @@ if (USE_INTERNAL_CCTZ)
|
|||||||
|
|
||||||
# https://stackoverflow.com/questions/14776463/compile-and-add-an-object-file-from-a-binary-with-cmake
|
# https://stackoverflow.com/questions/14776463/compile-and-add-an-object-file-from-a-binary-with-cmake
|
||||||
add_custom_command(OUTPUT ${TZ_OBJ}
|
add_custom_command(OUTPUT ${TZ_OBJ}
|
||||||
COMMAND cd ${TZDIR} && ld -r -b binary -o ${CMAKE_CURRENT_BINARY_DIR}/${TZ_OBJ} ${TIMEZONE}
|
COMMAND cd ${TZDIR} && ${OBJCOPY_PATH} -I binary -O elf64-x86-64 -B i386 ${TIMEZONE} ${CMAKE_CURRENT_BINARY_DIR}/${TZ_OBJ}
|
||||||
COMMAND objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents
|
COMMAND ${OBJCOPY_PATH} --rename-section .data=.rodata,alloc,load,readonly,data,contents
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${TZ_OBJ} ${CMAKE_CURRENT_BINARY_DIR}/${TZ_OBJ})
|
${CMAKE_CURRENT_BINARY_DIR}/${TZ_OBJ} ${CMAKE_CURRENT_BINARY_DIR}/${TZ_OBJ})
|
||||||
|
|
||||||
set_source_files_properties(${TZ_OBJ} PROPERTIES EXTERNAL_OBJECT true GENERATED true)
|
set_source_files_properties(${TZ_OBJ} PROPERTIES EXTERNAL_OBJECT true GENERATED true)
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
cmake_minimum_required(VERSION 3.5.1)
|
cmake_minimum_required(VERSION 3.5.1)
|
||||||
|
|
||||||
|
|
||||||
set(GRPC_SOURCE_DIR ${ClickHouse_SOURCE_DIR}/contrib/grpc)
|
set(GRPC_SOURCE_DIR ${ClickHouse_SOURCE_DIR}/contrib/grpc)
|
||||||
set(GRPC_INCLUDE_DIR ${GRPC_SOURCE_DIR}/include/)
|
set(GRPC_INCLUDE_DIR ${GRPC_SOURCE_DIR}/include/)
|
||||||
set(GRPC_BINARY_DIR ${ClickHouse_BINARY_DIR}/contrib/grpc)
|
set(GRPC_BINARY_DIR ${ClickHouse_BINARY_DIR}/contrib/grpc)
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
set(_gRPC_PLATFORM_LINUX ON)
|
set(_gRPC_PLATFORM_LINUX ON)
|
||||||
@ -56,29 +56,19 @@ endif()
|
|||||||
|
|
||||||
# protobuf.cmake
|
# protobuf.cmake
|
||||||
set(PROTOBUF_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../protobuf)
|
set(PROTOBUF_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../protobuf)
|
||||||
# if(NOT protobuf_BUILD_TESTS)
|
|
||||||
# set(protobuf_BUILD_TESTS OFF CACHE BOOL "Build protobuf tests")
|
|
||||||
# endif()
|
|
||||||
set(protobuf_BUILD_TESTS OFF CACHE BOOL "Build protobuf tests")
|
set(protobuf_BUILD_TESTS OFF CACHE BOOL "Build protobuf tests")
|
||||||
if(NOT protobuf_WITH_ZLIB)
|
if(NOT protobuf_WITH_ZLIB)
|
||||||
set(protobuf_WITH_ZLIB OFF CACHE BOOL "Build protobuf with zlib.")
|
set(protobuf_WITH_ZLIB OFF CACHE BOOL "Build protobuf with zlib.")
|
||||||
endif()
|
endif()
|
||||||
set(protobuf_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Link static runtime libraries")
|
set(protobuf_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Link static runtime libraries")
|
||||||
if(NOT USE_INTERNAL_PROTOBUF_LIBRARY)
|
|
||||||
add_subdirectory(${PROTOBUF_ROOT_DIR}/cmake ${GRPC_BINARY_DIR}/third_party/protobuf)
|
set(_gRPC_PROTOBUF_LIBRARIES libprotobuf)
|
||||||
endif()
|
set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc)
|
||||||
if(TARGET ${_gRPC_PROTOBUF_LIBRARY_NAME})
|
set(_gRPC_PROTOBUF_PROTOC protoc)
|
||||||
set(_gRPC_PROTOBUF_LIBRARIES ${_gRPC_PROTOBUF_LIBRARY_NAME})
|
set(_gRPC_PROTOBUF_PROTOC_EXECUTABLE $<TARGET_FILE:protoc>)
|
||||||
endif()
|
set(_gRPC_PROTOBUF_INCLUDE_DIR "${PROTOBUF_ROOT_DIR}/src")
|
||||||
if(TARGET libprotoc)
|
|
||||||
set(_gRPC_PROTOBUF_PROTOC_LIBRARIES libprotoc)
|
|
||||||
endif()
|
|
||||||
if(TARGET protoc)
|
|
||||||
set(_gRPC_PROTOBUF_PROTOC protoc)
|
|
||||||
set(_gRPC_PROTOBUF_PROTOC_EXECUTABLE $<TARGET_FILE:protoc>)
|
|
||||||
endif()
|
|
||||||
# For well-known .proto files distributed with protobuf
|
|
||||||
set(_gRPC_PROTOBUF_WELLKNOWN_INCLUDE_DIR "${PROTOBUF_ROOT_DIR}/src")
|
|
||||||
if(gRPC_INSTALL)
|
if(gRPC_INSTALL)
|
||||||
message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_PROTOBUF_PROVIDER is \"module\"")
|
message(WARNING "gRPC_INSTALL will be forced to FALSE because gRPC_PROTOBUF_PROVIDER is \"module\"")
|
||||||
set(gRPC_INSTALL FALSE)
|
set(gRPC_INSTALL FALSE)
|
||||||
@ -98,12 +88,13 @@ set(_gRPC_UPB_GRPC_GENERATED_DIR "${GRPC_SOURCE_DIR}/src/core/ext/upb-generated"
|
|||||||
set(_gRPC_UPB_LIBRARIES upb)
|
set(_gRPC_UPB_LIBRARIES upb)
|
||||||
|
|
||||||
# zlib.cmake
|
# zlib.cmake
|
||||||
set(ZLIB_ROOT_DIR ${GRPC_SOURCE_DIR}/third_party/zlib-ng)
|
set(ZLIB_ROOT_DIR ${GRPC_SOURCE_DIR}/../zlib-ng)
|
||||||
include_directories("${ZLIB_ROOT_DIR}")
|
include_directories("${ZLIB_ROOT_DIR}")
|
||||||
# add_subdirectory(${ZLIB_ROOT_DIR} ${ZLIB_ROOT_DIR})
|
## add_subdirectory(${ZLIB_ROOT_DIR} ${ZLIB_ROOT_DIR})
|
||||||
set(_gRPC_ZLIB_LIBRARIES zlibstatic)
|
if(TARGET zlibstatic)
|
||||||
set(_gRPC_ZLIB_INCLUDE_DIR "${ZLIB_ROOT_DIR}")
|
set(_gRPC_ZLIB_LIBRARIES zlibstatic)
|
||||||
|
set(_gRPC_ZLIB_INCLUDE_DIR "${ZLIB_ROOT_DIR}" "${GRPC_SOURCE_DIR}/third_party/zlib")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
@ -134,6 +125,7 @@ target_include_directories(address_sorting
|
|||||||
)
|
)
|
||||||
target_link_libraries(address_sorting
|
target_link_libraries(address_sorting
|
||||||
${_gRPC_BASELIB_LIBRARIES}
|
${_gRPC_BASELIB_LIBRARIES}
|
||||||
|
${_gRPC_PROTOBUF_LIBRARIES}
|
||||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -194,6 +186,7 @@ target_include_directories(gpr
|
|||||||
)
|
)
|
||||||
target_link_libraries(gpr
|
target_link_libraries(gpr
|
||||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||||
|
${_gRPC_PROTOBUF_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(grpc
|
add_library(grpc
|
||||||
@ -597,6 +590,7 @@ target_link_libraries(grpc
|
|||||||
${_gRPC_CARES_LIBRARIES}
|
${_gRPC_CARES_LIBRARIES}
|
||||||
${_gRPC_ADDRESS_SORTING_LIBRARIES}
|
${_gRPC_ADDRESS_SORTING_LIBRARIES}
|
||||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||||
|
${_gRPC_PROTOBUF_LIBRARIES}
|
||||||
gpr
|
gpr
|
||||||
)
|
)
|
||||||
if (_gRPC_PLATFORM_MAC)
|
if (_gRPC_PLATFORM_MAC)
|
||||||
@ -943,6 +937,7 @@ target_link_libraries(grpc_cronet
|
|||||||
${_gRPC_CARES_LIBRARIES}
|
${_gRPC_CARES_LIBRARIES}
|
||||||
${_gRPC_ADDRESS_SORTING_LIBRARIES}
|
${_gRPC_ADDRESS_SORTING_LIBRARIES}
|
||||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||||
|
${_gRPC_PROTOBUF_LIBRARIES}
|
||||||
gpr
|
gpr
|
||||||
)
|
)
|
||||||
if (_gRPC_PLATFORM_MAC)
|
if (_gRPC_PLATFORM_MAC)
|
||||||
@ -1273,6 +1268,7 @@ target_link_libraries(grpc_unsecure
|
|||||||
${_gRPC_CARES_LIBRARIES}
|
${_gRPC_CARES_LIBRARIES}
|
||||||
${_gRPC_ADDRESS_SORTING_LIBRARIES}
|
${_gRPC_ADDRESS_SORTING_LIBRARIES}
|
||||||
${_gRPC_ALLTARGETS_LIBRARIES}
|
${_gRPC_ALLTARGETS_LIBRARIES}
|
||||||
|
${_gRPC_PROTOBUF_LIBRARIES}
|
||||||
gpr
|
gpr
|
||||||
)
|
)
|
||||||
if (_gRPC_PLATFORM_MAC)
|
if (_gRPC_PLATFORM_MAC)
|
||||||
|
@ -51,11 +51,11 @@ if (ENABLE_JEMALLOC)
|
|||||||
|
|
||||||
add_library(jemalloc ${SRCS})
|
add_library(jemalloc ${SRCS})
|
||||||
target_include_directories(jemalloc PRIVATE ${LIBRARY_DIR}/include)
|
target_include_directories(jemalloc PRIVATE ${LIBRARY_DIR}/include)
|
||||||
target_include_directories(jemalloc PUBLIC include)
|
target_include_directories(jemalloc SYSTEM PUBLIC include)
|
||||||
if (ARCH_AMD64)
|
if (ARCH_AMD64)
|
||||||
target_include_directories(jemalloc PUBLIC include_linux_x86_64)
|
target_include_directories(jemalloc SYSTEM PUBLIC include_linux_x86_64)
|
||||||
elseif (ARCH_ARM)
|
elseif (ARCH_ARM)
|
||||||
target_include_directories(jemalloc PUBLIC include_linux_aarch64)
|
target_include_directories(jemalloc SYSTEM PUBLIC include_linux_aarch64)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
|
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
|
||||||
@ -69,7 +69,7 @@ if (ENABLE_JEMALLOC)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_compile_options(jemalloc PUBLIC -Wno-redundant-decls)
|
target_compile_options(jemalloc PRIVATE -Wno-redundant-decls)
|
||||||
else ()
|
else ()
|
||||||
find_library(LIBRARY_JEMALLOC jemalloc)
|
find_library(LIBRARY_JEMALLOC jemalloc)
|
||||||
find_path(INCLUDE_JEMALLOC jemalloc/jemalloc.h)
|
find_path(INCLUDE_JEMALLOC jemalloc/jemalloc.h)
|
||||||
|
1
contrib/libcpuid
vendored
Submodule
1
contrib/libcpuid
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 8db3b8d2d32d22437f063ce692a1b9bb15e42d18
|
35
contrib/libcpuid-cmake/CMakeLists.txt
Normal file
35
contrib/libcpuid-cmake/CMakeLists.txt
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
option (ENABLE_CPUID "Enable libcpuid library (only internal)" ${ENABLE_LIBRARIES})
|
||||||
|
|
||||||
|
if (ARCH_ARM)
|
||||||
|
set (ENABLE_CPUID 0)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (ENABLE_CPUID)
|
||||||
|
set (LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/libcpuid)
|
||||||
|
|
||||||
|
set (SRCS
|
||||||
|
${LIBRARY_DIR}/libcpuid/asm-bits.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/cpuid_main.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/libcpuid_util.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/msrdriver.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/rdmsr.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/rdtsc.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/recog_amd.c
|
||||||
|
${LIBRARY_DIR}/libcpuid/recog_intel.c
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library (cpuid ${SRCS})
|
||||||
|
|
||||||
|
target_include_directories (cpuid SYSTEM PUBLIC ${LIBRARY_DIR})
|
||||||
|
target_compile_definitions (cpuid PUBLIC USE_CPUID=1)
|
||||||
|
target_compile_definitions (cpuid PRIVATE VERSION="v0.4.1")
|
||||||
|
if (COMPILER_CLANG)
|
||||||
|
target_compile_options (cpuid PRIVATE -Wno-reserved-id-macro)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
message (STATUS "Using cpuid")
|
||||||
|
else ()
|
||||||
|
add_library (cpuid INTERFACE)
|
||||||
|
|
||||||
|
target_compile_definitions (cpuid INTERFACE USE_CPUID=0)
|
||||||
|
endif ()
|
@ -1,20 +0,0 @@
|
|||||||
add_library(cpuid
|
|
||||||
include/libcpuid/asm-bits.c
|
|
||||||
include/libcpuid/cpuid_main.c
|
|
||||||
include/libcpuid/libcpuid_util.c
|
|
||||||
include/libcpuid/rdtsc.c
|
|
||||||
include/libcpuid/recog_amd.c
|
|
||||||
include/libcpuid/recog_intel.c
|
|
||||||
|
|
||||||
include/libcpuid/asm-bits.h
|
|
||||||
include/libcpuid/config.h
|
|
||||||
include/libcpuid/libcpuid_constants.h
|
|
||||||
include/libcpuid/libcpuid.h
|
|
||||||
include/libcpuid/libcpuid_types.h
|
|
||||||
include/libcpuid/libcpuid_util.h
|
|
||||||
include/libcpuid/rdtsc.h
|
|
||||||
include/libcpuid/recog_amd.h
|
|
||||||
include/libcpuid/recog_intel.h
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories (cpuid SYSTEM PUBLIC include)
|
|
@ -1,23 +0,0 @@
|
|||||||
Copyright 2008 Veselin Georgiev,
|
|
||||||
anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1 +0,0 @@
|
|||||||
https://github.com/anrieff/libcpuid.git
|
|
@ -1,65 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains a list of internal codes we use in detection. It is
|
|
||||||
* of no external use and isn't a complete list of AMD products.
|
|
||||||
*/
|
|
||||||
CODE2(OPTERON_GENERIC, 1000),
|
|
||||||
CODE(OPTERON_800),
|
|
||||||
CODE(ATHLON_XP),
|
|
||||||
CODE(ATHLON_XP_M),
|
|
||||||
CODE(ATHLON_XP_M_LV),
|
|
||||||
CODE(ATHLON),
|
|
||||||
CODE(ATHLON_MP),
|
|
||||||
CODE(MOBILE_ATHLON64),
|
|
||||||
CODE(ATHLON_FX),
|
|
||||||
CODE(DURON),
|
|
||||||
CODE(DURON_MP),
|
|
||||||
CODE(MOBILE_DURON),
|
|
||||||
CODE(MOBILE_SEMPRON),
|
|
||||||
CODE(OPTERON_SINGLE),
|
|
||||||
CODE(OPTERON_DUALCORE),
|
|
||||||
CODE(OPTERON_800_DUALCORE),
|
|
||||||
CODE(MOBILE_TURION),
|
|
||||||
CODE(ATHLON_64),
|
|
||||||
CODE(ATHLON_64_FX),
|
|
||||||
CODE(TURION_64),
|
|
||||||
CODE(TURION_X2),
|
|
||||||
CODE(SEMPRON),
|
|
||||||
CODE(M_SEMPRON),
|
|
||||||
CODE(SEMPRON_DUALCORE),
|
|
||||||
CODE(PHENOM),
|
|
||||||
CODE(PHENOM2),
|
|
||||||
CODE(ATHLON_64_X2),
|
|
||||||
CODE(ATHLON_64_X3),
|
|
||||||
CODE(ATHLON_64_X4),
|
|
||||||
CODE(FUSION_C),
|
|
||||||
CODE(FUSION_E),
|
|
||||||
CODE(FUSION_EA),
|
|
||||||
CODE(FUSION_Z),
|
|
||||||
CODE(FUSION_A),
|
|
||||||
|
|
@ -1,825 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "asm-bits.h"
|
|
||||||
|
|
||||||
int cpuid_exists_by_eflags(void)
|
|
||||||
{
|
|
||||||
#if defined(PLATFORM_X64)
|
|
||||||
return 1; /* CPUID is always present on the x86_64 */
|
|
||||||
#elif defined(PLATFORM_X86)
|
|
||||||
# if defined(COMPILER_GCC)
|
|
||||||
int result;
|
|
||||||
__asm __volatile(
|
|
||||||
" pushfl\n"
|
|
||||||
" pop %%eax\n"
|
|
||||||
" mov %%eax, %%ecx\n"
|
|
||||||
" xor $0x200000, %%eax\n"
|
|
||||||
" push %%eax\n"
|
|
||||||
" popfl\n"
|
|
||||||
" pushfl\n"
|
|
||||||
" pop %%eax\n"
|
|
||||||
" xor %%ecx, %%eax\n"
|
|
||||||
" mov %%eax, %0\n"
|
|
||||||
" push %%ecx\n"
|
|
||||||
" popfl\n"
|
|
||||||
: "=m"(result)
|
|
||||||
: :"eax", "ecx", "memory");
|
|
||||||
return (result != 0);
|
|
||||||
# elif defined(COMPILER_MICROSOFT)
|
|
||||||
int result;
|
|
||||||
__asm {
|
|
||||||
pushfd
|
|
||||||
pop eax
|
|
||||||
mov ecx, eax
|
|
||||||
xor eax, 0x200000
|
|
||||||
push eax
|
|
||||||
popfd
|
|
||||||
pushfd
|
|
||||||
pop eax
|
|
||||||
xor eax, ecx
|
|
||||||
mov result, eax
|
|
||||||
push ecx
|
|
||||||
popfd
|
|
||||||
};
|
|
||||||
return (result != 0);
|
|
||||||
# else
|
|
||||||
return 0;
|
|
||||||
# endif /* COMPILER_MICROSOFT */
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif /* PLATFORM_X86 */
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef INLINE_ASM_SUPPORTED
|
|
||||||
/*
|
|
||||||
* with MSVC/AMD64, the exec_cpuid() and cpu_rdtsc() functions
|
|
||||||
* are implemented in separate .asm files. Otherwise, use inline assembly
|
|
||||||
*/
|
|
||||||
void exec_cpuid(uint32_t *regs)
|
|
||||||
{
|
|
||||||
#ifdef COMPILER_GCC
|
|
||||||
# ifdef PLATFORM_X64
|
|
||||||
__asm __volatile(
|
|
||||||
" mov %0, %%rdi\n"
|
|
||||||
|
|
||||||
" push %%rbx\n"
|
|
||||||
" push %%rcx\n"
|
|
||||||
" push %%rdx\n"
|
|
||||||
|
|
||||||
" mov (%%rdi), %%eax\n"
|
|
||||||
" mov 4(%%rdi), %%ebx\n"
|
|
||||||
" mov 8(%%rdi), %%ecx\n"
|
|
||||||
" mov 12(%%rdi), %%edx\n"
|
|
||||||
|
|
||||||
" cpuid\n"
|
|
||||||
|
|
||||||
" movl %%eax, (%%rdi)\n"
|
|
||||||
" movl %%ebx, 4(%%rdi)\n"
|
|
||||||
" movl %%ecx, 8(%%rdi)\n"
|
|
||||||
" movl %%edx, 12(%%rdi)\n"
|
|
||||||
" pop %%rdx\n"
|
|
||||||
" pop %%rcx\n"
|
|
||||||
" pop %%rbx\n"
|
|
||||||
:
|
|
||||||
:"m"(regs)
|
|
||||||
:"memory", "eax", "rdi"
|
|
||||||
);
|
|
||||||
# else
|
|
||||||
__asm __volatile(
|
|
||||||
" mov %0, %%edi\n"
|
|
||||||
|
|
||||||
" push %%ebx\n"
|
|
||||||
" push %%ecx\n"
|
|
||||||
" push %%edx\n"
|
|
||||||
|
|
||||||
" mov (%%edi), %%eax\n"
|
|
||||||
" mov 4(%%edi), %%ebx\n"
|
|
||||||
" mov 8(%%edi), %%ecx\n"
|
|
||||||
" mov 12(%%edi), %%edx\n"
|
|
||||||
|
|
||||||
" cpuid\n"
|
|
||||||
|
|
||||||
" mov %%eax, (%%edi)\n"
|
|
||||||
" mov %%ebx, 4(%%edi)\n"
|
|
||||||
" mov %%ecx, 8(%%edi)\n"
|
|
||||||
" mov %%edx, 12(%%edi)\n"
|
|
||||||
" pop %%edx\n"
|
|
||||||
" pop %%ecx\n"
|
|
||||||
" pop %%ebx\n"
|
|
||||||
:
|
|
||||||
:"m"(regs)
|
|
||||||
:"memory", "eax", "edi"
|
|
||||||
);
|
|
||||||
# endif /* COMPILER_GCC */
|
|
||||||
#else
|
|
||||||
# ifdef COMPILER_MICROSOFT
|
|
||||||
__asm {
|
|
||||||
push ebx
|
|
||||||
push ecx
|
|
||||||
push edx
|
|
||||||
push edi
|
|
||||||
mov edi, regs
|
|
||||||
|
|
||||||
mov eax, [edi]
|
|
||||||
mov ebx, [edi+4]
|
|
||||||
mov ecx, [edi+8]
|
|
||||||
mov edx, [edi+12]
|
|
||||||
|
|
||||||
cpuid
|
|
||||||
|
|
||||||
mov [edi], eax
|
|
||||||
mov [edi+4], ebx
|
|
||||||
mov [edi+8], ecx
|
|
||||||
mov [edi+12], edx
|
|
||||||
|
|
||||||
pop edi
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop ebx
|
|
||||||
}
|
|
||||||
# else
|
|
||||||
# error "Unsupported compiler"
|
|
||||||
# endif /* COMPILER_MICROSOFT */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif /* INLINE_ASSEMBLY_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef INLINE_ASM_SUPPORTED
|
|
||||||
void cpu_rdtsc(uint64_t* result)
|
|
||||||
{
|
|
||||||
uint32_t low_part, hi_part;
|
|
||||||
#ifdef COMPILER_GCC
|
|
||||||
__asm __volatile (
|
|
||||||
" rdtsc\n"
|
|
||||||
" mov %%eax, %0\n"
|
|
||||||
" mov %%edx, %1\n"
|
|
||||||
:"=m"(low_part), "=m"(hi_part)::"memory", "eax", "edx"
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
# ifdef COMPILER_MICROSOFT
|
|
||||||
__asm {
|
|
||||||
rdtsc
|
|
||||||
mov low_part, eax
|
|
||||||
mov hi_part, edx
|
|
||||||
};
|
|
||||||
# else
|
|
||||||
# error "Unsupported compiler"
|
|
||||||
# endif /* COMPILER_MICROSOFT */
|
|
||||||
#endif /* COMPILER_GCC */
|
|
||||||
*result = (uint64_t)low_part + (((uint64_t) hi_part) << 32);
|
|
||||||
}
|
|
||||||
#endif /* INLINE_ASM_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef INLINE_ASM_SUPPORTED
|
|
||||||
void busy_sse_loop(int cycles)
|
|
||||||
{
|
|
||||||
#ifdef COMPILER_GCC
|
|
||||||
#ifndef __APPLE__
|
|
||||||
# define XALIGN ".balign 16\n"
|
|
||||||
#else
|
|
||||||
# define XALIGN ".align 4\n"
|
|
||||||
#endif
|
|
||||||
__asm __volatile (
|
|
||||||
" xorps %%xmm0, %%xmm0\n"
|
|
||||||
" xorps %%xmm1, %%xmm1\n"
|
|
||||||
" xorps %%xmm2, %%xmm2\n"
|
|
||||||
" xorps %%xmm3, %%xmm3\n"
|
|
||||||
" xorps %%xmm4, %%xmm4\n"
|
|
||||||
" xorps %%xmm5, %%xmm5\n"
|
|
||||||
" xorps %%xmm6, %%xmm6\n"
|
|
||||||
" xorps %%xmm7, %%xmm7\n"
|
|
||||||
XALIGN
|
|
||||||
/* ".bsLoop:\n" */
|
|
||||||
"1:\n"
|
|
||||||
// 0:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 1:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 2:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 3:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 4:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 5:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 6:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 7:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 8:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
// 9:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//10:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//11:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//12:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//13:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//14:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//15:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//16:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//17:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//18:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//19:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//20:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//21:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//22:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//23:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//24:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//25:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//26:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//27:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//28:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//29:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//30:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
//31:
|
|
||||||
" addps %%xmm1, %%xmm0\n"
|
|
||||||
" addps %%xmm2, %%xmm1\n"
|
|
||||||
" addps %%xmm3, %%xmm2\n"
|
|
||||||
" addps %%xmm4, %%xmm3\n"
|
|
||||||
" addps %%xmm5, %%xmm4\n"
|
|
||||||
" addps %%xmm6, %%xmm5\n"
|
|
||||||
" addps %%xmm7, %%xmm6\n"
|
|
||||||
" addps %%xmm0, %%xmm7\n"
|
|
||||||
|
|
||||||
" dec %%eax\n"
|
|
||||||
/* "jnz .bsLoop\n" */
|
|
||||||
" jnz 1b\n"
|
|
||||||
::"a"(cycles)
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
# ifdef COMPILER_MICROSOFT
|
|
||||||
__asm {
|
|
||||||
mov eax, cycles
|
|
||||||
xorps xmm0, xmm0
|
|
||||||
xorps xmm1, xmm1
|
|
||||||
xorps xmm2, xmm2
|
|
||||||
xorps xmm3, xmm3
|
|
||||||
xorps xmm4, xmm4
|
|
||||||
xorps xmm5, xmm5
|
|
||||||
xorps xmm6, xmm6
|
|
||||||
xorps xmm7, xmm7
|
|
||||||
//--
|
|
||||||
align 16
|
|
||||||
bsLoop:
|
|
||||||
// 0:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 1:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 2:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 3:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 4:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 5:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 6:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 7:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 8:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 9:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 10:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 11:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 12:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 13:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 14:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 15:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 16:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 17:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 18:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 19:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 20:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 21:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 22:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 23:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 24:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 25:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 26:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 27:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 28:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 29:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 30:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
// 31:
|
|
||||||
addps xmm0, xmm1
|
|
||||||
addps xmm1, xmm2
|
|
||||||
addps xmm2, xmm3
|
|
||||||
addps xmm3, xmm4
|
|
||||||
addps xmm4, xmm5
|
|
||||||
addps xmm5, xmm6
|
|
||||||
addps xmm6, xmm7
|
|
||||||
addps xmm7, xmm0
|
|
||||||
//----------------------
|
|
||||||
dec eax
|
|
||||||
jnz bsLoop
|
|
||||||
}
|
|
||||||
# else
|
|
||||||
# error "Unsupported compiler"
|
|
||||||
# endif /* COMPILER_MICROSOFT */
|
|
||||||
#endif /* COMPILER_GCC */
|
|
||||||
}
|
|
||||||
#endif /* INLINE_ASSEMBLY_SUPPORTED */
|
|
@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __ASM_BITS_H__
|
|
||||||
#define __ASM_BITS_H__
|
|
||||||
#include "libcpuid.h"
|
|
||||||
|
|
||||||
/* Determine Compiler: */
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
# define COMPILER_MICROSOFT
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
# define COMPILER_GCC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Determine Platform */
|
|
||||||
#if defined(__x86_64__) || defined(_M_AMD64)
|
|
||||||
# define PLATFORM_X64
|
|
||||||
#elif defined(__i386__) || defined(_M_IX86)
|
|
||||||
# define PLATFORM_X86
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Under Windows/AMD64 with MSVC, inline assembly isn't supported */
|
|
||||||
#if (defined(COMPILER_GCC) && defined(PLATFORM_X64)) || defined(PLATFORM_X86)
|
|
||||||
# define INLINE_ASM_SUPPORTED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int cpuid_exists_by_eflags(void);
|
|
||||||
void exec_cpuid(uint32_t *regs);
|
|
||||||
void busy_sse_loop(int cycles);
|
|
||||||
|
|
||||||
#endif /* __ASM_BITS_H__ */
|
|
@ -1,2 +0,0 @@
|
|||||||
/* Version number of package */
|
|
||||||
#define VERSION "0.4.0"
|
|
@ -1,771 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "libcpuid_internal.h"
|
|
||||||
#include "recog_intel.h"
|
|
||||||
#include "recog_amd.h"
|
|
||||||
#include "asm-bits.h"
|
|
||||||
#include "libcpuid_util.h"
|
|
||||||
//#ifdef HAVE_CONFIG_H // CLICKHOUSE PATCH
|
|
||||||
#include "config.h"
|
|
||||||
//#endif // CLICKHOUSE PATCH
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Implementation: */
|
|
||||||
|
|
||||||
_Thread_local int _libcpiud_errno = ERR_OK;
|
|
||||||
|
|
||||||
int set_error(cpu_error_t err)
|
|
||||||
{
|
|
||||||
_libcpiud_errno = (int) err;
|
|
||||||
return (int) err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void raw_data_t_constructor(struct cpu_raw_data_t* raw)
|
|
||||||
{
|
|
||||||
memset(raw, 0, sizeof(struct cpu_raw_data_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cpu_id_t_constructor(struct cpu_id_t* id)
|
|
||||||
{
|
|
||||||
memset(id, 0, sizeof(struct cpu_id_t));
|
|
||||||
id->l1_data_cache = id->l1_instruction_cache = id->l2_cache = id->l3_cache = id->l4_cache = -1;
|
|
||||||
id->l1_assoc = id->l2_assoc = id->l3_assoc = id->l4_assoc = -1;
|
|
||||||
id->l1_cacheline = id->l2_cacheline = id->l3_cacheline = id->l4_cacheline = -1;
|
|
||||||
id->sse_size = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int parse_token(const char* expected_token, const char *token,
|
|
||||||
const char *value, uint32_t array[][4], int limit, int *recognized)
|
|
||||||
{
|
|
||||||
char format[32];
|
|
||||||
int veax, vebx, vecx, vedx;
|
|
||||||
int index;
|
|
||||||
|
|
||||||
if (*recognized) return 1; /* already recognized */
|
|
||||||
if (strncmp(token, expected_token, strlen(expected_token))) return 1; /* not what we search for */
|
|
||||||
sprintf(format, "%s[%%d]", expected_token);
|
|
||||||
*recognized = 1;
|
|
||||||
if (1 == sscanf(token, format, &index) && index >=0 && index < limit) {
|
|
||||||
if (4 == sscanf(value, "%x%x%x%x", &veax, &vebx, &vecx, &vedx)) {
|
|
||||||
array[index][0] = veax;
|
|
||||||
array[index][1] = vebx;
|
|
||||||
array[index][2] = vecx;
|
|
||||||
array[index][3] = vedx;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get_total_cpus() system specific code: uses OS routines to determine total number of CPUs */
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <mach/clock_types.h>
|
|
||||||
#include <mach/clock.h>
|
|
||||||
#include <mach/mach.h>
|
|
||||||
static int get_total_cpus(void)
|
|
||||||
{
|
|
||||||
kern_return_t kr;
|
|
||||||
host_basic_info_data_t basic_info;
|
|
||||||
host_info_t info = (host_info_t)&basic_info;
|
|
||||||
host_flavor_t flavor = HOST_BASIC_INFO;
|
|
||||||
mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;
|
|
||||||
kr = host_info(mach_host_self(), flavor, info, &count);
|
|
||||||
if (kr != KERN_SUCCESS) return 1;
|
|
||||||
return basic_info.avail_cpus;
|
|
||||||
}
|
|
||||||
#define GET_TOTAL_CPUS_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
static int get_total_cpus(void)
|
|
||||||
{
|
|
||||||
SYSTEM_INFO system_info;
|
|
||||||
GetSystemInfo(&system_info);
|
|
||||||
return system_info.dwNumberOfProcessors;
|
|
||||||
}
|
|
||||||
#define GET_TOTAL_CPUS_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined linux || defined __linux__ || defined __sun
|
|
||||||
#include <sys/sysinfo.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static int get_total_cpus(void)
|
|
||||||
{
|
|
||||||
return sysconf(_SC_NPROCESSORS_ONLN);
|
|
||||||
}
|
|
||||||
#define GET_TOTAL_CPUS_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __bsdi__ || defined __QNX__
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
|
|
||||||
static int get_total_cpus(void)
|
|
||||||
{
|
|
||||||
int mib[2] = { CTL_HW, HW_NCPU };
|
|
||||||
int ncpus;
|
|
||||||
size_t len = sizeof(ncpus);
|
|
||||||
if (sysctl(mib, 2, &ncpus, &len, (void *) 0, 0) != 0) return 1;
|
|
||||||
return ncpus;
|
|
||||||
}
|
|
||||||
#define GET_TOTAL_CPUS_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef GET_TOTAL_CPUS_DEFINED
|
|
||||||
static int get_total_cpus(void)
|
|
||||||
{
|
|
||||||
static int warning_printed = 0;
|
|
||||||
if (!warning_printed) {
|
|
||||||
warning_printed = 1;
|
|
||||||
warnf("Your system is not supported by libcpuid -- don't know how to detect the\n");
|
|
||||||
warnf("total number of CPUs on your system. It will be reported as 1.\n");
|
|
||||||
printf("Please use cpu_id_t.logical_cpus field instead.\n");
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif /* GET_TOTAL_CPUS_DEFINED */
|
|
||||||
|
|
||||||
|
|
||||||
static void load_features_common(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
const struct feature_map_t matchtable_edx1[] = {
|
|
||||||
{ 0, CPU_FEATURE_FPU },
|
|
||||||
{ 1, CPU_FEATURE_VME },
|
|
||||||
{ 2, CPU_FEATURE_DE },
|
|
||||||
{ 3, CPU_FEATURE_PSE },
|
|
||||||
{ 4, CPU_FEATURE_TSC },
|
|
||||||
{ 5, CPU_FEATURE_MSR },
|
|
||||||
{ 6, CPU_FEATURE_PAE },
|
|
||||||
{ 7, CPU_FEATURE_MCE },
|
|
||||||
{ 8, CPU_FEATURE_CX8 },
|
|
||||||
{ 9, CPU_FEATURE_APIC },
|
|
||||||
{ 11, CPU_FEATURE_SEP },
|
|
||||||
{ 12, CPU_FEATURE_MTRR },
|
|
||||||
{ 13, CPU_FEATURE_PGE },
|
|
||||||
{ 14, CPU_FEATURE_MCA },
|
|
||||||
{ 15, CPU_FEATURE_CMOV },
|
|
||||||
{ 16, CPU_FEATURE_PAT },
|
|
||||||
{ 17, CPU_FEATURE_PSE36 },
|
|
||||||
{ 19, CPU_FEATURE_CLFLUSH },
|
|
||||||
{ 23, CPU_FEATURE_MMX },
|
|
||||||
{ 24, CPU_FEATURE_FXSR },
|
|
||||||
{ 25, CPU_FEATURE_SSE },
|
|
||||||
{ 26, CPU_FEATURE_SSE2 },
|
|
||||||
{ 28, CPU_FEATURE_HT },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_ecx1[] = {
|
|
||||||
{ 0, CPU_FEATURE_PNI },
|
|
||||||
{ 1, CPU_FEATURE_PCLMUL },
|
|
||||||
{ 3, CPU_FEATURE_MONITOR },
|
|
||||||
{ 9, CPU_FEATURE_SSSE3 },
|
|
||||||
{ 12, CPU_FEATURE_FMA3 },
|
|
||||||
{ 13, CPU_FEATURE_CX16 },
|
|
||||||
{ 19, CPU_FEATURE_SSE4_1 },
|
|
||||||
{ 20, CPU_FEATURE_SSE4_2 },
|
|
||||||
{ 22, CPU_FEATURE_MOVBE },
|
|
||||||
{ 23, CPU_FEATURE_POPCNT },
|
|
||||||
{ 25, CPU_FEATURE_AES },
|
|
||||||
{ 26, CPU_FEATURE_XSAVE },
|
|
||||||
{ 27, CPU_FEATURE_OSXSAVE },
|
|
||||||
{ 28, CPU_FEATURE_AVX },
|
|
||||||
{ 29, CPU_FEATURE_F16C },
|
|
||||||
{ 30, CPU_FEATURE_RDRAND },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_ebx7[] = {
|
|
||||||
{ 3, CPU_FEATURE_BMI1 },
|
|
||||||
{ 5, CPU_FEATURE_AVX2 },
|
|
||||||
{ 8, CPU_FEATURE_BMI2 },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_edx81[] = {
|
|
||||||
{ 11, CPU_FEATURE_SYSCALL },
|
|
||||||
{ 27, CPU_FEATURE_RDTSCP },
|
|
||||||
{ 29, CPU_FEATURE_LM },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_ecx81[] = {
|
|
||||||
{ 0, CPU_FEATURE_LAHF_LM },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_edx87[] = {
|
|
||||||
{ 8, CPU_FEATURE_CONSTANT_TSC },
|
|
||||||
};
|
|
||||||
if (raw->basic_cpuid[0][0] >= 1) {
|
|
||||||
match_features(matchtable_edx1, COUNT_OF(matchtable_edx1), raw->basic_cpuid[1][3], data);
|
|
||||||
match_features(matchtable_ecx1, COUNT_OF(matchtable_ecx1), raw->basic_cpuid[1][2], data);
|
|
||||||
}
|
|
||||||
if (raw->basic_cpuid[0][0] >= 7) {
|
|
||||||
match_features(matchtable_ebx7, COUNT_OF(matchtable_ebx7), raw->basic_cpuid[7][1], data);
|
|
||||||
}
|
|
||||||
if (raw->ext_cpuid[0][0] >= 0x80000001) {
|
|
||||||
match_features(matchtable_edx81, COUNT_OF(matchtable_edx81), raw->ext_cpuid[1][3], data);
|
|
||||||
match_features(matchtable_ecx81, COUNT_OF(matchtable_ecx81), raw->ext_cpuid[1][2], data);
|
|
||||||
}
|
|
||||||
if (raw->ext_cpuid[0][0] >= 0x80000007) {
|
|
||||||
match_features(matchtable_edx87, COUNT_OF(matchtable_edx87), raw->ext_cpuid[7][3], data);
|
|
||||||
}
|
|
||||||
if (data->flags[CPU_FEATURE_SSE]) {
|
|
||||||
/* apply guesswork to check if the SSE unit width is 128 bit */
|
|
||||||
switch (data->vendor) {
|
|
||||||
case VENDOR_AMD:
|
|
||||||
data->sse_size = (data->ext_family >= 16 && data->ext_family != 17) ? 128 : 64;
|
|
||||||
break;
|
|
||||||
case VENDOR_INTEL:
|
|
||||||
data->sse_size = (data->family == 6 && data->ext_model >= 15) ? 128 : 64;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* leave the CPU_FEATURE_128BIT_SSE_AUTH 0; the advanced per-vendor detection routines
|
|
||||||
* will set it accordingly if they detect the needed bit */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static cpu_vendor_t cpuid_vendor_identify(const uint32_t *raw_vendor, char *vendor_str)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
cpu_vendor_t vendor = VENDOR_UNKNOWN;
|
|
||||||
const struct { cpu_vendor_t vendor; char match[16]; }
|
|
||||||
matchtable[NUM_CPU_VENDORS] = {
|
|
||||||
/* source: http://www.sandpile.org/ia32/cpuid.htm */
|
|
||||||
{ VENDOR_INTEL , "GenuineIntel" },
|
|
||||||
{ VENDOR_AMD , "AuthenticAMD" },
|
|
||||||
{ VENDOR_CYRIX , "CyrixInstead" },
|
|
||||||
{ VENDOR_NEXGEN , "NexGenDriven" },
|
|
||||||
{ VENDOR_TRANSMETA , "GenuineTMx86" },
|
|
||||||
{ VENDOR_UMC , "UMC UMC UMC " },
|
|
||||||
{ VENDOR_CENTAUR , "CentaurHauls" },
|
|
||||||
{ VENDOR_RISE , "RiseRiseRise" },
|
|
||||||
{ VENDOR_SIS , "SiS SiS SiS " },
|
|
||||||
{ VENDOR_NSC , "Geode by NSC" },
|
|
||||||
};
|
|
||||||
|
|
||||||
memcpy(vendor_str + 0, &raw_vendor[1], 4);
|
|
||||||
memcpy(vendor_str + 4, &raw_vendor[3], 4);
|
|
||||||
memcpy(vendor_str + 8, &raw_vendor[2], 4);
|
|
||||||
vendor_str[12] = 0;
|
|
||||||
|
|
||||||
/* Determine vendor: */
|
|
||||||
for (i = 0; i < NUM_CPU_VENDORS; i++)
|
|
||||||
if (!strcmp(vendor_str, matchtable[i].match)) {
|
|
||||||
vendor = matchtable[i].vendor;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return vendor;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cpuid_basic_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int i, j, basic, xmodel, xfamily, ext;
|
|
||||||
char brandstr[64] = {0};
|
|
||||||
data->vendor = cpuid_vendor_identify(raw->basic_cpuid[0], data->vendor_str);
|
|
||||||
|
|
||||||
if (data->vendor == VENDOR_UNKNOWN)
|
|
||||||
return set_error(ERR_CPU_UNKN);
|
|
||||||
basic = raw->basic_cpuid[0][0];
|
|
||||||
if (basic >= 1) {
|
|
||||||
data->family = (raw->basic_cpuid[1][0] >> 8) & 0xf;
|
|
||||||
data->model = (raw->basic_cpuid[1][0] >> 4) & 0xf;
|
|
||||||
data->stepping = raw->basic_cpuid[1][0] & 0xf;
|
|
||||||
xmodel = (raw->basic_cpuid[1][0] >> 16) & 0xf;
|
|
||||||
xfamily = (raw->basic_cpuid[1][0] >> 20) & 0xff;
|
|
||||||
if (data->vendor == VENDOR_AMD && data->family < 0xf)
|
|
||||||
data->ext_family = data->family;
|
|
||||||
else
|
|
||||||
data->ext_family = data->family + xfamily;
|
|
||||||
data->ext_model = data->model + (xmodel << 4);
|
|
||||||
}
|
|
||||||
ext = raw->ext_cpuid[0][0] - 0x8000000;
|
|
||||||
|
|
||||||
/* obtain the brand string, if present: */
|
|
||||||
if (ext >= 4) {
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
for (j = 0; j < 4; j++)
|
|
||||||
memcpy(brandstr + i * 16 + j * 4,
|
|
||||||
&raw->ext_cpuid[2 + i][j], 4);
|
|
||||||
brandstr[48] = 0;
|
|
||||||
i = 0;
|
|
||||||
while (brandstr[i] == ' ') i++;
|
|
||||||
strncpy(data->brand_str, brandstr + i, sizeof(data->brand_str));
|
|
||||||
data->brand_str[48] = 0;
|
|
||||||
}
|
|
||||||
load_features_common(raw, data);
|
|
||||||
data->total_logical_cpus = get_total_cpus();
|
|
||||||
return set_error(ERR_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void make_list_from_string(const char* csv, struct cpu_list_t* list)
|
|
||||||
{
|
|
||||||
int i, n, l, last;
|
|
||||||
l = (int) strlen(csv);
|
|
||||||
n = 0;
|
|
||||||
for (i = 0; i < l; i++) if (csv[i] == ',') n++;
|
|
||||||
n++;
|
|
||||||
list->num_entries = n;
|
|
||||||
list->names = (char**) malloc(sizeof(char*) * n);
|
|
||||||
last = -1;
|
|
||||||
n = 0;
|
|
||||||
for (i = 0; i <= l; i++) if (i == l || csv[i] == ',') {
|
|
||||||
list->names[n] = (char*) malloc(i - last);
|
|
||||||
memcpy(list->names[n], &csv[last + 1], i - last - 1);
|
|
||||||
list->names[n][i - last - 1] = '\0';
|
|
||||||
n++;
|
|
||||||
last = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Interface: */
|
|
||||||
|
|
||||||
int cpuid_get_total_cpus(void)
|
|
||||||
{
|
|
||||||
return get_total_cpus();
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpuid_present(void)
|
|
||||||
{
|
|
||||||
return cpuid_exists_by_eflags();
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpu_exec_cpuid(uint32_t eax, uint32_t* regs)
|
|
||||||
{
|
|
||||||
regs[0] = eax;
|
|
||||||
regs[1] = regs[2] = regs[3] = 0;
|
|
||||||
exec_cpuid(regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpu_exec_cpuid_ext(uint32_t* regs)
|
|
||||||
{
|
|
||||||
exec_cpuid(regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpuid_get_raw_data(struct cpu_raw_data_t* data)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
if (!cpuid_present())
|
|
||||||
return set_error(ERR_NO_CPUID);
|
|
||||||
for (i = 0; i < 32; i++)
|
|
||||||
cpu_exec_cpuid(i, data->basic_cpuid[i]);
|
|
||||||
for (i = 0; i < 32; i++)
|
|
||||||
cpu_exec_cpuid(0x80000000 + i, data->ext_cpuid[i]);
|
|
||||||
for (i = 0; i < MAX_INTELFN4_LEVEL; i++) {
|
|
||||||
memset(data->intel_fn4[i], 0, sizeof(data->intel_fn4[i]));
|
|
||||||
data->intel_fn4[i][0] = 4;
|
|
||||||
data->intel_fn4[i][2] = i;
|
|
||||||
cpu_exec_cpuid_ext(data->intel_fn4[i]);
|
|
||||||
}
|
|
||||||
for (i = 0; i < MAX_INTELFN11_LEVEL; i++) {
|
|
||||||
memset(data->intel_fn11[i], 0, sizeof(data->intel_fn11[i]));
|
|
||||||
data->intel_fn11[i][0] = 11;
|
|
||||||
data->intel_fn11[i][2] = i;
|
|
||||||
cpu_exec_cpuid_ext(data->intel_fn11[i]);
|
|
||||||
}
|
|
||||||
for (i = 0; i < MAX_INTELFN12H_LEVEL; i++) {
|
|
||||||
memset(data->intel_fn12h[i], 0, sizeof(data->intel_fn12h[i]));
|
|
||||||
data->intel_fn12h[i][0] = 0x12;
|
|
||||||
data->intel_fn12h[i][2] = i;
|
|
||||||
cpu_exec_cpuid_ext(data->intel_fn12h[i]);
|
|
||||||
}
|
|
||||||
for (i = 0; i < MAX_INTELFN14H_LEVEL; i++) {
|
|
||||||
memset(data->intel_fn14h[i], 0, sizeof(data->intel_fn14h[i]));
|
|
||||||
data->intel_fn14h[i][0] = 0x14;
|
|
||||||
data->intel_fn14h[i][2] = i;
|
|
||||||
cpu_exec_cpuid_ext(data->intel_fn14h[i]);
|
|
||||||
}
|
|
||||||
return set_error(ERR_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpuid_serialize_raw_data(struct cpu_raw_data_t* data, const char* filename)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if (!strcmp(filename, ""))
|
|
||||||
f = stdout;
|
|
||||||
else
|
|
||||||
f = fopen(filename, "wt");
|
|
||||||
if (!f) return set_error(ERR_OPEN);
|
|
||||||
|
|
||||||
fprintf(f, "version=%s\n", VERSION);
|
|
||||||
for (i = 0; i < MAX_CPUID_LEVEL; i++)
|
|
||||||
fprintf(f, "basic_cpuid[%d]=%08x %08x %08x %08x\n", i,
|
|
||||||
data->basic_cpuid[i][0], data->basic_cpuid[i][1],
|
|
||||||
data->basic_cpuid[i][2], data->basic_cpuid[i][3]);
|
|
||||||
for (i = 0; i < MAX_EXT_CPUID_LEVEL; i++)
|
|
||||||
fprintf(f, "ext_cpuid[%d]=%08x %08x %08x %08x\n", i,
|
|
||||||
data->ext_cpuid[i][0], data->ext_cpuid[i][1],
|
|
||||||
data->ext_cpuid[i][2], data->ext_cpuid[i][3]);
|
|
||||||
for (i = 0; i < MAX_INTELFN4_LEVEL; i++)
|
|
||||||
fprintf(f, "intel_fn4[%d]=%08x %08x %08x %08x\n", i,
|
|
||||||
data->intel_fn4[i][0], data->intel_fn4[i][1],
|
|
||||||
data->intel_fn4[i][2], data->intel_fn4[i][3]);
|
|
||||||
for (i = 0; i < MAX_INTELFN11_LEVEL; i++)
|
|
||||||
fprintf(f, "intel_fn11[%d]=%08x %08x %08x %08x\n", i,
|
|
||||||
data->intel_fn11[i][0], data->intel_fn11[i][1],
|
|
||||||
data->intel_fn11[i][2], data->intel_fn11[i][3]);
|
|
||||||
for (i = 0; i < MAX_INTELFN12H_LEVEL; i++)
|
|
||||||
fprintf(f, "intel_fn12h[%d]=%08x %08x %08x %08x\n", i,
|
|
||||||
data->intel_fn12h[i][0], data->intel_fn12h[i][1],
|
|
||||||
data->intel_fn12h[i][2], data->intel_fn12h[i][3]);
|
|
||||||
for (i = 0; i < MAX_INTELFN14H_LEVEL; i++)
|
|
||||||
fprintf(f, "intel_fn14h[%d]=%08x %08x %08x %08x\n", i,
|
|
||||||
data->intel_fn14h[i][0], data->intel_fn14h[i][1],
|
|
||||||
data->intel_fn14h[i][2], data->intel_fn14h[i][3]);
|
|
||||||
|
|
||||||
if (strcmp(filename, ""))
|
|
||||||
fclose(f);
|
|
||||||
return set_error(ERR_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpuid_deserialize_raw_data(struct cpu_raw_data_t* data, const char* filename)
|
|
||||||
{
|
|
||||||
int i, len;
|
|
||||||
char line[100];
|
|
||||||
char token[100];
|
|
||||||
char *value;
|
|
||||||
int syntax;
|
|
||||||
int cur_line = 0;
|
|
||||||
int recognized;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
raw_data_t_constructor(data);
|
|
||||||
|
|
||||||
if (!strcmp(filename, ""))
|
|
||||||
f = stdin;
|
|
||||||
else
|
|
||||||
f = fopen(filename, "rt");
|
|
||||||
if (!f) return set_error(ERR_OPEN);
|
|
||||||
while (fgets(line, sizeof(line), f)) {
|
|
||||||
++cur_line;
|
|
||||||
len = (int) strlen(line);
|
|
||||||
if (len < 2) continue;
|
|
||||||
if (line[len - 1] == '\n')
|
|
||||||
line[--len] = '\0';
|
|
||||||
for (i = 0; i < len && line[i] != '='; i++)
|
|
||||||
if (i >= len && i < 1 && len - i - 1 <= 0) {
|
|
||||||
fclose(f);
|
|
||||||
return set_error(ERR_BADFMT);
|
|
||||||
}
|
|
||||||
strncpy(token, line, i);
|
|
||||||
token[i] = '\0';
|
|
||||||
value = &line[i + 1];
|
|
||||||
/* try to recognize the line */
|
|
||||||
recognized = 0;
|
|
||||||
if (!strcmp(token, "version") || !strcmp(token, "build_date")) {
|
|
||||||
recognized = 1;
|
|
||||||
}
|
|
||||||
syntax = 1;
|
|
||||||
syntax = syntax && parse_token("basic_cpuid", token, value, data->basic_cpuid, MAX_CPUID_LEVEL, &recognized);
|
|
||||||
syntax = syntax && parse_token("ext_cpuid", token, value, data->ext_cpuid, MAX_EXT_CPUID_LEVEL, &recognized);
|
|
||||||
syntax = syntax && parse_token("intel_fn4", token, value, data->intel_fn4, MAX_INTELFN4_LEVEL, &recognized);
|
|
||||||
syntax = syntax && parse_token("intel_fn11", token, value, data->intel_fn11, MAX_INTELFN11_LEVEL, &recognized);
|
|
||||||
syntax = syntax && parse_token("intel_fn12h", token, value, data->intel_fn12h, MAX_INTELFN12H_LEVEL, &recognized);
|
|
||||||
syntax = syntax && parse_token("intel_fn14h", token, value, data->intel_fn14h, MAX_INTELFN14H_LEVEL, &recognized);
|
|
||||||
if (!syntax) {
|
|
||||||
warnf("Error: %s:%d: Syntax error\n", filename, cur_line);
|
|
||||||
fclose(f);
|
|
||||||
return set_error(ERR_BADFMT);
|
|
||||||
}
|
|
||||||
if (!recognized) {
|
|
||||||
warnf("Warning: %s:%d not understood!\n", filename, cur_line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(filename, ""))
|
|
||||||
fclose(f);
|
|
||||||
return set_error(ERR_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
struct cpu_raw_data_t myraw;
|
|
||||||
if (!raw) {
|
|
||||||
if ((r = cpuid_get_raw_data(&myraw)) < 0)
|
|
||||||
return set_error(r);
|
|
||||||
raw = &myraw;
|
|
||||||
}
|
|
||||||
cpu_id_t_constructor(data);
|
|
||||||
if ((r = cpuid_basic_identify(raw, data)) < 0)
|
|
||||||
return set_error(r);
|
|
||||||
switch (data->vendor) {
|
|
||||||
case VENDOR_INTEL:
|
|
||||||
r = cpuid_identify_intel(raw, data, internal);
|
|
||||||
break;
|
|
||||||
case VENDOR_AMD:
|
|
||||||
r = cpuid_identify_amd(raw, data, internal);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return set_error(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_identify(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
struct internal_id_info_t throwaway;
|
|
||||||
return cpu_ident_internal(raw, data, &throwaway);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* cpu_feature_str(cpu_feature_t feature)
|
|
||||||
{
|
|
||||||
const struct { cpu_feature_t feature; const char* name; }
|
|
||||||
matchtable[] = {
|
|
||||||
{ CPU_FEATURE_FPU, "fpu" },
|
|
||||||
{ CPU_FEATURE_VME, "vme" },
|
|
||||||
{ CPU_FEATURE_DE, "de" },
|
|
||||||
{ CPU_FEATURE_PSE, "pse" },
|
|
||||||
{ CPU_FEATURE_TSC, "tsc" },
|
|
||||||
{ CPU_FEATURE_MSR, "msr" },
|
|
||||||
{ CPU_FEATURE_PAE, "pae" },
|
|
||||||
{ CPU_FEATURE_MCE, "mce" },
|
|
||||||
{ CPU_FEATURE_CX8, "cx8" },
|
|
||||||
{ CPU_FEATURE_APIC, "apic" },
|
|
||||||
{ CPU_FEATURE_MTRR, "mtrr" },
|
|
||||||
{ CPU_FEATURE_SEP, "sep" },
|
|
||||||
{ CPU_FEATURE_PGE, "pge" },
|
|
||||||
{ CPU_FEATURE_MCA, "mca" },
|
|
||||||
{ CPU_FEATURE_CMOV, "cmov" },
|
|
||||||
{ CPU_FEATURE_PAT, "pat" },
|
|
||||||
{ CPU_FEATURE_PSE36, "pse36" },
|
|
||||||
{ CPU_FEATURE_PN, "pn" },
|
|
||||||
{ CPU_FEATURE_CLFLUSH, "clflush" },
|
|
||||||
{ CPU_FEATURE_DTS, "dts" },
|
|
||||||
{ CPU_FEATURE_ACPI, "acpi" },
|
|
||||||
{ CPU_FEATURE_MMX, "mmx" },
|
|
||||||
{ CPU_FEATURE_FXSR, "fxsr" },
|
|
||||||
{ CPU_FEATURE_SSE, "sse" },
|
|
||||||
{ CPU_FEATURE_SSE2, "sse2" },
|
|
||||||
{ CPU_FEATURE_SS, "ss" },
|
|
||||||
{ CPU_FEATURE_HT, "ht" },
|
|
||||||
{ CPU_FEATURE_TM, "tm" },
|
|
||||||
{ CPU_FEATURE_IA64, "ia64" },
|
|
||||||
{ CPU_FEATURE_PBE, "pbe" },
|
|
||||||
{ CPU_FEATURE_PNI, "pni" },
|
|
||||||
{ CPU_FEATURE_PCLMUL, "pclmul" },
|
|
||||||
{ CPU_FEATURE_DTS64, "dts64" },
|
|
||||||
{ CPU_FEATURE_MONITOR, "monitor" },
|
|
||||||
{ CPU_FEATURE_DS_CPL, "ds_cpl" },
|
|
||||||
{ CPU_FEATURE_VMX, "vmx" },
|
|
||||||
{ CPU_FEATURE_SMX, "smx" },
|
|
||||||
{ CPU_FEATURE_EST, "est" },
|
|
||||||
{ CPU_FEATURE_TM2, "tm2" },
|
|
||||||
{ CPU_FEATURE_SSSE3, "ssse3" },
|
|
||||||
{ CPU_FEATURE_CID, "cid" },
|
|
||||||
{ CPU_FEATURE_CX16, "cx16" },
|
|
||||||
{ CPU_FEATURE_XTPR, "xtpr" },
|
|
||||||
{ CPU_FEATURE_PDCM, "pdcm" },
|
|
||||||
{ CPU_FEATURE_DCA, "dca" },
|
|
||||||
{ CPU_FEATURE_SSE4_1, "sse4_1" },
|
|
||||||
{ CPU_FEATURE_SSE4_2, "sse4_2" },
|
|
||||||
{ CPU_FEATURE_SYSCALL, "syscall" },
|
|
||||||
{ CPU_FEATURE_XD, "xd" },
|
|
||||||
{ CPU_FEATURE_X2APIC, "x2apic"},
|
|
||||||
{ CPU_FEATURE_MOVBE, "movbe" },
|
|
||||||
{ CPU_FEATURE_POPCNT, "popcnt" },
|
|
||||||
{ CPU_FEATURE_AES, "aes" },
|
|
||||||
{ CPU_FEATURE_XSAVE, "xsave" },
|
|
||||||
{ CPU_FEATURE_OSXSAVE, "osxsave" },
|
|
||||||
{ CPU_FEATURE_AVX, "avx" },
|
|
||||||
{ CPU_FEATURE_MMXEXT, "mmxext" },
|
|
||||||
{ CPU_FEATURE_3DNOW, "3dnow" },
|
|
||||||
{ CPU_FEATURE_3DNOWEXT, "3dnowext" },
|
|
||||||
{ CPU_FEATURE_NX, "nx" },
|
|
||||||
{ CPU_FEATURE_FXSR_OPT, "fxsr_opt" },
|
|
||||||
{ CPU_FEATURE_RDTSCP, "rdtscp" },
|
|
||||||
{ CPU_FEATURE_LM, "lm" },
|
|
||||||
{ CPU_FEATURE_LAHF_LM, "lahf_lm" },
|
|
||||||
{ CPU_FEATURE_CMP_LEGACY, "cmp_legacy" },
|
|
||||||
{ CPU_FEATURE_SVM, "svm" },
|
|
||||||
{ CPU_FEATURE_SSE4A, "sse4a" },
|
|
||||||
{ CPU_FEATURE_MISALIGNSSE, "misalignsse" },
|
|
||||||
{ CPU_FEATURE_ABM, "abm" },
|
|
||||||
{ CPU_FEATURE_3DNOWPREFETCH, "3dnowprefetch" },
|
|
||||||
{ CPU_FEATURE_OSVW, "osvw" },
|
|
||||||
{ CPU_FEATURE_IBS, "ibs" },
|
|
||||||
{ CPU_FEATURE_SSE5, "sse5" },
|
|
||||||
{ CPU_FEATURE_SKINIT, "skinit" },
|
|
||||||
{ CPU_FEATURE_WDT, "wdt" },
|
|
||||||
{ CPU_FEATURE_TS, "ts" },
|
|
||||||
{ CPU_FEATURE_FID, "fid" },
|
|
||||||
{ CPU_FEATURE_VID, "vid" },
|
|
||||||
{ CPU_FEATURE_TTP, "ttp" },
|
|
||||||
{ CPU_FEATURE_TM_AMD, "tm_amd" },
|
|
||||||
{ CPU_FEATURE_STC, "stc" },
|
|
||||||
{ CPU_FEATURE_100MHZSTEPS, "100mhzsteps" },
|
|
||||||
{ CPU_FEATURE_HWPSTATE, "hwpstate" },
|
|
||||||
{ CPU_FEATURE_CONSTANT_TSC, "constant_tsc" },
|
|
||||||
{ CPU_FEATURE_XOP, "xop" },
|
|
||||||
{ CPU_FEATURE_FMA3, "fma3" },
|
|
||||||
{ CPU_FEATURE_FMA4, "fma4" },
|
|
||||||
{ CPU_FEATURE_TBM, "tbm" },
|
|
||||||
{ CPU_FEATURE_F16C, "f16c" },
|
|
||||||
{ CPU_FEATURE_RDRAND, "rdrand" },
|
|
||||||
{ CPU_FEATURE_CPB, "cpb" },
|
|
||||||
{ CPU_FEATURE_APERFMPERF, "aperfmperf" },
|
|
||||||
{ CPU_FEATURE_PFI, "pfi" },
|
|
||||||
{ CPU_FEATURE_PA, "pa" },
|
|
||||||
{ CPU_FEATURE_AVX2, "avx2" },
|
|
||||||
{ CPU_FEATURE_BMI1, "bmi1" },
|
|
||||||
{ CPU_FEATURE_BMI2, "bmi2" },
|
|
||||||
{ CPU_FEATURE_HLE, "hle" },
|
|
||||||
{ CPU_FEATURE_RTM, "rtm" },
|
|
||||||
{ CPU_FEATURE_AVX512F, "avx512f" },
|
|
||||||
{ CPU_FEATURE_AVX512DQ, "avx512dq" },
|
|
||||||
{ CPU_FEATURE_AVX512PF, "avx512pf" },
|
|
||||||
{ CPU_FEATURE_AVX512ER, "avx512er" },
|
|
||||||
{ CPU_FEATURE_AVX512CD, "avx512cd" },
|
|
||||||
{ CPU_FEATURE_SHA_NI, "sha_ni" },
|
|
||||||
{ CPU_FEATURE_AVX512BW, "avx512bw" },
|
|
||||||
{ CPU_FEATURE_AVX512VL, "avx512vl" },
|
|
||||||
{ CPU_FEATURE_SGX, "sgx" },
|
|
||||||
{ CPU_FEATURE_RDSEED, "rdseed" },
|
|
||||||
{ CPU_FEATURE_ADX, "adx" },
|
|
||||||
};
|
|
||||||
unsigned i, n = COUNT_OF(matchtable);
|
|
||||||
if (n != NUM_CPU_FEATURES) {
|
|
||||||
warnf("Warning: incomplete library, feature matchtable size differs from the actual number of features.\n");
|
|
||||||
}
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
if (matchtable[i].feature == feature)
|
|
||||||
return matchtable[i].name;
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* cpuid_error(void)
|
|
||||||
{
|
|
||||||
const struct { cpu_error_t error; const char *description; }
|
|
||||||
matchtable[] = {
|
|
||||||
{ ERR_OK , "No error"},
|
|
||||||
{ ERR_NO_CPUID , "CPUID instruction is not supported"},
|
|
||||||
{ ERR_NO_RDTSC , "RDTSC instruction is not supported"},
|
|
||||||
{ ERR_NO_MEM , "Memory allocation failed"},
|
|
||||||
{ ERR_OPEN , "File open operation failed"},
|
|
||||||
{ ERR_BADFMT , "Bad file format"},
|
|
||||||
{ ERR_NOT_IMP , "Not implemented"},
|
|
||||||
{ ERR_CPU_UNKN , "Unsupported processor"},
|
|
||||||
{ ERR_NO_RDMSR , "RDMSR instruction is not supported"},
|
|
||||||
{ ERR_NO_DRIVER, "RDMSR driver error (generic)"},
|
|
||||||
{ ERR_NO_PERMS , "No permissions to install RDMSR driver"},
|
|
||||||
{ ERR_EXTRACT , "Cannot extract RDMSR driver (read only media?)"},
|
|
||||||
{ ERR_HANDLE , "Bad handle"},
|
|
||||||
{ ERR_INVMSR , "Invalid MSR"},
|
|
||||||
{ ERR_INVCNB , "Invalid core number"},
|
|
||||||
{ ERR_HANDLE_R , "Error on handle read"},
|
|
||||||
{ ERR_INVRANGE , "Invalid given range"},
|
|
||||||
};
|
|
||||||
unsigned i;
|
|
||||||
for (i = 0; i < COUNT_OF(matchtable); i++)
|
|
||||||
if (_libcpiud_errno == matchtable[i].error)
|
|
||||||
return matchtable[i].description;
|
|
||||||
return "Unknown error";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const char* cpuid_lib_version(void)
|
|
||||||
{
|
|
||||||
return VERSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
libcpuid_warn_fn_t cpuid_set_warn_function(libcpuid_warn_fn_t new_fn)
|
|
||||||
{
|
|
||||||
libcpuid_warn_fn_t ret = _warn_fun;
|
|
||||||
_warn_fun = new_fn;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpuid_set_verbosiness_level(int level)
|
|
||||||
{
|
|
||||||
_current_verboselevel = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu_vendor_t cpuid_get_vendor(void)
|
|
||||||
{
|
|
||||||
static cpu_vendor_t vendor = VENDOR_UNKNOWN;
|
|
||||||
uint32_t raw_vendor[4];
|
|
||||||
char vendor_str[VENDOR_STR_MAX];
|
|
||||||
|
|
||||||
if(vendor == VENDOR_UNKNOWN) {
|
|
||||||
if (!cpuid_present())
|
|
||||||
set_error(ERR_NO_CPUID);
|
|
||||||
else {
|
|
||||||
cpu_exec_cpuid(0, raw_vendor);
|
|
||||||
vendor = cpuid_vendor_identify(raw_vendor, vendor_str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return vendor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpuid_get_cpu_list(cpu_vendor_t vendor, struct cpu_list_t* list)
|
|
||||||
{
|
|
||||||
switch (vendor) {
|
|
||||||
case VENDOR_INTEL:
|
|
||||||
cpuid_get_list_intel(list);
|
|
||||||
break;
|
|
||||||
case VENDOR_AMD:
|
|
||||||
cpuid_get_list_amd(list);
|
|
||||||
break;
|
|
||||||
case VENDOR_CYRIX:
|
|
||||||
make_list_from_string("Cx486,Cx5x86,6x86,6x86MX,M II,MediaGX,MediaGXi,MediaGXm", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_NEXGEN:
|
|
||||||
make_list_from_string("Nx586", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_TRANSMETA:
|
|
||||||
make_list_from_string("Crusoe,Efficeon", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_UMC:
|
|
||||||
make_list_from_string("UMC x86 CPU", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_CENTAUR:
|
|
||||||
make_list_from_string("VIA C3,VIA C7,VIA Nano", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_RISE:
|
|
||||||
make_list_from_string("Rise mP6", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_SIS:
|
|
||||||
make_list_from_string("SiS mP6", list);
|
|
||||||
break;
|
|
||||||
case VENDOR_NSC:
|
|
||||||
make_list_from_string("Geode GXm,Geode GXLV,Geode GX1,Geode GX2", list);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
warnf("Unknown vendor passed to cpuid_get_cpu_list()\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpuid_free_cpu_list(struct cpu_list_t* list)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
if (list->num_entries <= 0) return;
|
|
||||||
for (i = 0; i < list->num_entries; i++)
|
|
||||||
free(list->names[i]);
|
|
||||||
free(list->names);
|
|
||||||
}
|
|
@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains a list of internal codes we use in detection. It is
|
|
||||||
* of no external use and isn't a complete list of intel products.
|
|
||||||
*/
|
|
||||||
CODE2(PENTIUM, 2000),
|
|
||||||
CODE(MOBILE_PENTIUM),
|
|
||||||
|
|
||||||
CODE(XEON),
|
|
||||||
CODE(XEON_IRWIN),
|
|
||||||
CODE(XEONMP),
|
|
||||||
CODE(XEON_POTOMAC),
|
|
||||||
CODE(XEON_I7),
|
|
||||||
CODE(XEON_GAINESTOWN),
|
|
||||||
CODE(XEON_WESTMERE),
|
|
||||||
|
|
||||||
CODE(MOBILE_PENTIUM_M),
|
|
||||||
CODE(CELERON),
|
|
||||||
CODE(MOBILE_CELERON),
|
|
||||||
CODE(NOT_CELERON),
|
|
||||||
|
|
||||||
|
|
||||||
CODE(CORE_SOLO),
|
|
||||||
CODE(MOBILE_CORE_SOLO),
|
|
||||||
CODE(CORE_DUO),
|
|
||||||
CODE(MOBILE_CORE_DUO),
|
|
||||||
|
|
||||||
CODE(WOLFDALE),
|
|
||||||
CODE(MEROM),
|
|
||||||
CODE(PENRYN),
|
|
||||||
CODE(QUAD_CORE),
|
|
||||||
CODE(DUAL_CORE_HT),
|
|
||||||
CODE(QUAD_CORE_HT),
|
|
||||||
CODE(MORE_THAN_QUADCORE),
|
|
||||||
CODE(PENTIUM_D),
|
|
||||||
|
|
||||||
CODE(ATOM_UNKNOWN),
|
|
||||||
CODE(ATOM_SILVERTHORNE),
|
|
||||||
CODE(ATOM_DIAMONDVILLE),
|
|
||||||
CODE(ATOM_PINEVIEW),
|
|
||||||
CODE(ATOM_CEDARVIEW),
|
|
||||||
|
|
||||||
CODE(CORE_I3),
|
|
||||||
CODE(CORE_I5),
|
|
||||||
CODE(CORE_I7),
|
|
||||||
CODE(CORE_IVY3), /* 22nm Core-iX */
|
|
||||||
CODE(CORE_IVY5),
|
|
||||||
CODE(CORE_IVY7),
|
|
||||||
CODE(CORE_HASWELL3), /* 22nm Core-iX, Haswell */
|
|
||||||
CODE(CORE_HASWELL5),
|
|
||||||
CODE(CORE_HASWELL7),
|
|
||||||
CODE(CORE_BROADWELL3), /* 14nm Core-iX, Broadwell */
|
|
||||||
CODE(CORE_BROADWELL5),
|
|
||||||
CODE(CORE_BROADWELL7),
|
|
||||||
CODE(CORE_SKYLAKE3), /* 14nm Core-iX, Skylake */
|
|
||||||
CODE(CORE_SKYLAKE5),
|
|
||||||
CODE(CORE_SKYLAKE7),
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @File libcpuid_constants.h
|
|
||||||
* @Author Veselin Georgiev
|
|
||||||
* @Brief Some limits and constants for libcpuid
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBCPUID_CONSTANTS_H__
|
|
||||||
#define __LIBCPUID_CONSTANTS_H__
|
|
||||||
|
|
||||||
#define VENDOR_STR_MAX 16
|
|
||||||
#define BRAND_STR_MAX 64
|
|
||||||
#define CPU_FLAGS_MAX 128
|
|
||||||
#define MAX_CPUID_LEVEL 32
|
|
||||||
#define MAX_EXT_CPUID_LEVEL 32
|
|
||||||
#define MAX_INTELFN4_LEVEL 8
|
|
||||||
#define MAX_INTELFN11_LEVEL 4
|
|
||||||
#define MAX_INTELFN12H_LEVEL 4
|
|
||||||
#define MAX_INTELFN14H_LEVEL 4
|
|
||||||
#define CPU_HINTS_MAX 16
|
|
||||||
#define SGX_FLAGS_MAX 14
|
|
||||||
|
|
||||||
#endif /* __LIBCPUID_CONSTANTS_H__ */
|
|
@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __LIBCPUID_INTERNAL_H__
|
|
||||||
#define __LIBCPUID_INTERNAL_H__
|
|
||||||
/*
|
|
||||||
* This file contains internal undocumented declarations and function prototypes
|
|
||||||
* for the workings of the internal library infrastructure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum _common_codes_t {
|
|
||||||
NA = 0,
|
|
||||||
NO_CODE,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define CODE(x) x
|
|
||||||
#define CODE2(x, y) x = y
|
|
||||||
enum _amd_code_t {
|
|
||||||
#include "amd_code_t.h"
|
|
||||||
};
|
|
||||||
typedef enum _amd_code_t amd_code_t;
|
|
||||||
|
|
||||||
enum _intel_code_t {
|
|
||||||
#include "intel_code_t.h"
|
|
||||||
};
|
|
||||||
typedef enum _intel_code_t intel_code_t;
|
|
||||||
#undef CODE
|
|
||||||
#undef CODE2
|
|
||||||
|
|
||||||
struct internal_id_info_t {
|
|
||||||
union {
|
|
||||||
amd_code_t amd;
|
|
||||||
intel_code_t intel;
|
|
||||||
} code;
|
|
||||||
int score; // detection (matchtable) score
|
|
||||||
};
|
|
||||||
|
|
||||||
int cpu_ident_internal(struct cpu_raw_data_t* raw, struct cpu_id_t* data,
|
|
||||||
struct internal_id_info_t* internal);
|
|
||||||
|
|
||||||
#endif /* __LIBCPUID_INTERNAL_H__ */
|
|
@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @File libcpuid_types.h
|
|
||||||
* @Author Veselin Georgiev
|
|
||||||
* @Brief Type specifications for libcpuid.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __LIBCPUID_TYPES_H__
|
|
||||||
#define __LIBCPUID_TYPES_H__
|
|
||||||
|
|
||||||
//#ifdef HAVE_CONFIG_H // CLICKHOUSE PATCH
|
|
||||||
# include "config.h"
|
|
||||||
//#endif // CLICKHOUSE PATCH
|
|
||||||
|
|
||||||
#if 1 // CLICKHOUSE PATCH
|
|
||||||
//#if defined(HAVE_STDINT_H) // CLICKHOUSE PATCH
|
|
||||||
# include <stdint.h>
|
|
||||||
#else
|
|
||||||
/* we have to provide our own: */
|
|
||||||
# if !defined(HAVE_INT32_T) && !defined(__int32_t_defined)
|
|
||||||
typedef int int32_t;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if !defined(HAVE_UINT32_T) && !defined(__uint32_t_defined)
|
|
||||||
typedef unsigned uint32_t;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
typedef signed char int8_t;
|
|
||||||
typedef unsigned char uint8_t;
|
|
||||||
typedef signed short int16_t;
|
|
||||||
typedef unsigned short uint16_t;
|
|
||||||
#if (defined _MSC_VER) && (_MSC_VER <= 1300)
|
|
||||||
/* MSVC 6.0: no long longs ... */
|
|
||||||
typedef signed __int64 int64_t;
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
#else
|
|
||||||
/* all other sane compilers: */
|
|
||||||
typedef signed long long int64_t;
|
|
||||||
typedef unsigned long long uint64_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __LIBCPUID_TYPES_H__ */
|
|
@ -1,187 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "libcpuid_util.h"
|
|
||||||
|
|
||||||
int _current_verboselevel;
|
|
||||||
|
|
||||||
void match_features(const struct feature_map_t* matchtable, int count, uint32_t reg, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
if (reg & (1u << matchtable[i].bit))
|
|
||||||
data->flags[matchtable[i].feature] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void default_warn(const char *msg)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s", msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
libcpuid_warn_fn_t _warn_fun = default_warn;
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#endif
|
|
||||||
void warnf(const char* format, ...)
|
|
||||||
{
|
|
||||||
char buff[1024];
|
|
||||||
va_list va;
|
|
||||||
if (!_warn_fun) return;
|
|
||||||
va_start(va, format);
|
|
||||||
vsnprintf(buff, sizeof(buff), format, va);
|
|
||||||
va_end(va);
|
|
||||||
_warn_fun(buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
void debugf(int verboselevel, const char* format, ...)
|
|
||||||
{
|
|
||||||
char buff[1024];
|
|
||||||
va_list va;
|
|
||||||
if (verboselevel > _current_verboselevel) return;
|
|
||||||
va_start(va, format);
|
|
||||||
vsnprintf(buff, sizeof(buff), format, va);
|
|
||||||
va_end(va);
|
|
||||||
_warn_fun(buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int score(const struct match_entry_t* entry, const struct cpu_id_t* data,
|
|
||||||
int brand_code, int model_code)
|
|
||||||
{
|
|
||||||
int res = 0;
|
|
||||||
if (entry->family == data->family ) res += 2;
|
|
||||||
if (entry->model == data->model ) res += 2;
|
|
||||||
if (entry->stepping == data->stepping ) res += 2;
|
|
||||||
if (entry->ext_family == data->ext_family) res += 2;
|
|
||||||
if (entry->ext_model == data->ext_model ) res += 2;
|
|
||||||
if (entry->ncores == data->num_cores ) res += 2;
|
|
||||||
if (entry->l2cache == data->l2_cache ) res += 1;
|
|
||||||
if (entry->l3cache == data->l3_cache ) res += 1;
|
|
||||||
if (entry->brand_code == brand_code ) res += 2;
|
|
||||||
if (entry->model_code == model_code ) res += 2;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
int match_cpu_codename(const struct match_entry_t* matchtable, int count,
|
|
||||||
struct cpu_id_t* data, int brand_code, int model_code)
|
|
||||||
{
|
|
||||||
int bestscore = -1;
|
|
||||||
int bestindex = 0;
|
|
||||||
int i, t;
|
|
||||||
|
|
||||||
debugf(3, "Matching cpu f:%d, m:%d, s:%d, xf:%d, xm:%d, ncore:%d, l2:%d, bcode:%d, code:%d\n",
|
|
||||||
data->family, data->model, data->stepping, data->ext_family,
|
|
||||||
data->ext_model, data->num_cores, data->l2_cache, brand_code, model_code);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
t = score(&matchtable[i], data, brand_code, model_code);
|
|
||||||
debugf(3, "Entry %d, `%s', score %d\n", i, matchtable[i].name, t);
|
|
||||||
if (t > bestscore) {
|
|
||||||
debugf(2, "Entry `%s' selected - best score so far (%d)\n", matchtable[i].name, t);
|
|
||||||
bestscore = t;
|
|
||||||
bestindex = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strcpy(data->cpu_codename, matchtable[bestindex].name);
|
|
||||||
return bestscore;
|
|
||||||
}
|
|
||||||
|
|
||||||
void generic_get_cpu_list(const struct match_entry_t* matchtable, int count,
|
|
||||||
struct cpu_list_t* list)
|
|
||||||
{
|
|
||||||
int i, j, n, good;
|
|
||||||
n = 0;
|
|
||||||
list->names = (char**) malloc(sizeof(char*) * count);
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
if (strstr(matchtable[i].name, "Unknown")) continue;
|
|
||||||
good = 1;
|
|
||||||
for (j = n - 1; j >= 0; j--)
|
|
||||||
if (!strcmp(list->names[j], matchtable[i].name)) {
|
|
||||||
good = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!good) continue;
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
list->names[n++] = _strdup(matchtable[i].name);
|
|
||||||
#else
|
|
||||||
list->names[n++] = strdup(matchtable[i].name);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
list->num_entries = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int xmatch_entry(char c, const char* p)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
if (c == 0) return -1;
|
|
||||||
if (c == p[0]) return 1;
|
|
||||||
if (p[0] == '.') return 1;
|
|
||||||
if (p[0] == '#' && isdigit(c)) return 1;
|
|
||||||
if (p[0] == '[') {
|
|
||||||
j = 1;
|
|
||||||
while (p[j] && p[j] != ']') j++;
|
|
||||||
if (!p[j]) return -1;
|
|
||||||
for (i = 1; i < j; i++)
|
|
||||||
if (p[i] == c) return j + 1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int match_pattern(const char* s, const char* p)
|
|
||||||
{
|
|
||||||
int i, j, dj, k, n, m;
|
|
||||||
n = (int) strlen(s);
|
|
||||||
m = (int) strlen(p);
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
if (xmatch_entry(s[i], p) != -1) {
|
|
||||||
j = 0;
|
|
||||||
k = 0;
|
|
||||||
while (j < m && ((dj = xmatch_entry(s[i + k], p + j)) != -1)) {
|
|
||||||
k++;
|
|
||||||
j += dj;
|
|
||||||
}
|
|
||||||
if (j == m) return i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct cpu_id_t* get_cached_cpuid(void)
|
|
||||||
{
|
|
||||||
static int initialized = 0;
|
|
||||||
static struct cpu_id_t id;
|
|
||||||
if (initialized) return &id;
|
|
||||||
if (cpu_identify(NULL, &id))
|
|
||||||
memset(&id, 0, sizeof(id));
|
|
||||||
initialized = 1;
|
|
||||||
return &id;
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __LIBCPUID_UTIL_H__
|
|
||||||
#define __LIBCPUID_UTIL_H__
|
|
||||||
|
|
||||||
#define COUNT_OF(array) (sizeof(array) / sizeof(array[0]))
|
|
||||||
|
|
||||||
struct feature_map_t {
|
|
||||||
unsigned bit;
|
|
||||||
cpu_feature_t feature;
|
|
||||||
};
|
|
||||||
|
|
||||||
void match_features(const struct feature_map_t* matchtable, int count,
|
|
||||||
uint32_t reg, struct cpu_id_t* data);
|
|
||||||
|
|
||||||
struct match_entry_t {
|
|
||||||
int family, model, stepping, ext_family, ext_model;
|
|
||||||
int ncores, l2cache, l3cache, brand_code, model_code;
|
|
||||||
char name[32];
|
|
||||||
};
|
|
||||||
|
|
||||||
// returns the match score:
|
|
||||||
int match_cpu_codename(const struct match_entry_t* matchtable, int count,
|
|
||||||
struct cpu_id_t* data, int brand_code, int model_code);
|
|
||||||
|
|
||||||
void warnf(const char* format, ...)
|
|
||||||
#ifdef __GNUC__
|
|
||||||
__attribute__((format(printf, 1, 2)))
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
void debugf(int verboselevel, const char* format, ...)
|
|
||||||
#ifdef __GNUC__
|
|
||||||
__attribute__((format(printf, 2, 3)))
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
void generic_get_cpu_list(const struct match_entry_t* matchtable, int count,
|
|
||||||
struct cpu_list_t* list);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Seek for a pattern in `haystack'.
|
|
||||||
* Pattern may be an fixed string, or contain the special metacharacters
|
|
||||||
* '.' - match any single character
|
|
||||||
* '#' - match any digit
|
|
||||||
* '[<chars>] - match any of the given chars (regex-like ranges are not
|
|
||||||
* supported)
|
|
||||||
* Return val: 0 if the pattern is not found. Nonzero if it is found (actually,
|
|
||||||
* x + 1 where x is the index where the match is found).
|
|
||||||
*/
|
|
||||||
int match_pattern(const char* haystack, const char* pattern);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gets an initialized cpu_id_t. It is cached, so that internal libcpuid
|
|
||||||
* machinery doesn't need to issue cpu_identify more than once.
|
|
||||||
*/
|
|
||||||
struct cpu_id_t* get_cached_cpuid(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sets the current errno
|
|
||||||
*/
|
|
||||||
int set_error(cpu_error_t err);
|
|
||||||
|
|
||||||
extern libcpuid_warn_fn_t _warn_fun;
|
|
||||||
extern int _current_verboselevel;
|
|
||||||
|
|
||||||
#endif /* __LIBCPUID_UTIL_H__ */
|
|
@ -1,593 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2009 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @File msrdriver.c
|
|
||||||
* @Brief Contains the binary images of the x86 and x64 MSR drivers for Windows
|
|
||||||
* @Date 2009-09-29
|
|
||||||
*
|
|
||||||
* The driver is courtesy of Nick 'Bombera' Gabareff, and its source is actually
|
|
||||||
* available, see the contrib/ dir.
|
|
||||||
*
|
|
||||||
* However, for simplicity, here we just include the images of the compiled .SYS
|
|
||||||
* files.
|
|
||||||
* They are extracted to the filesystem on demand and loaded in the kernel
|
|
||||||
* by the cpu_msr_driver_open() function
|
|
||||||
*/
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include "asm-bits.h"
|
|
||||||
//begin {
|
|
||||||
int cc_x86driver_code_size = 4608;
|
|
||||||
uint8_t cc_x86driver_code[4608] = {
|
|
||||||
0x4d,0x5a,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xb8,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x0e,0x1f,0xba,0x0e,0x00,0xb4,0x09,0xcd,
|
|
||||||
0x21,0xb8,0x01,0x4c,0xcd,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,
|
|
||||||
0x20,0x63,0x61,0x6e,0x6e,0x6f,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6e,0x20,0x69,0x6e,0x20,
|
|
||||||
0x44,0x4f,0x53,0x20,0x6d,0x6f,0x64,0x65,0x2e,0x0d,0x0d,0x0a,0x24,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x9f,0x99,0x48,0xdf,0xdb,0xf8,0x26,0x8c,0xdb,0xf8,0x26,0x8c,0xdb,0xf8,0x26,0x8c,
|
|
||||||
0xdb,0xf8,0x27,0x8c,0xdd,0xf8,0x26,0x8c,0x21,0xdb,0x3f,0x8c,0xd8,0xf8,0x26,0x8c,0xfc,0x3e,
|
|
||||||
0x57,0x8c,0xda,0xf8,0x26,0x8c,0xfc,0x3e,0x5a,0x8c,0xda,0xf8,0x26,0x8c,0xfc,0x3e,0x5e,0x8c,
|
|
||||||
0xda,0xf8,0x26,0x8c,0x52,0x69,0x63,0x68,0xdb,0xf8,0x26,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x50,0x45,0x00,0x00,0x4c,0x01,0x07,0x00,0x12,0x9b,0x9b,0x4a,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xe0,0x00,0x02,0x21,0x0b,0x01,0x08,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,
|
|
||||||
0x00,0x00,0x01,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x00,
|
|
||||||
0xa9,0xd1,0x00,0x00,0x01,0x00,0x00,0x04,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
|
|
||||||
0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x28,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0xc0,0x03,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x20,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x74,
|
|
||||||
0x65,0x78,0x74,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,
|
|
||||||
0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
|
|
||||||
0x00,0x68,0x2e,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0x62,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
|
|
||||||
0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x40,0x00,0x00,0x48,0x2e,0x64,0x61,0x74,0x61,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
|
|
||||||
0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xc8,0x50,0x41,0x47,0x45,0x30,0x44,0x45,0x46,
|
|
||||||
0x8c,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x49,0x4e,0x49,0x54,
|
|
||||||
0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0a,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0xe2,
|
|
||||||
0x2e,0x72,0x73,0x72,0x63,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x04,
|
|
||||||
0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x40,0x00,0x00,0x42,0x2e,0x72,0x65,0x6c,0x6f,0x63,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x70,
|
|
||||||
0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8b,0x4c,
|
|
||||||
0x24,0x08,0x83,0x61,0x18,0x00,0x83,0x61,0x1c,0x00,0x32,0xd2,0xff,0x15,0x08,0x20,0x01,0x00,
|
|
||||||
0x33,0xc0,0xc2,0x08,0x00,0x56,0x8b,0x74,0x24,0x0c,0x8b,0x46,0x60,0x81,0x78,0x0c,0x0c,0xe0,
|
|
||||||
0x22,0x00,0x57,0x75,0x3c,0x83,0x78,0x04,0x08,0x72,0x36,0x83,0x78,0x08,0x04,0x75,0x07,0x8b,
|
|
||||||
0x46,0x0c,0x8b,0x08,0xeb,0x05,0xb9,0x9c,0x01,0x00,0x00,0x8b,0x7e,0x0c,0x0f,0x32,0x89,0x07,
|
|
||||||
0x89,0x57,0x04,0xc7,0x46,0x1c,0x08,0x00,0x00,0x00,0x33,0xff,0x32,0xd2,0x8b,0xce,0xff,0x15,
|
|
||||||
0x08,0x20,0x01,0x00,0x8b,0xc7,0x5f,0x5e,0xc2,0x08,0x00,0x83,0x66,0x1c,0x00,0xbf,0x01,0x00,
|
|
||||||
0x00,0xc0,0x89,0x7e,0x18,0xeb,0xe1,0x55,0x8b,0xec,0x51,0x51,0x8b,0x45,0x08,0xff,0x70,0x04,
|
|
||||||
0xff,0x15,0x04,0x20,0x01,0x00,0x68,0x3c,0x20,0x01,0x00,0x8d,0x45,0xf8,0x50,0xff,0x15,0x00,
|
|
||||||
0x20,0x01,0x00,0x8d,0x45,0xf8,0x50,0xff,0x15,0x14,0x20,0x01,0x00,0xc9,0xc2,0x04,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x50,0x00,0x00,0x74,0x50,0x00,0x00,0x86,0x50,0x00,0x00,
|
|
||||||
0x9c,0x50,0x00,0x00,0xb4,0x50,0x00,0x00,0x44,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,
|
|
||||||
0x44,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x5c,0x00,0x54,0x00,0x6d,0x00,
|
|
||||||
0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x44,0x00,0x6f,0x00,
|
|
||||||
0x73,0x00,0x44,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x73,0x00,0x5c,0x00,
|
|
||||||
0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x8b,0xec,0x83,
|
|
||||||
0xec,0x14,0x56,0x8b,0x35,0x00,0x20,0x01,0x00,0x57,0x68,0x1c,0x20,0x01,0x00,0x8d,0x45,0xf4,
|
|
||||||
0x50,0xff,0xd6,0x8b,0x7d,0x08,0x8d,0x45,0xfc,0x50,0x6a,0x00,0x6a,0x00,0x6a,0x22,0x8d,0x45,
|
|
||||||
0xf4,0x50,0x6a,0x04,0x57,0xff,0x15,0x10,0x20,0x01,0x00,0x85,0xc0,0x75,0x4f,0x68,0x3c,0x20,
|
|
||||||
0x01,0x00,0x8d,0x45,0xec,0x50,0xff,0xd6,0x8d,0x45,0xf4,0x50,0x8d,0x45,0xec,0x50,0xff,0x15,
|
|
||||||
0x0c,0x20,0x01,0x00,0x8b,0xf0,0x85,0xf6,0x74,0x0d,0xff,0x75,0xfc,0xff,0x15,0x04,0x20,0x01,
|
|
||||||
0x00,0x8b,0xc6,0xeb,0x23,0x8b,0x45,0xfc,0xa3,0x00,0x30,0x01,0x00,0xb8,0x00,0x10,0x01,0x00,
|
|
||||||
0x89,0x47,0x38,0x89,0x47,0x40,0xc7,0x47,0x34,0x75,0x10,0x01,0x00,0xc7,0x47,0x70,0x19,0x10,
|
|
||||||
0x01,0x00,0x33,0xc0,0x5f,0x5e,0xc9,0xc2,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x50,
|
|
||||||
0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x50,0x00,0x00,0x74,0x50,0x00,0x00,0x86,0x50,
|
|
||||||
0x00,0x00,0x9c,0x50,0x00,0x00,0xb4,0x50,0x00,0x00,0x44,0x50,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x4b,0x01,0x49,0x6f,0x44,0x65,0x6c,0x65,0x74,0x65,0x53,0x79,0x6d,0x62,0x6f,0x6c,0x69,0x63,
|
|
||||||
0x4c,0x69,0x6e,0x6b,0x00,0x00,0x0b,0x04,0x52,0x74,0x6c,0x49,0x6e,0x69,0x74,0x55,0x6e,0x69,
|
|
||||||
0x63,0x6f,0x64,0x65,0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x49,0x01,0x49,0x6f,0x44,0x65,
|
|
||||||
0x6c,0x65,0x74,0x65,0x44,0x65,0x76,0x69,0x63,0x65,0x00,0x00,0xda,0x01,0x49,0x6f,0x66,0x43,
|
|
||||||
0x6f,0x6d,0x70,0x6c,0x65,0x74,0x65,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x00,0x00,0x41,0x01,
|
|
||||||
0x49,0x6f,0x43,0x72,0x65,0x61,0x74,0x65,0x53,0x79,0x6d,0x62,0x6f,0x6c,0x69,0x63,0x4c,0x69,
|
|
||||||
0x6e,0x6b,0x00,0x00,0x38,0x01,0x49,0x6f,0x43,0x72,0x65,0x61,0x74,0x65,0x44,0x65,0x76,0x69,
|
|
||||||
0x63,0x65,0x00,0x00,0x6e,0x74,0x6f,0x73,0x6b,0x72,0x6e,0x6c,0x2e,0x65,0x78,0x65,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x80,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
|
|
||||||
0x00,0x00,0x30,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x01,0x00,0x09,0x04,0x00,0x00,0x48,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x5c,0x03,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x5c,0x03,0x34,0x00,0x00,0x00,0x56,0x00,0x53,0x00,0x5f,0x00,0x56,0x00,0x45,0x00,0x52,0x00,
|
|
||||||
0x53,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x5f,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x4f,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0xbd,0x04,0xef,0xfe,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x04,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xba,0x02,0x00,0x00,0x01,0x00,0x53,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,
|
|
||||||
0x67,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x49,0x00,0x6e,0x00,0x66,0x00,0x6f,0x00,
|
|
||||||
0x00,0x00,0x96,0x02,0x00,0x00,0x01,0x00,0x30,0x00,0x34,0x00,0x30,0x00,0x39,0x00,0x30,0x00,
|
|
||||||
0x34,0x00,0x62,0x00,0x30,0x00,0x00,0x00,0x58,0x00,0x20,0x00,0x01,0x00,0x43,0x00,0x6f,0x00,
|
|
||||||
0x6d,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x00,0x00,0x4d,0x00,0x53,0x00,
|
|
||||||
0x52,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,
|
|
||||||
0x33,0x00,0x32,0x00,0x2d,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x6b,0x00,0x65,0x00,
|
|
||||||
0x72,0x00,0x6e,0x00,0x65,0x00,0x6c,0x00,0x20,0x00,0x64,0x00,0x72,0x00,0x69,0x00,0x76,0x00,
|
|
||||||
0x65,0x00,0x72,0x00,0x00,0x00,0x42,0x00,0x11,0x00,0x01,0x00,0x43,0x00,0x6f,0x00,0x6d,0x00,
|
|
||||||
0x70,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x4e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x49,0x00,0x72,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x53,0x00,0x74,0x00,0x65,0x00,
|
|
||||||
0x65,0x00,0x64,0x00,0x73,0x00,0x20,0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x60,0x00,0x1c,0x00,0x01,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x44,0x00,
|
|
||||||
0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,
|
|
||||||
0x6e,0x00,0x00,0x00,0x00,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,
|
|
||||||
0x20,0x00,0x33,0x00,0x32,0x00,0x2d,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x4b,0x00,
|
|
||||||
0x65,0x00,0x72,0x00,0x6e,0x00,0x65,0x00,0x6c,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x64,0x00,
|
|
||||||
0x75,0x00,0x6c,0x00,0x65,0x00,0x00,0x00,0x36,0x00,0x0b,0x00,0x01,0x00,0x46,0x00,0x69,0x00,
|
|
||||||
0x6c,0x00,0x65,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x31,0x00,0x2c,0x00,0x20,0x00,0x30,0x00,0x2c,0x00,0x20,0x00,0x30,0x00,
|
|
||||||
0x2c,0x00,0x20,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x07,0x00,0x01,0x00,0x49,0x00,
|
|
||||||
0x6e,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x4e,0x00,0x61,0x00,
|
|
||||||
0x6d,0x00,0x65,0x00,0x00,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x4a,0x00,0x13,0x00,0x01,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,
|
|
||||||
0x6c,0x00,0x43,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,
|
|
||||||
0x74,0x00,0x00,0x00,0x4e,0x00,0x69,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x47,0x00,0x61,0x00,
|
|
||||||
0x62,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x76,0x00,0x20,0x00,0x27,0x00,0x32,0x00,0x30,0x00,
|
|
||||||
0x30,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x0b,0x00,0x01,0x00,0x4f,0x00,0x72,0x00,
|
|
||||||
0x69,0x00,0x67,0x00,0x69,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,
|
|
||||||
0x65,0x00,0x6e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x00,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,
|
|
||||||
0x52,0x00,0x64,0x00,0x72,0x00,0x2e,0x00,0x73,0x00,0x79,0x00,0x73,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x54,0x00,0x1a,0x00,0x01,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,
|
|
||||||
0x74,0x00,0x4e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x43,0x00,0x6f,0x00,
|
|
||||||
0x72,0x00,0x65,0x00,0x20,0x00,0x32,0x00,0x20,0x00,0x54,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,
|
|
||||||
0x65,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x75,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x52,0x00,
|
|
||||||
0x65,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x00,0x00,0x3a,0x00,0x0b,0x00,0x01,0x00,
|
|
||||||
0x50,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x56,0x00,0x65,0x00,
|
|
||||||
0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x00,0x00,0x31,0x00,0x2c,0x00,0x20,0x00,
|
|
||||||
0x30,0x00,0x2c,0x00,0x20,0x00,0x30,0x00,0x2c,0x00,0x20,0x00,0x31,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x44,0x00,0x00,0x00,0x01,0x00,0x56,0x00,0x61,0x00,0x72,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,
|
|
||||||
0x65,0x00,0x49,0x00,0x6e,0x00,0x66,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x04,0x00,
|
|
||||||
0x00,0x00,0x54,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x73,0x00,0x6c,0x00,0x61,0x00,0x74,0x00,
|
|
||||||
0x69,0x00,0x6f,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0xb0,0x04,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x14,0x00,0x00,0x00,
|
|
||||||
0x10,0x30,0x5c,0x30,0x82,0x30,0x87,0x30,0x91,0x30,0x9b,0x30,0x00,0x40,0x00,0x00,0x1c,0x00,
|
|
||||||
0x00,0x00,0x09,0x30,0x0f,0x30,0x2f,0x30,0x38,0x30,0x4c,0x30,0x5b,0x30,0x67,0x30,0x6c,0x30,
|
|
||||||
0x79,0x30,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
};
|
|
||||||
int cc_x64driver_code_size = 5120;
|
|
||||||
uint8_t cc_x64driver_code[5120] = {
|
|
||||||
0x4d,0x5a,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xb8,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x0e,0x1f,0xba,0x0e,0x00,0xb4,0x09,0xcd,
|
|
||||||
0x21,0xb8,0x01,0x4c,0xcd,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,
|
|
||||||
0x20,0x63,0x61,0x6e,0x6e,0x6f,0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6e,0x20,0x69,0x6e,0x20,
|
|
||||||
0x44,0x4f,0x53,0x20,0x6d,0x6f,0x64,0x65,0x2e,0x0d,0x0d,0x0a,0x24,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xb7,0x04,0xa8,0xc2,0xf3,0x65,0xc6,0x91,0xf3,0x65,0xc6,0x91,0xf3,0x65,0xc6,0x91,
|
|
||||||
0xf3,0x65,0xc7,0x91,0xf4,0x65,0xc6,0x91,0x85,0xf8,0xbd,0x91,0xf0,0x65,0xc6,0x91,0x85,0xf8,
|
|
||||||
0xab,0x91,0xf0,0x65,0xc6,0x91,0x30,0x6a,0x98,0x91,0xf2,0x65,0xc6,0x91,0x85,0xf8,0xbe,0x91,
|
|
||||||
0xf2,0x65,0xc6,0x91,0x52,0x69,0x63,0x68,0xf3,0x65,0xc6,0x91,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x64,0x86,0x07,0x00,
|
|
||||||
0x41,0xc8,0x6d,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x22,0x00,0x0b,0x02,
|
|
||||||
0x08,0x00,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x00,
|
|
||||||
0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,
|
|
||||||
0x00,0x00,0x05,0x00,0x02,0x00,0x05,0x00,0x02,0x00,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x00,0x79,0x44,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x60,0x00,0x00,0x28,0x00,0x00,0x00,
|
|
||||||
0x00,0x70,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x00,
|
|
||||||
0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x2e,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x26,0x01,0x00,0x00,0x00,0x10,
|
|
||||||
0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x68,0x2e,0x72,0x64,0x61,0x74,0x61,0x00,0x00,0xf0,0x00,
|
|
||||||
0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x48,0x2e,0x64,0x61,0x74,0x61,0x00,
|
|
||||||
0x00,0x00,0x18,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xc8,0x2e,0x70,
|
|
||||||
0x64,0x61,0x74,0x61,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,
|
|
||||||
0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
|
|
||||||
0x00,0x48,0x50,0x41,0x47,0x45,0x30,0x44,0x45,0x46,0x4e,0x01,0x00,0x00,0x00,0x50,0x00,0x00,
|
|
||||||
0x00,0x02,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x20,0x00,0x00,0x60,0x49,0x4e,0x49,0x54,0x00,0x00,0x00,0x00,0x60,0x01,0x00,0x00,
|
|
||||||
0x00,0x60,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0xe2,0x2e,0x72,0x73,0x72,0x63,0x00,0x00,0x00,
|
|
||||||
0xc0,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x42,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0xec,0x28,
|
|
||||||
0x33,0xc9,0x48,0x8b,0xc2,0x89,0x4a,0x30,0x48,0x89,0x4a,0x38,0x33,0xd2,0x48,0x8b,0xc8,0xff,
|
|
||||||
0x15,0xfd,0x0f,0x00,0x00,0x33,0xc0,0x48,0x83,0xc4,0x28,0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,
|
|
||||||
0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x48,0x83,0xec,0x28,0x48,0x8b,0x82,0xb8,0x00,0x00,
|
|
||||||
0x00,0x4c,0x8b,0xca,0x81,0x78,0x18,0x0c,0xe0,0x22,0x00,0x75,0x43,0x83,0x78,0x08,0x08,0x72,
|
|
||||||
0x3d,0x83,0x78,0x10,0x04,0x75,0x08,0x48,0x8b,0x42,0x18,0x8b,0x08,0xeb,0x05,0xb9,0x9c,0x01,
|
|
||||||
0x00,0x00,0x4c,0x8b,0x42,0x18,0x0f,0x32,0x48,0xc1,0xe2,0x20,0x49,0x8b,0xc9,0x48,0x0b,0xc2,
|
|
||||||
0x33,0xd2,0x49,0x89,0x00,0x49,0xc7,0x41,0x38,0x08,0x00,0x00,0x00,0xff,0x15,0x95,0x0f,0x00,
|
|
||||||
0x00,0x33,0xc0,0x48,0x83,0xc4,0x28,0xc3,0xc7,0x42,0x30,0x01,0x00,0x00,0xc0,0x48,0xc7,0x42,
|
|
||||||
0x38,0x00,0x00,0x00,0x00,0x49,0x8b,0xc9,0x33,0xd2,0xff,0x15,0x74,0x0f,0x00,0x00,0xb8,0x01,
|
|
||||||
0x00,0x00,0xc0,0x48,0x83,0xc4,0x28,0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,
|
|
||||||
0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x48,0x83,0xec,0x38,0x48,0x8b,0x49,0x08,0xff,0x15,
|
|
||||||
0x32,0x0f,0x00,0x00,0x48,0x8d,0x15,0x1b,0x00,0x00,0x00,0x48,0x8d,0x4c,0x24,0x20,0xff,0x15,
|
|
||||||
0x18,0x0f,0x00,0x00,0x48,0x8d,0x4c,0x24,0x20,0xff,0x15,0x05,0x0f,0x00,0x00,0x48,0x83,0xc4,
|
|
||||||
0x38,0xc3,0x5c,0x00,0x44,0x00,0x6f,0x00,0x73,0x00,0x44,0x00,0x65,0x00,0x76,0x00,0x69,0x00,
|
|
||||||
0x63,0x00,0x65,0x00,0x73,0x00,0x5c,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,
|
|
||||||
0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x60,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x16,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x61,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x40,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x41,0xc8,0x6d,0x49,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x49,0x00,0x00,0x00,
|
|
||||||
0x5c,0x20,0x00,0x00,0x5c,0x06,0x00,0x00,0x52,0x53,0x44,0x53,0xd9,0x5e,0xab,0x47,0xc4,0xf2,
|
|
||||||
0x4f,0x40,0xaa,0xe9,0x90,0x47,0x67,0x30,0xa5,0xfa,0x03,0x00,0x00,0x00,0x44,0x3a,0x5c,0x74,
|
|
||||||
0x6d,0x70,0x5c,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x5c,0x6f,0x62,0x6a,0x66,0x72,0x65,0x5f,0x77,
|
|
||||||
0x6e,0x65,0x74,0x5f,0x41,0x4d,0x44,0x36,0x34,0x5c,0x61,0x6d,0x64,0x36,0x34,0x5c,0x54,0x6d,
|
|
||||||
0x70,0x52,0x64,0x72,0x2e,0x70,0x64,0x62,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x04,0x42,
|
|
||||||
0x00,0x00,0x01,0x04,0x01,0x00,0x04,0x42,0x00,0x00,0x01,0x04,0x01,0x00,0x04,0x62,0x00,0x00,
|
|
||||||
0x21,0x00,0x00,0x00,0x10,0x50,0x00,0x00,0x74,0x50,0x00,0x00,0xe4,0x20,0x00,0x00,0x21,0x08,
|
|
||||||
0x02,0x00,0x08,0x74,0x13,0x00,0x10,0x50,0x00,0x00,0x74,0x50,0x00,0x00,0xe4,0x20,0x00,0x00,
|
|
||||||
0x01,0x0c,0x03,0x00,0x0c,0x34,0x12,0x00,0x04,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0xcd,0x5d,0x20,0xd2,0x66,0xd4,0xff,0xff,0x32,0xa2,0xdf,0x2d,0x99,0x2b,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x32,0x10,0x00,0x00,0xa8,0x20,0x00,0x00,0x40,0x10,
|
|
||||||
0x00,0x00,0xbe,0x10,0x00,0x00,0xb0,0x20,0x00,0x00,0xd0,0x10,0x00,0x00,0x00,0x11,0x00,0x00,
|
|
||||||
0xb8,0x20,0x00,0x00,0x10,0x50,0x00,0x00,0x74,0x50,0x00,0x00,0xe4,0x20,0x00,0x00,0x74,0x50,
|
|
||||||
0x00,0x00,0xe8,0x50,0x00,0x00,0xd0,0x20,0x00,0x00,0xe8,0x50,0x00,0x00,0xf5,0x50,0x00,0x00,
|
|
||||||
0xc0,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x83,0xec,0x78,0x48,0x89,0x9c,0x24,
|
|
||||||
0x90,0x00,0x00,0x00,0x48,0x8b,0xd9,0x48,0x8d,0x15,0x0a,0x01,0x00,0x00,0x48,0x8d,0x4c,0x24,
|
|
||||||
0x48,0xff,0x15,0xd7,0xcf,0xff,0xff,0x41,0xb9,0x22,0x00,0x00,0x00,0x4c,0x8d,0x5c,0x24,0x40,
|
|
||||||
0x4c,0x89,0x5c,0x24,0x30,0x4c,0x8d,0x44,0x24,0x48,0x41,0x8d,0x51,0xe6,0x48,0x8b,0xcb,0xc6,
|
|
||||||
0x44,0x24,0x28,0x00,0xc7,0x44,0x24,0x20,0x00,0x00,0x00,0x00,0xff,0x15,0xc0,0xcf,0xff,0xff,
|
|
||||||
0x85,0xc0,0x0f,0x85,0x80,0x00,0x00,0x00,0x48,0x8d,0x15,0x91,0x00,0x00,0x00,0x48,0x8d,0x4c,
|
|
||||||
0x24,0x58,0x48,0x89,0xbc,0x24,0x98,0x00,0x00,0x00,0xff,0x15,0x86,0xcf,0xff,0xff,0x48,0x8d,
|
|
||||||
0x54,0x24,0x48,0x48,0x8d,0x4c,0x24,0x58,0xff,0x15,0x86,0xcf,0xff,0xff,0x85,0xc0,0x8b,0xf8,
|
|
||||||
0x74,0x0f,0x48,0x8b,0x4c,0x24,0x40,0xff,0x15,0x6d,0xcf,0xff,0xff,0x8b,0xc7,0xeb,0x39,0x48,
|
|
||||||
0x8b,0x44,0x24,0x40,0x48,0x89,0x05,0x5d,0xe0,0xff,0xff,0x48,0x8d,0x05,0x16,0xc0,0xff,0xff,
|
|
||||||
0x48,0x89,0x43,0x68,0x48,0x8d,0x05,0x4b,0xbf,0xff,0xff,0x48,0x89,0x43,0x70,0x48,0x89,0x83,
|
|
||||||
0x80,0x00,0x00,0x00,0x48,0x8d,0x05,0x69,0xbf,0xff,0xff,0x48,0x89,0x83,0xe0,0x00,0x00,0x00,
|
|
||||||
0x33,0xc0,0x48,0x8b,0xbc,0x24,0x98,0x00,0x00,0x00,0x48,0x8b,0x9c,0x24,0x90,0x00,0x00,0x00,
|
|
||||||
0x48,0x83,0xc4,0x78,0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x5c,0x00,
|
|
||||||
0x44,0x00,0x6f,0x00,0x73,0x00,0x44,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,
|
|
||||||
0x73,0x00,0x5c,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,0x00,0x00,
|
|
||||||
0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x5c,0x00,0x44,0x00,0x65,0x00,0x76,0x00,
|
|
||||||
0x69,0x00,0x63,0x00,0x65,0x00,0x5c,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,
|
|
||||||
0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x48,0x8b,0x05,0xf1,0xd0,0xff,0xff,0x49,0xb9,0x32,0xa2,0xdf,0x2d,0x99,0x2b,0x00,0x00,0x48,
|
|
||||||
0x85,0xc0,0x74,0x05,0x49,0x3b,0xc1,0x75,0x2f,0x4c,0x8d,0x05,0xd6,0xd0,0xff,0xff,0x48,0xb8,
|
|
||||||
0x20,0x03,0x00,0x00,0x80,0xf7,0xff,0xff,0x48,0x8b,0x00,0x49,0x33,0xc0,0x49,0xb8,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0x00,0x00,0x49,0x23,0xc0,0x49,0x0f,0x44,0xc1,0x48,0x89,0x05,0xae,0xd0,
|
|
||||||
0xff,0xff,0x48,0xf7,0xd0,0x48,0x89,0x05,0x9c,0xd0,0xff,0xff,0xe9,0xa7,0xef,0xff,0xff,0xcc,
|
|
||||||
0xcc,0xcc,0x98,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x61,0x00,0x00,
|
|
||||||
0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0xfe,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x61,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x60,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x01,0x49,0x6f,0x66,0x43,
|
|
||||||
0x6f,0x6d,0x70,0x6c,0x65,0x74,0x65,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x00,0x00,0x61,0x01,
|
|
||||||
0x49,0x6f,0x44,0x65,0x6c,0x65,0x74,0x65,0x53,0x79,0x6d,0x62,0x6f,0x6c,0x69,0x63,0x4c,0x69,
|
|
||||||
0x6e,0x6b,0x00,0x00,0x3e,0x04,0x52,0x74,0x6c,0x49,0x6e,0x69,0x74,0x55,0x6e,0x69,0x63,0x6f,
|
|
||||||
0x64,0x65,0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x5f,0x01,0x49,0x6f,0x44,0x65,0x6c,0x65,
|
|
||||||
0x74,0x65,0x44,0x65,0x76,0x69,0x63,0x65,0x00,0x00,0x55,0x01,0x49,0x6f,0x43,0x72,0x65,0x61,
|
|
||||||
0x74,0x65,0x53,0x79,0x6d,0x62,0x6f,0x6c,0x69,0x63,0x4c,0x69,0x6e,0x6b,0x00,0x00,0x4c,0x01,
|
|
||||||
0x49,0x6f,0x43,0x72,0x65,0x61,0x74,0x65,0x44,0x65,0x76,0x69,0x63,0x65,0x00,0x00,0x6e,0x74,
|
|
||||||
0x6f,0x73,0x6b,0x72,0x6e,0x6c,0x2e,0x65,0x78,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x80,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
|
|
||||||
0x30,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x01,0x00,0x09,0x04,0x00,0x00,0x48,0x00,0x00,0x00,0x60,0x70,0x00,0x00,0x60,0x03,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,
|
|
||||||
0x34,0x00,0x00,0x00,0x56,0x00,0x53,0x00,0x5f,0x00,0x56,0x00,0x45,0x00,0x52,0x00,0x53,0x00,
|
|
||||||
0x49,0x00,0x4f,0x00,0x4e,0x00,0x5f,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x4f,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0xbd,0x04,0xef,0xfe,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
|
|
||||||
0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0xbe,0x02,0x00,0x00,0x01,0x00,0x53,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,
|
|
||||||
0x46,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x49,0x00,0x6e,0x00,0x66,0x00,0x6f,0x00,0x00,0x00,
|
|
||||||
0x9a,0x02,0x00,0x00,0x01,0x00,0x30,0x00,0x34,0x00,0x30,0x00,0x39,0x00,0x30,0x00,0x34,0x00,
|
|
||||||
0x62,0x00,0x30,0x00,0x00,0x00,0x58,0x00,0x20,0x00,0x01,0x00,0x43,0x00,0x6f,0x00,0x6d,0x00,
|
|
||||||
0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x73,0x00,0x00,0x00,0x4d,0x00,0x53,0x00,0x52,0x00,
|
|
||||||
0x20,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x36,0x00,
|
|
||||||
0x34,0x00,0x2d,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x6b,0x00,0x65,0x00,0x72,0x00,
|
|
||||||
0x6e,0x00,0x65,0x00,0x6c,0x00,0x20,0x00,0x64,0x00,0x72,0x00,0x69,0x00,0x76,0x00,0x65,0x00,
|
|
||||||
0x72,0x00,0x00,0x00,0x42,0x00,0x11,0x00,0x01,0x00,0x43,0x00,0x6f,0x00,0x6d,0x00,0x70,0x00,
|
|
||||||
0x61,0x00,0x6e,0x00,0x79,0x00,0x4e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x49,0x00,0x72,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x53,0x00,0x74,0x00,0x65,0x00,0x65,0x00,
|
|
||||||
0x64,0x00,0x73,0x00,0x20,0x00,0x49,0x00,0x6e,0x00,0x63,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x60,0x00,0x1c,0x00,0x01,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x44,0x00,0x65,0x00,
|
|
||||||
0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,0x20,0x00,
|
|
||||||
0x36,0x00,0x34,0x00,0x2d,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x4b,0x00,0x65,0x00,
|
|
||||||
0x72,0x00,0x6e,0x00,0x65,0x00,0x6c,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,
|
|
||||||
0x6c,0x00,0x65,0x00,0x00,0x00,0x36,0x00,0x0b,0x00,0x01,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,
|
|
||||||
0x65,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x31,0x00,0x2c,0x00,0x20,0x00,0x30,0x00,0x2c,0x00,0x20,0x00,0x30,0x00,0x2c,0x00,
|
|
||||||
0x20,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x07,0x00,0x01,0x00,0x49,0x00,0x6e,0x00,
|
|
||||||
0x74,0x00,0x65,0x00,0x72,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x4e,0x00,0x61,0x00,0x6d,0x00,
|
|
||||||
0x65,0x00,0x00,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,0x64,0x00,0x72,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x4a,0x00,0x13,0x00,0x01,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,
|
|
||||||
0x43,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,
|
|
||||||
0x00,0x00,0x4e,0x00,0x69,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x47,0x00,0x61,0x00,0x62,0x00,
|
|
||||||
0x61,0x00,0x72,0x00,0x65,0x00,0x76,0x00,0x20,0x00,0x27,0x00,0x32,0x00,0x30,0x00,0x30,0x00,
|
|
||||||
0x39,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x0d,0x00,0x01,0x00,0x4f,0x00,0x72,0x00,0x69,0x00,
|
|
||||||
0x67,0x00,0x69,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x46,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,
|
|
||||||
0x6e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x00,0x00,0x54,0x00,0x6d,0x00,0x70,0x00,0x52,0x00,
|
|
||||||
0x64,0x00,0x72,0x00,0x36,0x00,0x34,0x00,0x2e,0x00,0x73,0x00,0x79,0x00,0x73,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x54,0x00,0x1a,0x00,0x01,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,
|
|
||||||
0x63,0x00,0x74,0x00,0x4e,0x00,0x61,0x00,0x6d,0x00,0x65,0x00,0x00,0x00,0x00,0x00,0x43,0x00,
|
|
||||||
0x6f,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x32,0x00,0x20,0x00,0x54,0x00,0x65,0x00,0x6d,0x00,
|
|
||||||
0x70,0x00,0x65,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x75,0x00,0x72,0x00,0x65,0x00,0x20,0x00,
|
|
||||||
0x52,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x00,0x00,0x3a,0x00,0x0b,0x00,
|
|
||||||
0x01,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x56,0x00,
|
|
||||||
0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x00,0x00,0x31,0x00,0x2c,0x00,
|
|
||||||
0x20,0x00,0x30,0x00,0x2c,0x00,0x20,0x00,0x30,0x00,0x2c,0x00,0x20,0x00,0x31,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x56,0x00,0x61,0x00,0x72,0x00,0x46,0x00,0x69,0x00,
|
|
||||||
0x6c,0x00,0x65,0x00,0x49,0x00,0x6e,0x00,0x66,0x00,0x6f,0x00,0x00,0x00,0x00,0x00,0x24,0x00,
|
|
||||||
0x04,0x00,0x00,0x00,0x54,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x73,0x00,0x6c,0x00,0x61,0x00,
|
|
||||||
0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0xb0,0x04,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
};
|
|
||||||
//} end
|
|
||||||
#endif // _WIN32
|
|
||||||
|
|
||||||
int msrdriver_dummy; // a dummy to avoid a linker warning on OS X.
|
|
@ -1,922 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2009 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#define _XOPEN_SOURCE 500
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "asm-bits.h"
|
|
||||||
#include "libcpuid_util.h"
|
|
||||||
#include "libcpuid_internal.h"
|
|
||||||
#include "rdtsc.h"
|
|
||||||
|
|
||||||
#if defined (__linux__) || defined (__gnu_linux__)
|
|
||||||
/* Assuming linux with /dev/cpu/x/msr: */
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
struct msr_driver_t { int fd; };
|
|
||||||
static int rdmsr_supported(void);
|
|
||||||
static int load_driver(char *msr_path)
|
|
||||||
{
|
|
||||||
const int file_exists = !access(msr_path, F_OK);
|
|
||||||
const int file_readable = !access(msr_path, R_OK);
|
|
||||||
|
|
||||||
if (file_exists && file_readable)
|
|
||||||
return 1;
|
|
||||||
else if (file_exists && !file_readable)
|
|
||||||
return 0;
|
|
||||||
else if (getuid() != 0)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return !system("modprobe msr 2> /dev/null");
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open(void)
|
|
||||||
{
|
|
||||||
return cpu_msr_driver_open_core(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open_core(unsigned core_num)
|
|
||||||
{
|
|
||||||
char msr[32];
|
|
||||||
struct msr_driver_t* handle;
|
|
||||||
if (core_num >= cpuid_get_total_cpus()) {
|
|
||||||
set_error(ERR_INVCNB);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (!rdmsr_supported()) {
|
|
||||||
set_error(ERR_NO_RDMSR);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sprintf(msr, "/dev/cpu/%u/msr", core_num);
|
|
||||||
if(!load_driver(msr)) {
|
|
||||||
set_error(ERR_NO_DRIVER);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
int fd = open(msr, O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
if (errno == EIO) {
|
|
||||||
set_error(ERR_NO_RDMSR);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
set_error(ERR_NO_DRIVER);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
handle = (struct msr_driver_t*) malloc(sizeof(struct msr_driver_t));
|
|
||||||
handle->fd = fd;
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_rdmsr(struct msr_driver_t* driver, uint32_t msr_index, uint64_t* result)
|
|
||||||
{
|
|
||||||
ssize_t ret;
|
|
||||||
|
|
||||||
if (!driver || driver->fd < 0)
|
|
||||||
return set_error(ERR_HANDLE);
|
|
||||||
ret = pread(driver->fd, result, 8, msr_index);
|
|
||||||
if (ret != 8)
|
|
||||||
return set_error(ERR_INVMSR);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_msr_driver_close(struct msr_driver_t* drv)
|
|
||||||
{
|
|
||||||
if (drv && drv->fd >= 0) {
|
|
||||||
close(drv->fd);
|
|
||||||
free(drv);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* #endif defined (__linux__) || defined (__gnu_linux__) */
|
|
||||||
|
|
||||||
#elif defined (__FreeBSD__) || defined (__DragonFly__)
|
|
||||||
/* Assuming FreeBSD with /dev/cpuctlX */
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/cpuctl.h>
|
|
||||||
|
|
||||||
struct msr_driver_t { int fd; };
|
|
||||||
static int rdmsr_supported(void);
|
|
||||||
static int load_driver(char *msr_path)
|
|
||||||
{
|
|
||||||
const int file_exists = !access(msr_path, F_OK);
|
|
||||||
const int file_readable = !access(msr_path, R_OK);
|
|
||||||
|
|
||||||
if (file_exists && file_readable)
|
|
||||||
return 1;
|
|
||||||
else if (file_exists && !file_readable)
|
|
||||||
return 0;
|
|
||||||
else if (getuid() != 0)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return !system("kldload -n cpuctl 2> /dev/null");
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open(void)
|
|
||||||
{
|
|
||||||
return cpu_msr_driver_open_core(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open_core(unsigned core_num)
|
|
||||||
{
|
|
||||||
char msr[32];
|
|
||||||
struct msr_driver_t* handle;
|
|
||||||
if (core_num >= cpuid_get_total_cpus()) {
|
|
||||||
set_error(ERR_INVCNB);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (!rdmsr_supported()) {
|
|
||||||
set_error(ERR_NO_RDMSR);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sprintf(msr, "/dev/cpuctl%u", core_num);
|
|
||||||
if(!load_driver(msr)) {
|
|
||||||
set_error(ERR_NO_DRIVER);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
int fd = open(msr, O_RDONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
if (errno == EIO) {
|
|
||||||
set_error(ERR_NO_RDMSR);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
set_error(ERR_NO_DRIVER);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
handle = (struct msr_driver_t*) malloc(sizeof(struct msr_driver_t));
|
|
||||||
handle->fd = fd;
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_rdmsr(struct msr_driver_t* driver, uint32_t msr_index, uint64_t* result)
|
|
||||||
{
|
|
||||||
cpuctl_msr_args_t args;
|
|
||||||
args.msr = msr_index;
|
|
||||||
|
|
||||||
if (!driver || driver->fd < 0)
|
|
||||||
return set_error(ERR_HANDLE);
|
|
||||||
|
|
||||||
if(ioctl(driver->fd, CPUCTL_RDMSR, &args))
|
|
||||||
return set_error(ERR_INVMSR);
|
|
||||||
|
|
||||||
*result = args.data;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_msr_driver_close(struct msr_driver_t* drv)
|
|
||||||
{
|
|
||||||
if (drv && drv->fd >= 0) {
|
|
||||||
close(drv->fd);
|
|
||||||
free(drv);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* #endif defined (__FreeBSD__) || defined (__DragonFly__) */
|
|
||||||
|
|
||||||
#elif defined (_WIN32)
|
|
||||||
#include <windows.h>
|
|
||||||
#include <winioctl.h>
|
|
||||||
#include <winerror.h>
|
|
||||||
|
|
||||||
extern uint8_t cc_x86driver_code[];
|
|
||||||
extern int cc_x86driver_code_size;
|
|
||||||
extern uint8_t cc_x64driver_code[];
|
|
||||||
extern int cc_x64driver_code_size;
|
|
||||||
|
|
||||||
struct msr_driver_t {
|
|
||||||
char driver_path[MAX_PATH + 1];
|
|
||||||
SC_HANDLE scManager;
|
|
||||||
volatile SC_HANDLE scDriver;
|
|
||||||
HANDLE hhDriver;
|
|
||||||
OVERLAPPED ovl;
|
|
||||||
int errorcode;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int rdmsr_supported(void);
|
|
||||||
static int extract_driver(struct msr_driver_t* driver);
|
|
||||||
static int load_driver(struct msr_driver_t* driver);
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open(void)
|
|
||||||
{
|
|
||||||
struct msr_driver_t* drv;
|
|
||||||
int status;
|
|
||||||
if (!rdmsr_supported()) {
|
|
||||||
set_error(ERR_NO_RDMSR);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
drv = (struct msr_driver_t*) malloc(sizeof(struct msr_driver_t));
|
|
||||||
if (!drv) {
|
|
||||||
set_error(ERR_NO_MEM);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memset(drv, 0, sizeof(struct msr_driver_t));
|
|
||||||
|
|
||||||
if (!extract_driver(drv)) {
|
|
||||||
free(drv);
|
|
||||||
set_error(ERR_EXTRACT);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = load_driver(drv);
|
|
||||||
if (!DeleteFile(drv->driver_path))
|
|
||||||
debugf(1, "Deleting temporary driver file failed.\n");
|
|
||||||
if (!status) {
|
|
||||||
set_error(drv->errorcode ? drv->errorcode : ERR_NO_DRIVER);
|
|
||||||
free(drv);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return drv;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open_core(unsigned core_num)
|
|
||||||
{
|
|
||||||
warnf("cpu_msr_driver_open_core(): parameter ignored (function is the same as cpu_msr_driver_open)\n");
|
|
||||||
return cpu_msr_driver_open();
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
|
|
||||||
static BOOL is_running_x64(void)
|
|
||||||
{
|
|
||||||
BOOL bIsWow64 = FALSE;
|
|
||||||
|
|
||||||
LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(__TEXT("kernel32")), "IsWow64Process");
|
|
||||||
if(NULL != fnIsWow64Process)
|
|
||||||
fnIsWow64Process(GetCurrentProcess(), &bIsWow64);
|
|
||||||
return bIsWow64;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int extract_driver(struct msr_driver_t* driver)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
if (!GetTempPath(sizeof(driver->driver_path), driver->driver_path)) return 0;
|
|
||||||
strcat(driver->driver_path, "TmpRdr.sys");
|
|
||||||
|
|
||||||
f = fopen(driver->driver_path, "wb");
|
|
||||||
if (!f) return 0;
|
|
||||||
if (is_running_x64())
|
|
||||||
fwrite(cc_x64driver_code, 1, cc_x64driver_code_size, f);
|
|
||||||
else
|
|
||||||
fwrite(cc_x86driver_code, 1, cc_x86driver_code_size, f);
|
|
||||||
fclose(f);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL wait_for_service_state(SC_HANDLE hService, DWORD dwDesiredState, SERVICE_STATUS *lpsrvStatus){
|
|
||||||
BOOL fOK = FALSE;
|
|
||||||
DWORD dwWaitHint;
|
|
||||||
|
|
||||||
if(hService != NULL){
|
|
||||||
while(TRUE){
|
|
||||||
fOK = QueryServiceStatus(hService, lpsrvStatus);
|
|
||||||
if(!fOK)
|
|
||||||
break;
|
|
||||||
if(lpsrvStatus->dwCurrentState == dwDesiredState)
|
|
||||||
break;
|
|
||||||
|
|
||||||
dwWaitHint = lpsrvStatus->dwWaitHint / 10; // Poll 1/10 of the wait hint
|
|
||||||
if (dwWaitHint < 1000)
|
|
||||||
dwWaitHint = 1000; // At most once per second
|
|
||||||
if (dwWaitHint > 10000)
|
|
||||||
dwWaitHint = 10000; // At least every 10 seconds
|
|
||||||
Sleep(dwWaitHint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return fOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int load_driver(struct msr_driver_t* drv)
|
|
||||||
{
|
|
||||||
LPTSTR lpszInfo = __TEXT("RDMSR Executor Driver");
|
|
||||||
USHORT uLen = 0;
|
|
||||||
SERVICE_STATUS srvStatus = {0};
|
|
||||||
BOOL fRunning = FALSE;
|
|
||||||
DWORD dwLastError;
|
|
||||||
LPTSTR lpszDriverServiceName = __TEXT("TmpRdr");
|
|
||||||
TCHAR lpszDriverName[] = __TEXT("\\\\.\\Global\\TmpRdr");
|
|
||||||
|
|
||||||
if((LPVOID)(drv->scManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL) {
|
|
||||||
drv->scDriver = CreateService(drv->scManager, lpszDriverServiceName, lpszInfo, SERVICE_ALL_ACCESS,
|
|
||||||
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
|
|
||||||
drv->driver_path, NULL, NULL, NULL, NULL, NULL);
|
|
||||||
if(drv->scDriver == NULL){
|
|
||||||
switch(dwLastError = GetLastError()){
|
|
||||||
case ERROR_SERVICE_EXISTS:
|
|
||||||
case ERROR_SERVICE_MARKED_FOR_DELETE:{
|
|
||||||
LPQUERY_SERVICE_CONFIG lpqsc;
|
|
||||||
DWORD dwBytesNeeded;
|
|
||||||
|
|
||||||
drv->scDriver = OpenService(drv->scManager, lpszDriverServiceName, SERVICE_ALL_ACCESS);
|
|
||||||
if(drv->scDriver == NULL){
|
|
||||||
debugf(1, "Error opening service: %d\n", GetLastError());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryServiceConfig(drv->scDriver, NULL, 0, &dwBytesNeeded);
|
|
||||||
if((dwLastError = GetLastError()) == ERROR_INSUFFICIENT_BUFFER){
|
|
||||||
lpqsc = calloc(1, dwBytesNeeded);
|
|
||||||
if(!QueryServiceConfig(drv->scDriver, lpqsc, dwBytesNeeded, &dwBytesNeeded)){
|
|
||||||
free(lpqsc);
|
|
||||||
debugf(1, "Error query service config(adjusted buffer): %d\n", GetLastError());
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
free(lpqsc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
debugf(1, "Error query service config: %d\n", dwLastError);
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ERROR_ACCESS_DENIED:
|
|
||||||
drv->errorcode = ERR_NO_PERMS;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
debugf(1, "Create driver service failed: %d\n", dwLastError);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(drv->scDriver != NULL){
|
|
||||||
if(StartService(drv->scDriver, 0, NULL)){
|
|
||||||
if(!wait_for_service_state(drv->scDriver, SERVICE_RUNNING, &srvStatus)){
|
|
||||||
debugf(1, "Driver load failed.\n");
|
|
||||||
DeleteService(drv->scDriver);
|
|
||||||
CloseServiceHandle(drv->scManager);
|
|
||||||
drv->scDriver = NULL;
|
|
||||||
goto clean_up;
|
|
||||||
} else {
|
|
||||||
fRunning = TRUE;
|
|
||||||
}
|
|
||||||
} else{
|
|
||||||
if((dwLastError = GetLastError()) == ERROR_SERVICE_ALREADY_RUNNING)
|
|
||||||
fRunning = TRUE;
|
|
||||||
else{
|
|
||||||
debugf(1, "Driver start failed.\n");
|
|
||||||
DeleteService(drv->scDriver);
|
|
||||||
CloseServiceHandle(drv->scManager);
|
|
||||||
drv->scDriver = NULL;
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if(fRunning)
|
|
||||||
debugf(1, "Driver already running.\n");
|
|
||||||
else
|
|
||||||
debugf(1, "Driver loaded.\n");
|
|
||||||
CloseServiceHandle(drv->scManager);
|
|
||||||
drv->hhDriver = CreateFile(lpszDriverName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
|
|
||||||
drv->ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
debugf(1, "Open SCM failed: %d\n", GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
clean_up:
|
|
||||||
if(drv->scManager != NULL){
|
|
||||||
CloseServiceHandle(drv->scManager);
|
|
||||||
drv->scManager = 0; // pointless
|
|
||||||
}
|
|
||||||
if(drv->scDriver != NULL){
|
|
||||||
if(!DeleteService(drv->scDriver))
|
|
||||||
debugf(1, "Delete driver service failed: %d\n", GetLastError());
|
|
||||||
CloseServiceHandle(drv->scDriver);
|
|
||||||
drv->scDriver = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FILE_DEVICE_UNKNOWN 0x00000022
|
|
||||||
#define IOCTL_UNKNOWN_BASE FILE_DEVICE_UNKNOWN
|
|
||||||
#define IOCTL_PROCVIEW_RDMSR CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0803, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
|
|
||||||
|
|
||||||
int cpu_rdmsr(struct msr_driver_t* driver, uint32_t msr_index, uint64_t* result)
|
|
||||||
{
|
|
||||||
DWORD dwBytesReturned;
|
|
||||||
__int64 msrdata;
|
|
||||||
SERVICE_STATUS srvStatus = {0};
|
|
||||||
|
|
||||||
if (!driver)
|
|
||||||
return set_error(ERR_HANDLE);
|
|
||||||
DeviceIoControl(driver->hhDriver, IOCTL_PROCVIEW_RDMSR, &msr_index, sizeof(int), &msrdata, sizeof(__int64), &dwBytesReturned, &driver->ovl);
|
|
||||||
GetOverlappedResult(driver->hhDriver, &driver->ovl, &dwBytesReturned, TRUE);
|
|
||||||
*result = msrdata;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_msr_driver_close(struct msr_driver_t* drv)
|
|
||||||
{
|
|
||||||
SERVICE_STATUS srvStatus = {0};
|
|
||||||
if (drv == NULL) return 0;
|
|
||||||
if(drv->scDriver != NULL){
|
|
||||||
if (drv->hhDriver) CancelIo(drv->hhDriver);
|
|
||||||
if(drv->ovl.hEvent != NULL)
|
|
||||||
CloseHandle(drv->ovl.hEvent);
|
|
||||||
if (drv->hhDriver) CloseHandle(drv->hhDriver);
|
|
||||||
drv->hhDriver = NULL;
|
|
||||||
drv->ovl.hEvent = NULL;
|
|
||||||
if (ControlService(drv->scDriver, SERVICE_CONTROL_STOP, &srvStatus)){
|
|
||||||
if (wait_for_service_state(drv->scDriver, SERVICE_STOPPED, &srvStatus)){
|
|
||||||
DeleteService(drv->scDriver);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* endif defined (_WIN32) */
|
|
||||||
|
|
||||||
#else /* Unsupported OS */
|
|
||||||
/* On others OS (i.e., Darwin), we still do not support RDMSR, so supply dummy struct
|
|
||||||
and functions */
|
|
||||||
|
|
||||||
#define RDMSR_UNSUPPORTED_OS
|
|
||||||
|
|
||||||
struct msr_driver_t { int dummy; };
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open(void)
|
|
||||||
{
|
|
||||||
set_error(ERR_NOT_IMP);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_driver_t* cpu_msr_driver_open_core(unsigned core_num)
|
|
||||||
{
|
|
||||||
set_error(ERR_NOT_IMP);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_rdmsr(struct msr_driver_t* driver, uint32_t msr_index, uint64_t* result)
|
|
||||||
{
|
|
||||||
return set_error(ERR_NOT_IMP);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_msr_driver_close(struct msr_driver_t* driver)
|
|
||||||
{
|
|
||||||
return set_error(ERR_NOT_IMP);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_rdmsr_range(struct msr_driver_t* handle, uint32_t msr_index, uint8_t highbit,
|
|
||||||
uint8_t lowbit, uint64_t* result)
|
|
||||||
{
|
|
||||||
return set_error(ERR_NOT_IMP);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_msrinfo(struct msr_driver_t* driver, cpu_msrinfo_request_t which)
|
|
||||||
{
|
|
||||||
return set_error(ERR_NOT_IMP);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* Unsupported OS */
|
|
||||||
|
|
||||||
#ifndef RDMSR_UNSUPPORTED_OS
|
|
||||||
|
|
||||||
/* Useful links for hackers:
|
|
||||||
- AMD MSRs:
|
|
||||||
AMD BIOS and Kernel Developer’s Guide (BKDG)
|
|
||||||
* AMD Family 10h Processors
|
|
||||||
http://support.amd.com/TechDocs/31116.pdf
|
|
||||||
* AMD Family 11h Processors
|
|
||||||
http://support.amd.com/TechDocs/41256.pdf
|
|
||||||
* AMD Family 12h Processors
|
|
||||||
http://support.amd.com/TechDocs/41131.pdf
|
|
||||||
* AMD Family 14h Processors
|
|
||||||
http://support.amd.com/TechDocs/43170_14h_Mod_00h-0Fh_BKDG.pdf
|
|
||||||
* AMD Family 15h Processors
|
|
||||||
http://support.amd.com/TechDocs/42301_15h_Mod_00h-0Fh_BKDG.pdf
|
|
||||||
http://support.amd.com/TechDocs/42300_15h_Mod_10h-1Fh_BKDG.pdf
|
|
||||||
http://support.amd.com/TechDocs/49125_15h_Models_30h-3Fh_BKDG.pdf
|
|
||||||
http://support.amd.com/TechDocs/50742_15h_Models_60h-6Fh_BKDG.pdf
|
|
||||||
http://support.amd.com/TechDocs/49125_15h_Models_30h-3Fh_BKDG.pdf
|
|
||||||
* AMD Family 16h Processors
|
|
||||||
http://support.amd.com/TechDocs/48751_16h_bkdg.pdf
|
|
||||||
http://support.amd.com/TechDocs/52740_16h_Models_30h-3Fh_BKDG.pdf
|
|
||||||
|
|
||||||
- Intel MSRs:
|
|
||||||
Intel® 64 and IA-32 Architectures Software Developer’s Manual
|
|
||||||
* Volume 3 (3A, 3B, 3C & 3D): System Programming Guide
|
|
||||||
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-system-programming-manual-325384.pdf
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* AMD MSRs addresses */
|
|
||||||
#define MSR_PSTATE_L 0xC0010061
|
|
||||||
#define MSR_PSTATE_S 0xC0010063
|
|
||||||
#define MSR_PSTATE_0 0xC0010064
|
|
||||||
#define MSR_PSTATE_7 0xC001006B
|
|
||||||
|
|
||||||
/* Intel MSRs addresses */
|
|
||||||
#define IA32_MPERF 0xE7
|
|
||||||
#define IA32_APERF 0xE8
|
|
||||||
#define IA32_PERF_STATUS 0x198
|
|
||||||
#define IA32_THERM_STATUS 0x19C
|
|
||||||
#define MSR_EBL_CR_POWERON 0x2A
|
|
||||||
#define MSR_TURBO_RATIO_LIMIT 0x1AD
|
|
||||||
#define MSR_TEMPERATURE_TARGET 0x1A2
|
|
||||||
#define MSR_PERF_STATUS 0x198
|
|
||||||
#define MSR_PLATFORM_INFO 0xCE
|
|
||||||
|
|
||||||
|
|
||||||
static int rdmsr_supported(void)
|
|
||||||
{
|
|
||||||
struct cpu_id_t* id = get_cached_cpuid();
|
|
||||||
return id->flags[CPU_FEATURE_MSR];
|
|
||||||
}
|
|
||||||
|
|
||||||
static int perfmsr_measure(struct msr_driver_t* handle, int msr)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint64_t a, b;
|
|
||||||
uint64_t x, y;
|
|
||||||
err = cpu_rdmsr(handle, msr, &x);
|
|
||||||
if (err) return CPU_INVALID_VALUE;
|
|
||||||
sys_precise_clock(&a);
|
|
||||||
busy_loop_delay(10);
|
|
||||||
cpu_rdmsr(handle, msr, &y);
|
|
||||||
sys_precise_clock(&b);
|
|
||||||
if (a >= b || x > y) return CPU_INVALID_VALUE;
|
|
||||||
return (int) ((y - x) / (b - a));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int get_amd_multipliers(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal,
|
|
||||||
uint32_t pstate, uint64_t *multiplier)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
static int clock = 0;
|
|
||||||
uint64_t CpuFid, CpuDid, CpuDidLSD;
|
|
||||||
double divisor;
|
|
||||||
|
|
||||||
if (pstate < MSR_PSTATE_0 || MSR_PSTATE_7 < pstate)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
switch (id->ext_family) {
|
|
||||||
case 0x11:
|
|
||||||
/* BKDG 11h, page 236
|
|
||||||
MSRC001_00[6B:64][8:6] is CpuDid
|
|
||||||
MSRC001_00[6B:64][5:0] is CpuFid
|
|
||||||
CPU COF is ((100 MHz * (CpuFid + 08h)) / (2^CpuDid)) */
|
|
||||||
err = cpu_rdmsr_range(handle, pstate, 8, 6, &CpuDid);
|
|
||||||
err += cpu_rdmsr_range(handle, pstate, 5, 0, &CpuFid);
|
|
||||||
*multiplier = (uint64_t) ((CpuFid + 0x8) / (1ull << CpuDid));
|
|
||||||
break;
|
|
||||||
case 0x12:
|
|
||||||
/* BKDG 12h, page 469
|
|
||||||
MSRC001_00[6B:64][8:4] is CpuFid
|
|
||||||
MSRC001_00[6B:64][3:0] is CpuDid
|
|
||||||
CPU COF is (100MHz * (CpuFid + 10h) / (divisor specified by CpuDid)) */
|
|
||||||
err = cpu_rdmsr_range(handle, pstate, 8, 4, &CpuFid);
|
|
||||||
err += cpu_rdmsr_range(handle, pstate, 3, 0, &CpuDid);
|
|
||||||
if (CpuDid == 0x0)
|
|
||||||
divisor = 1;
|
|
||||||
else if (CpuDid == 0x1)
|
|
||||||
divisor = 1.5;
|
|
||||||
else if (CpuDid == 0x2)
|
|
||||||
divisor = 2;
|
|
||||||
else if (CpuDid == 0x3)
|
|
||||||
divisor = 3;
|
|
||||||
else if (CpuDid == 0x4)
|
|
||||||
divisor = 4;
|
|
||||||
else if (CpuDid == 0x5)
|
|
||||||
divisor = 6;
|
|
||||||
else if (CpuDid == 0x6)
|
|
||||||
divisor = 8;
|
|
||||||
else if (CpuDid == 0x7)
|
|
||||||
divisor = 12;
|
|
||||||
else if (CpuDid == 0x8)
|
|
||||||
divisor = 16;
|
|
||||||
else
|
|
||||||
divisor = 0;
|
|
||||||
|
|
||||||
if (divisor > 0)
|
|
||||||
*multiplier = (uint64_t) ((CpuFid + 0x10) / divisor);
|
|
||||||
else
|
|
||||||
err++;
|
|
||||||
break;
|
|
||||||
case 0x14:
|
|
||||||
/* BKDG 14h, page 430
|
|
||||||
MSRC001_00[6B:64][8:4] is CpuDidMSD
|
|
||||||
MSRC001_00[6B:64][3:0] is CpuDidLSD
|
|
||||||
PLL COF is (100 MHz * (D18F3xD4[MainPllOpFreqId] + 10h))
|
|
||||||
Divisor is (CpuDidMSD + (CpuDidLSD * 0.25) + 1)
|
|
||||||
CPU COF is (main PLL frequency specified by D18F3xD4[MainPllOpFreqId]) / (core clock divisor specified by CpuDidMSD and CpuDidLSD) */
|
|
||||||
err = cpu_rdmsr_range(handle, pstate, 8, 4, &CpuDid);
|
|
||||||
err += cpu_rdmsr_range(handle, pstate, 3, 0, &CpuDidLSD);
|
|
||||||
if (clock == 0)
|
|
||||||
clock = cpu_clock_measure(100, 1) + 5; // Fake round
|
|
||||||
*multiplier = (uint64_t) ((clock / 100 + 0x10) / (CpuDid + CpuDidLSD * 0.25 + 1));
|
|
||||||
break;
|
|
||||||
case 0x10:
|
|
||||||
/* BKDG 10h, page 429
|
|
||||||
MSRC001_00[6B:64][8:6] is CpuDid
|
|
||||||
MSRC001_00[6B:64][5:0] is CpuFid
|
|
||||||
CPU COF is (100 MHz * (CpuFid + 10h) / (2^CpuDid)) */
|
|
||||||
case 0x15:
|
|
||||||
/* BKDG 15h, page 570/580/635/692 (00h-0Fh/10h-1Fh/30h-3Fh/60h-6Fh)
|
|
||||||
MSRC001_00[6B:64][8:6] is CpuDid
|
|
||||||
MSRC001_00[6B:64][5:0] is CpuFid
|
|
||||||
CoreCOF is (100 * (MSRC001_00[6B:64][CpuFid] + 10h) / (2^MSRC001_00[6B:64][CpuDid])) */
|
|
||||||
case 0x16:
|
|
||||||
/* BKDG 16h, page 549/611 (00h-0Fh/30h-3Fh)
|
|
||||||
MSRC001_00[6B:64][8:6] is CpuDid
|
|
||||||
MSRC001_00[6B:64][5:0] is CpuFid
|
|
||||||
CoreCOF is (100 * (MSRC001_00[6B:64][CpuFid] + 10h) / (2^MSRC001_00[6B:64][CpuDid])) */
|
|
||||||
err = cpu_rdmsr_range(handle, pstate, 8, 6, &CpuDid);
|
|
||||||
err += cpu_rdmsr_range(handle, pstate, 5, 0, &CpuFid);
|
|
||||||
*multiplier = (uint64_t) ((CpuFid + 0x10) / (1ull << CpuDid));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
err = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double get_info_min_multiplier(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint64_t reg;
|
|
||||||
|
|
||||||
if(id->vendor == VENDOR_INTEL) {
|
|
||||||
/* Refer links above
|
|
||||||
Table 35-12. MSRs in Next Generation Intel Atom Processors Based on the Goldmont Microarchitecture
|
|
||||||
Table 35-13. MSRs in Processors Based on Intel® Microarchitecture Code Name Nehalem
|
|
||||||
Table 35-18. MSRs Supported by Intel® Processors based on Intel® microarchitecture code name Sandy Bridge (Contd.)
|
|
||||||
Table 35-23. Additional MSRs Supported by 3rd Generation Intel® Core™ Processors (based on Intel® microarchitecture code name Ivy Bridge)
|
|
||||||
Table 35-24. MSRs Supported by Intel® Xeon® Processors E5 v2 Product Family (based on Ivy Bridge-E microarchitecture)
|
|
||||||
Table 35-27. Additional MSRs Supported by Processors based on the Haswell or Haswell-E microarchitectures
|
|
||||||
Table 35-34. Additional MSRs Common to Intel® Xeon® Processor D and Intel Xeon Processors E5 v4 Family Based on the Broadwell Microarchitecture
|
|
||||||
Table 35-40. Selected MSRs Supported by Next Generation Intel® Xeon Phi™ Processors with DisplayFamily_DisplayModel Signature 06_57H
|
|
||||||
MSR_PLATFORM_INFO[47:40] is Maximum Efficiency Ratio
|
|
||||||
Maximum Efficiency Ratio is the minimum ratio that the processor can operates */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PLATFORM_INFO, 47, 40, ®);
|
|
||||||
if (!err) return (double) reg;
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_AMD) {
|
|
||||||
/* Refer links above
|
|
||||||
MSRC001_0061[6:4] is PstateMaxVal
|
|
||||||
PstateMaxVal is the lowest-performance non-boosted P-state */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PSTATE_L, 6, 4, ®);
|
|
||||||
err += get_amd_multipliers(handle, id, internal, MSR_PSTATE_0 + (uint32_t) reg, ®);
|
|
||||||
if (!err) return (double) reg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (double) CPU_INVALID_VALUE / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double get_info_cur_multiplier(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint64_t reg;
|
|
||||||
|
|
||||||
if(id->vendor == VENDOR_INTEL && internal->code.intel == PENTIUM) {
|
|
||||||
err = cpu_rdmsr(handle, MSR_EBL_CR_POWERON, ®);
|
|
||||||
if (!err) return (double) ((reg>>22) & 0x1f);
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_INTEL && internal->code.intel != PENTIUM) {
|
|
||||||
/* Refer links above
|
|
||||||
Table 35-2. IA-32 Architectural MSRs (Contd.)
|
|
||||||
IA32_PERF_STATUS[15:0] is Current performance State Value
|
|
||||||
[7:0] is 0x0, [15:8] looks like current ratio */
|
|
||||||
err = cpu_rdmsr_range(handle, IA32_PERF_STATUS, 15, 8, ®);
|
|
||||||
if (!err) return (double) reg;
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_AMD) {
|
|
||||||
/* Refer links above
|
|
||||||
MSRC001_0063[2:0] is CurPstate */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PSTATE_S, 2, 0, ®);
|
|
||||||
err += get_amd_multipliers(handle, id, internal, MSR_PSTATE_0 + (uint32_t) reg, ®);
|
|
||||||
if (!err) return (double) reg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (double) CPU_INVALID_VALUE / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double get_info_max_multiplier(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint64_t reg;
|
|
||||||
|
|
||||||
if(id->vendor == VENDOR_INTEL && internal->code.intel == PENTIUM) {
|
|
||||||
err = cpu_rdmsr(handle, IA32_PERF_STATUS, ®);
|
|
||||||
if (!err) return (double) ((reg >> 40) & 0x1f);
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_INTEL && internal->code.intel != PENTIUM) {
|
|
||||||
/* Refer links above
|
|
||||||
Table 35-10. Specific MSRs Supported by Intel® Atom™ Processor C2000 Series with CPUID Signature 06_4DH
|
|
||||||
Table 35-12. MSRs in Next Generation Intel Atom Processors Based on the Goldmont Microarchitecture (Contd.)
|
|
||||||
Table 35-13. MSRs in Processors Based on Intel® Microarchitecture Code Name Nehalem (Contd.)
|
|
||||||
Table 35-14. Additional MSRs in Intel® Xeon® Processor 5500 and 3400 Series
|
|
||||||
Table 35-16. Additional MSRs Supported by Intel Processors (Based on Intel® Microarchitecture Code Name Westmere)
|
|
||||||
Table 35-19. MSRs Supported by 2nd Generation Intel® Core™ Processors (Intel® microarchitecture code name Sandy Bridge)
|
|
||||||
Table 35-21. Selected MSRs Supported by Intel® Xeon® Processors E5 Family (based on Sandy Bridge microarchitecture)
|
|
||||||
Table 35-28. MSRs Supported by 4th Generation Intel® Core™ Processors (Haswell microarchitecture) (Contd.)
|
|
||||||
Table 35-30. Additional MSRs Supported by Intel® Xeon® Processor E5 v3 Family
|
|
||||||
Table 35-33. Additional MSRs Supported by Intel® Core™ M Processors and 5th Generation Intel® Core™ Processors
|
|
||||||
Table 35-34. Additional MSRs Common to Intel® Xeon® Processor D and Intel Xeon Processors E5 v4 Family Based on the Broadwell Microarchitecture
|
|
||||||
Table 35-37. Additional MSRs Supported by 6th Generation Intel® Core™ Processors Based on Skylake Microarchitecture
|
|
||||||
Table 35-40. Selected MSRs Supported by Next Generation Intel® Xeon Phi™ Processors with DisplayFamily_DisplayModel Signature 06_57H
|
|
||||||
MSR_TURBO_RATIO_LIMIT[7:0] is Maximum Ratio Limit for 1C */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_TURBO_RATIO_LIMIT, 7, 0, ®);
|
|
||||||
if (!err) return (double) reg;
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_AMD) {
|
|
||||||
/* Refer links above
|
|
||||||
MSRC001_0064 is Pb0
|
|
||||||
Pb0 is the highest-performance boosted P-state */
|
|
||||||
err = get_amd_multipliers(handle, id, internal, MSR_PSTATE_0, ®);
|
|
||||||
if (!err) return (double) reg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (double) CPU_INVALID_VALUE / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int get_info_temperature(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint64_t DigitalReadout, ReadingValid, TemperatureTarget;
|
|
||||||
|
|
||||||
if(id->vendor == VENDOR_INTEL) {
|
|
||||||
/* Refer links above
|
|
||||||
Table 35-2. IA-32 Architectural MSRs
|
|
||||||
IA32_THERM_STATUS[22:16] is Digital Readout
|
|
||||||
IA32_THERM_STATUS[31] is Reading Valid
|
|
||||||
|
|
||||||
Table 35-6. MSRs Common to the Silvermont Microarchitecture and Newer Microarchitectures for Intel® Atom
|
|
||||||
Table 35-13. MSRs in Processors Based on Intel® Microarchitecture Code Name Nehalem (Contd.)
|
|
||||||
Table 35-18. MSRs Supported by Intel® Processors based on Intel® microarchitecture code name Sandy Bridge (Contd.)
|
|
||||||
Table 35-24. MSRs Supported by Intel® Xeon® Processors E5 v2 Product Family (based on Ivy Bridge-E microarchitecture) (Contd.)
|
|
||||||
Table 35-34. Additional MSRs Common to Intel® Xeon® Processor D and Intel Xeon Processors E5 v4 Family Based on the Broadwell Microarchitecture
|
|
||||||
Table 35-40. Selected MSRs Supported by Next Generation Intel® Xeon Phi™ Processors with DisplayFamily_DisplayModel Signature 06_57H
|
|
||||||
MSR_TEMPERATURE_TARGET[23:16] is Temperature Target */
|
|
||||||
err = cpu_rdmsr_range(handle, IA32_THERM_STATUS, 22, 16, &DigitalReadout);
|
|
||||||
err += cpu_rdmsr_range(handle, IA32_THERM_STATUS, 31, 31, &ReadingValid);
|
|
||||||
err += cpu_rdmsr_range(handle, MSR_TEMPERATURE_TARGET, 23, 16, &TemperatureTarget);
|
|
||||||
if(!err && ReadingValid) return (int) (TemperatureTarget - DigitalReadout);
|
|
||||||
}
|
|
||||||
|
|
||||||
return CPU_INVALID_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double get_info_voltage(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
uint64_t reg, CpuVid;
|
|
||||||
|
|
||||||
if(id->vendor == VENDOR_INTEL) {
|
|
||||||
/* Refer links above
|
|
||||||
Table 35-18. MSRs Supported by Intel® Processors based on Intel® microarchitecture code name Sandy Bridge (Contd.)
|
|
||||||
MSR_PERF_STATUS[47:32] is Core Voltage
|
|
||||||
P-state core voltage can be computed by MSR_PERF_STATUS[37:32] * (float) 1/(2^13). */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PERF_STATUS, 47, 32, ®);
|
|
||||||
if (!err) return (double) reg / (1 << 13);
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_AMD) {
|
|
||||||
/* Refer links above
|
|
||||||
MSRC001_00[6B:64][15:9] is CpuVid
|
|
||||||
MSRC001_0063[2:0] is P-state Status
|
|
||||||
2.4.1.6.3 Serial VID (SVI) Encodings: voltage = 1.550V - 0.0125V * SviVid[6:0] */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PSTATE_S, 2, 0, ®);
|
|
||||||
err += cpu_rdmsr_range(handle, MSR_PSTATE_0 + (uint32_t) reg, 15, 9, &CpuVid);
|
|
||||||
if (!err && MSR_PSTATE_0 + (uint32_t) reg <= MSR_PSTATE_7) return 1.550 - 0.0125 * CpuVid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (double) CPU_INVALID_VALUE / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double get_info_bus_clock(struct msr_driver_t* handle, struct cpu_id_t *id,
|
|
||||||
struct internal_id_info_t *internal)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
static int clock = 0;
|
|
||||||
uint64_t reg;
|
|
||||||
|
|
||||||
if(clock == 0)
|
|
||||||
clock = cpu_clock_measure(100, 1);
|
|
||||||
|
|
||||||
if(id->vendor == VENDOR_INTEL) {
|
|
||||||
/* Refer links above
|
|
||||||
Table 35-12. MSRs in Next Generation Intel Atom Processors Based on the Goldmont Microarchitecture
|
|
||||||
Table 35-13. MSRs in Processors Based on Intel® Microarchitecture Code Name Nehalem
|
|
||||||
Table 35-18. MSRs Supported by Intel® Processors based on Intel® microarchitecture code name Sandy Bridge (Contd.)
|
|
||||||
Table 35-23. Additional MSRs Supported by 3rd Generation Intel® Core™ Processors (based on Intel® microarchitecture code name Ivy Bridge)
|
|
||||||
Table 35-24. MSRs Supported by Intel® Xeon® Processors E5 v2 Product Family (based on Ivy Bridge-E microarchitecture)
|
|
||||||
Table 35-27. Additional MSRs Supported by Processors based on the Haswell or Haswell-E microarchitectures
|
|
||||||
Table 35-40. Selected MSRs Supported by Next Generation Intel® Xeon Phi™ Processors with DisplayFamily_DisplayModel Signature 06_57H
|
|
||||||
MSR_PLATFORM_INFO[15:8] is Maximum Non-Turbo Ratio */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PLATFORM_INFO, 15, 8, ®);
|
|
||||||
if (!err) return (double) clock / reg;
|
|
||||||
}
|
|
||||||
else if(id->vendor == VENDOR_AMD) {
|
|
||||||
/* Refer links above
|
|
||||||
MSRC001_0061[2:0] is CurPstateLimit
|
|
||||||
CurPstateLimit is the highest-performance non-boosted P-state */
|
|
||||||
err = cpu_rdmsr_range(handle, MSR_PSTATE_L, 2, 0, ®);
|
|
||||||
err += get_amd_multipliers(handle, id, internal, MSR_PSTATE_0 + (uint32_t) reg, ®);
|
|
||||||
if (!err) return (double) clock / reg;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (double) CPU_INVALID_VALUE / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_rdmsr_range(struct msr_driver_t* handle, uint32_t msr_index, uint8_t highbit,
|
|
||||||
uint8_t lowbit, uint64_t* result)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
const uint8_t bits = highbit - lowbit + 1;
|
|
||||||
|
|
||||||
if(highbit > 63 || lowbit > highbit)
|
|
||||||
return set_error(ERR_INVRANGE);
|
|
||||||
|
|
||||||
err = cpu_rdmsr(handle, msr_index, result);
|
|
||||||
|
|
||||||
if(!err && bits < 64) {
|
|
||||||
/* Show only part of register */
|
|
||||||
*result >>= lowbit;
|
|
||||||
*result &= (1ULL << bits) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_msrinfo(struct msr_driver_t* handle, cpu_msrinfo_request_t which)
|
|
||||||
{
|
|
||||||
struct cpu_raw_data_t raw;
|
|
||||||
static struct cpu_id_t id;
|
|
||||||
static struct internal_id_info_t internal;
|
|
||||||
internal.score = -1;
|
|
||||||
|
|
||||||
if (handle == NULL)
|
|
||||||
return set_error(ERR_HANDLE);
|
|
||||||
|
|
||||||
if (internal.score == -1) {
|
|
||||||
cpuid_get_raw_data(&raw);
|
|
||||||
cpu_ident_internal(&raw, &id, &internal);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (which) {
|
|
||||||
case INFO_MPERF:
|
|
||||||
return perfmsr_measure(handle, IA32_MPERF);
|
|
||||||
case INFO_APERF:
|
|
||||||
return perfmsr_measure(handle, IA32_APERF);
|
|
||||||
case INFO_MIN_MULTIPLIER:
|
|
||||||
return (int) (get_info_min_multiplier(handle, &id, &internal) * 100);
|
|
||||||
case INFO_CUR_MULTIPLIER:
|
|
||||||
return (int) (get_info_cur_multiplier(handle, &id, &internal) * 100);
|
|
||||||
case INFO_MAX_MULTIPLIER:
|
|
||||||
return (int) (get_info_max_multiplier(handle, &id, &internal) * 100);
|
|
||||||
case INFO_TEMPERATURE:
|
|
||||||
return get_info_temperature(handle, &id, &internal);
|
|
||||||
case INFO_THROTTLING:
|
|
||||||
return CPU_INVALID_VALUE;
|
|
||||||
case INFO_VOLTAGE:
|
|
||||||
return (int) (get_info_voltage(handle, &id, &internal) * 100);
|
|
||||||
case INFO_BCLK:
|
|
||||||
case INFO_BUS_CLOCK:
|
|
||||||
return (int) (get_info_bus_clock(handle, &id, &internal) * 100);
|
|
||||||
default:
|
|
||||||
return CPU_INVALID_VALUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // RDMSR_UNSUPPORTED_OS
|
|
@ -1,320 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "libcpuid_util.h"
|
|
||||||
#include "asm-bits.h"
|
|
||||||
#include "rdtsc.h"
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
void sys_precise_clock(uint64_t *result)
|
|
||||||
{
|
|
||||||
double c, f;
|
|
||||||
LARGE_INTEGER freq, counter;
|
|
||||||
QueryPerformanceCounter(&counter);
|
|
||||||
QueryPerformanceFrequency(&freq);
|
|
||||||
c = (double) counter.QuadPart;
|
|
||||||
f = (double) freq.QuadPart;
|
|
||||||
*result = (uint64_t) ( c * 1000000.0 / f );
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* assuming Linux, Mac OS or other POSIX */
|
|
||||||
#include <sys/time.h>
|
|
||||||
void sys_precise_clock(uint64_t *result)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
*result = (uint64_t) tv.tv_sec * (uint64_t) 1000000 +
|
|
||||||
(uint64_t) tv.tv_usec;
|
|
||||||
}
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
/* out = a - b */
|
|
||||||
static void mark_t_subtract(struct cpu_mark_t* a, struct cpu_mark_t* b, struct cpu_mark_t *out)
|
|
||||||
{
|
|
||||||
out->tsc = a->tsc - b->tsc;
|
|
||||||
out->sys_clock = a->sys_clock - b->sys_clock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpu_tsc_mark(struct cpu_mark_t* mark)
|
|
||||||
{
|
|
||||||
cpu_rdtsc(&mark->tsc);
|
|
||||||
sys_precise_clock(&mark->sys_clock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpu_tsc_unmark(struct cpu_mark_t* mark)
|
|
||||||
{
|
|
||||||
struct cpu_mark_t temp;
|
|
||||||
cpu_tsc_mark(&temp);
|
|
||||||
mark_t_subtract(&temp, mark, mark);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int cpu_clock_by_mark(struct cpu_mark_t* mark)
|
|
||||||
{
|
|
||||||
uint64_t result;
|
|
||||||
|
|
||||||
/* Check if some subtraction resulted in a negative number: */
|
|
||||||
if ((mark->tsc >> 63) != 0 || (mark->sys_clock >> 63) != 0) return -1;
|
|
||||||
|
|
||||||
/* Divide-by-zero check: */
|
|
||||||
if (mark->sys_clock == 0) return -1;
|
|
||||||
|
|
||||||
/* Check if the result fits in 32bits */
|
|
||||||
result = mark->tsc / mark->sys_clock;
|
|
||||||
if (result > (uint64_t) 0x7fffffff) return -1;
|
|
||||||
return (int) result;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
int cpu_clock_by_os(void)
|
|
||||||
{
|
|
||||||
HKEY key;
|
|
||||||
DWORD result;
|
|
||||||
DWORD size = 4;
|
|
||||||
|
|
||||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"), 0, KEY_READ, &key) != ERROR_SUCCESS)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (RegQueryValueEx(key, TEXT("~MHz"), NULL, NULL, (LPBYTE) &result, (LPDWORD) &size) != ERROR_SUCCESS) {
|
|
||||||
RegCloseKey(key);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
RegCloseKey(key);
|
|
||||||
|
|
||||||
return (int)result;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
/* Assuming Mac OS X with hw.cpufrequency sysctl */
|
|
||||||
int cpu_clock_by_os(void)
|
|
||||||
{
|
|
||||||
long long result = -1;
|
|
||||||
size_t size = sizeof(result);
|
|
||||||
if (sysctlbyname("hw.cpufrequency", &result, &size, NULL, 0))
|
|
||||||
return -1;
|
|
||||||
return (int) (result / (long long) 1000000);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Assuming Linux with /proc/cpuinfo */
|
|
||||||
int cpu_clock_by_os(void)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
char line[1024], *s;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
f = fopen("/proc/cpuinfo", "rt");
|
|
||||||
if (!f) return -1;
|
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), f)) {
|
|
||||||
if (!strncmp(line, "cpu MHz", 7)) {
|
|
||||||
s = strchr(line, ':');
|
|
||||||
if (s && 1 == sscanf(s, ":%d.", &result)) {
|
|
||||||
fclose(f);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif /* __APPLE__ */
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
|
|
||||||
/* Emulate doing useful CPU intensive work */
|
|
||||||
static int busy_loop(int amount)
|
|
||||||
{
|
|
||||||
int i, j, k, s = 0;
|
|
||||||
static volatile int data[42] = {32, 12, -1, 5, 23, 0 };
|
|
||||||
for (i = 0; i < amount; i++)
|
|
||||||
for (j = 0; j < 65536; j++)
|
|
||||||
for (k = 0; k < 42; k++)
|
|
||||||
s += data[k];
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int busy_loop_delay(int milliseconds)
|
|
||||||
{
|
|
||||||
int cycles = 0, r = 0, first = 1;
|
|
||||||
uint64_t a, b, c;
|
|
||||||
sys_precise_clock(&a);
|
|
||||||
while (1) {
|
|
||||||
sys_precise_clock(&c);
|
|
||||||
if ((c - a) / 1000 > milliseconds) return r;
|
|
||||||
r += busy_loop(cycles);
|
|
||||||
if (first) {
|
|
||||||
first = 0;
|
|
||||||
} else {
|
|
||||||
if (c - b < 1000) cycles *= 2;
|
|
||||||
if (c - b > 10000) cycles /= 2;
|
|
||||||
}
|
|
||||||
b = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_clock_measure(int millis, int quad_check)
|
|
||||||
{
|
|
||||||
struct cpu_mark_t begin[4], end[4], temp, temp2;
|
|
||||||
int results[4], cycles, n, k, i, j, bi, bj, mdiff, diff, _zero = 0;
|
|
||||||
uint64_t tl;
|
|
||||||
|
|
||||||
if (millis < 1) return -1;
|
|
||||||
tl = millis * (uint64_t) 1000;
|
|
||||||
if (quad_check)
|
|
||||||
tl /= 4;
|
|
||||||
n = quad_check ? 4 : 1;
|
|
||||||
cycles = 1;
|
|
||||||
for (k = 0; k < n; k++) {
|
|
||||||
cpu_tsc_mark(&begin[k]);
|
|
||||||
end[k] = begin[k];
|
|
||||||
do {
|
|
||||||
/* Run busy loop, and fool the compiler that we USE the garbishy
|
|
||||||
value it calculates */
|
|
||||||
_zero |= (1 & busy_loop(cycles));
|
|
||||||
cpu_tsc_mark(&temp);
|
|
||||||
mark_t_subtract(&temp, &end[k], &temp2);
|
|
||||||
/* If busy loop is too short, increase it */
|
|
||||||
if (temp2.sys_clock < tl / 8)
|
|
||||||
cycles *= 2;
|
|
||||||
end[k] = temp;
|
|
||||||
} while (end[k].sys_clock - begin[k].sys_clock < tl);
|
|
||||||
mark_t_subtract(&end[k], &begin[k], &temp);
|
|
||||||
results[k] = cpu_clock_by_mark(&temp);
|
|
||||||
}
|
|
||||||
if (n == 1) return results[0];
|
|
||||||
mdiff = 0x7fffffff;
|
|
||||||
bi = bj = -1;
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
for (j = i + 1; j < 4; j++) {
|
|
||||||
diff = results[i] - results[j];
|
|
||||||
if (diff < 0) diff = -diff;
|
|
||||||
if (diff < mdiff) {
|
|
||||||
mdiff = diff;
|
|
||||||
bi = i;
|
|
||||||
bj = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (results[bi] == -1) return -1;
|
|
||||||
return (results[bi] + results[bj] + _zero) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void adjust_march_ic_multiplier(const struct cpu_id_t* id, int* numerator, int* denom)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* for cpu_clock_by_ic: we need to know how many clocks does a typical ADDPS instruction
|
|
||||||
* take, when issued in rapid succesion without dependencies. The whole idea of
|
|
||||||
* cpu_clock_by_ic was that this is easy to determine, at least it was back in 2010. Now
|
|
||||||
* it's getting progressively more hairy, but here are the current measurements:
|
|
||||||
*
|
|
||||||
* 1. For CPUs with 64-bit SSE units, ADDPS issue rate is 0.5 IPC (one insn in 2 clocks)
|
|
||||||
* 2. For CPUs with 128-bit SSE units, issue rate is exactly 1.0 IPC
|
|
||||||
* 3. For Bulldozer and later, it is 1.4 IPC (we multiply by 5/7)
|
|
||||||
* 4. For Skylake and later, it is 1.6 IPC (we multiply by 5/8)
|
|
||||||
*/
|
|
||||||
//
|
|
||||||
if (id->sse_size < 128) {
|
|
||||||
debugf(1, "SSE execution path is 64-bit\n");
|
|
||||||
// on a CPU with half SSE unit length, SSE instructions execute at 0.5 IPC;
|
|
||||||
// the resulting value must be multiplied by 2:
|
|
||||||
*numerator = 2;
|
|
||||||
} else {
|
|
||||||
debugf(1, "SSE execution path is 128-bit\n");
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Bulldozer or later: assume 1.4 IPC
|
|
||||||
if (id->vendor == VENDOR_AMD && id->ext_family >= 21) {
|
|
||||||
debugf(1, "cpu_clock_by_ic: Bulldozer (or later) detected, dividing result by 1.4\n");
|
|
||||||
*numerator = 5;
|
|
||||||
*denom = 7; // multiply by 5/7, to divide by 1.4
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Skylake or later: assume 1.6 IPC
|
|
||||||
if (id->vendor == VENDOR_INTEL && id->ext_model >= 94) {
|
|
||||||
debugf(1, "cpu_clock_by_ic: Skylake (or later) detected, dividing result by 1.6\n");
|
|
||||||
*numerator = 5;
|
|
||||||
*denom = 8; // to divide by 1.6, multiply by 5/8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_clock_by_ic(int millis, int runs)
|
|
||||||
{
|
|
||||||
int max_value = 0, cur_value, i, ri, cycles_inner, cycles_outer, c;
|
|
||||||
struct cpu_id_t* id;
|
|
||||||
uint64_t t0, t1, tl, hz;
|
|
||||||
int multiplier_numerator = 1, multiplier_denom = 1;
|
|
||||||
if (millis <= 0 || runs <= 0) return -2;
|
|
||||||
id = get_cached_cpuid();
|
|
||||||
// if there aren't SSE instructions - we can't run the test at all
|
|
||||||
if (!id || !id->flags[CPU_FEATURE_SSE]) return -1;
|
|
||||||
//
|
|
||||||
adjust_march_ic_multiplier(id, &multiplier_numerator, &multiplier_denom);
|
|
||||||
//
|
|
||||||
tl = millis * 125; // (*1000 / 8)
|
|
||||||
cycles_inner = 128;
|
|
||||||
cycles_outer = 1;
|
|
||||||
do {
|
|
||||||
if (cycles_inner < 1000000000) cycles_inner *= 2;
|
|
||||||
else cycles_outer *= 2;
|
|
||||||
sys_precise_clock(&t0);
|
|
||||||
for (i = 0; i < cycles_outer; i++)
|
|
||||||
busy_sse_loop(cycles_inner);
|
|
||||||
sys_precise_clock(&t1);
|
|
||||||
} while (t1 - t0 < tl);
|
|
||||||
debugf(2, "inner: %d, outer: %d\n", cycles_inner, cycles_outer);
|
|
||||||
for (ri = 0; ri < runs; ri++) {
|
|
||||||
sys_precise_clock(&t0);
|
|
||||||
c = 0;
|
|
||||||
do {
|
|
||||||
c++;
|
|
||||||
for (i = 0; i < cycles_outer; i++)
|
|
||||||
busy_sse_loop(cycles_inner);
|
|
||||||
sys_precise_clock(&t1);
|
|
||||||
} while (t1 - t0 < tl * (uint64_t) 8);
|
|
||||||
// cpu_Hz = cycles_inner * cycles_outer * 256 / (t1 - t0) * 1000000
|
|
||||||
debugf(2, "c = %d, td = %d\n", c, (int) (t1 - t0));
|
|
||||||
hz = ((uint64_t) cycles_inner * (uint64_t) 256 + 12) *
|
|
||||||
(uint64_t) cycles_outer * (uint64_t) multiplier_numerator * (uint64_t) c * (uint64_t) 1000000
|
|
||||||
/ ((t1 - t0) * (uint64_t) multiplier_denom);
|
|
||||||
cur_value = (int) (hz / 1000000);
|
|
||||||
if (cur_value > max_value) max_value = cur_value;
|
|
||||||
}
|
|
||||||
return max_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_clock(void)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
result = cpu_clock_by_os();
|
|
||||||
if (result <= 0)
|
|
||||||
result = cpu_clock_measure(200, 1);
|
|
||||||
return result;
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __RDTSC_H__
|
|
||||||
#define __RDTSC_H__
|
|
||||||
|
|
||||||
void sys_precise_clock(uint64_t *result);
|
|
||||||
int busy_loop_delay(int milliseconds);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __RDTSC_H__ */
|
|
@ -1,486 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "libcpuid_util.h"
|
|
||||||
#include "libcpuid_internal.h"
|
|
||||||
#include "recog_amd.h"
|
|
||||||
|
|
||||||
const struct amd_code_str { amd_code_t code; char *str; } amd_code_str[] = {
|
|
||||||
#define CODE(x) { x, #x }
|
|
||||||
#define CODE2(x, y) CODE(x)
|
|
||||||
#include "amd_code_t.h"
|
|
||||||
#undef CODE
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct match_entry_t cpudb_amd[] = {
|
|
||||||
{ -1, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown AMD CPU" },
|
|
||||||
|
|
||||||
/* 486 and the likes */
|
|
||||||
{ 4, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown AMD 486" },
|
|
||||||
{ 4, 3, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "AMD 486DX2" },
|
|
||||||
{ 4, 7, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "AMD 486DX2WB" },
|
|
||||||
{ 4, 8, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "AMD 486DX4" },
|
|
||||||
{ 4, 9, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "AMD 486DX4WB" },
|
|
||||||
|
|
||||||
/* Pentia clones */
|
|
||||||
{ 5, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown AMD 586" },
|
|
||||||
{ 5, 0, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K5" },
|
|
||||||
{ 5, 1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K5" },
|
|
||||||
{ 5, 2, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K5" },
|
|
||||||
{ 5, 3, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K5" },
|
|
||||||
|
|
||||||
/* The K6 */
|
|
||||||
{ 5, 6, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K6" },
|
|
||||||
{ 5, 7, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K6" },
|
|
||||||
|
|
||||||
{ 5, 8, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K6-2" },
|
|
||||||
{ 5, 9, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K6-III" },
|
|
||||||
{ 5, 10, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown K6" },
|
|
||||||
{ 5, 11, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown K6" },
|
|
||||||
{ 5, 12, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown K6" },
|
|
||||||
{ 5, 13, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "K6-2+" },
|
|
||||||
|
|
||||||
/* Athlon et al. */
|
|
||||||
{ 6, 1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Athlon (Slot-A)" },
|
|
||||||
{ 6, 2, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Athlon (Slot-A)" },
|
|
||||||
{ 6, 3, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Duron (Spitfire)" },
|
|
||||||
{ 6, 4, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Athlon (ThunderBird)" },
|
|
||||||
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Athlon" },
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, ATHLON , 0, "Athlon (Palomino)" },
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, ATHLON_MP , 0, "Athlon MP (Palomino)" },
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, DURON , 0, "Duron (Palomino)" },
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, ATHLON_XP , 0, "Athlon XP" },
|
|
||||||
|
|
||||||
{ 6, 7, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Athlon XP" },
|
|
||||||
{ 6, 7, -1, -1, -1, 1, -1, -1, DURON , 0, "Duron (Morgan)" },
|
|
||||||
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Athlon XP" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, ATHLON , 0, "Athlon XP (Thoroughbred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, ATHLON_XP , 0, "Athlon XP (Thoroughbred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, DURON , 0, "Duron (Applebred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, SEMPRON , 0, "Sempron (Thoroughbred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, 128, -1, SEMPRON , 0, "Sempron (Thoroughbred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, 256, -1, SEMPRON , 0, "Sempron (Thoroughbred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, ATHLON_MP , 0, "Athlon MP (Thoroughbred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, ATHLON_XP_M , 0, "Mobile Athlon (T-Bred)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, ATHLON_XP_M_LV , 0, "Mobile Athlon (T-Bred)" },
|
|
||||||
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Athlon XP (Barton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, 512, -1, ATHLON_XP , 0, "Athlon XP (Barton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, 512, -1, SEMPRON , 0, "Sempron (Barton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, 256, -1, SEMPRON , 0, "Sempron (Thorton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, 256, -1, ATHLON_XP , 0, "Athlon XP (Thorton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, ATHLON_MP , 0, "Athlon MP (Barton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, ATHLON_XP_M , 0, "Mobile Athlon (Barton)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, ATHLON_XP_M_LV , 0, "Mobile Athlon (Barton)" },
|
|
||||||
|
|
||||||
/* K8 Architecture */
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Unknown K8" },
|
|
||||||
{ 15, -1, -1, 16, -1, 1, -1, -1, NO_CODE , 0, "Unknown K9" },
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Unknown A64" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, OPTERON_SINGLE , 0, "Opteron" },
|
|
||||||
{ 15, -1, -1, 15, -1, 2, -1, -1, OPTERON_DUALCORE , 0, "Opteron (Dual Core)" },
|
|
||||||
{ 15, 3, -1, 15, -1, 1, -1, -1, OPTERON_SINGLE , 0, "Opteron" },
|
|
||||||
{ 15, 3, -1, 15, -1, 2, -1, -1, OPTERON_DUALCORE , 0, "Opteron (Dual Core)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (512K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 1024, -1, ATHLON_64 , 0, "Athlon 64 (1024K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, ATHLON_FX , 0, "Athlon FX" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, ATHLON_64_FX , 0, "Athlon 64 FX" },
|
|
||||||
{ 15, 3, -1, 15, 35, 2, -1, -1, ATHLON_64_FX , 0, "Athlon 64 FX X2 (Toledo)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (512K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 2, 1024, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (1024K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 512, -1, TURION_64 , 0, "Turion 64 (512K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 1024, -1, TURION_64 , 0, "Turion 64 (1024K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 2, 512, -1, TURION_X2 , 0, "Turion 64 X2 (512K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 2, 1024, -1, TURION_X2 , 0, "Turion 64 X2 (1024K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 128, -1, SEMPRON , 0, "A64 Sempron (128K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 256, -1, SEMPRON , 0, "A64 Sempron (256K)" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, 512, -1, SEMPRON , 0, "A64 Sempron (512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x4f, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (Orleans/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x5f, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (Orleans/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x2f, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (Venice/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x2c, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (Venice/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x1f, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (Winchester/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x0c, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (Newcastle/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x27, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (San Diego/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x37, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (San Diego/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x04, 1, 512, -1, ATHLON_64 , 0, "Athlon 64 (ClawHammer/512K)" },
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, 0x5f, 1, 1024, -1, ATHLON_64 , 0, "Athlon 64 (Orleans/1024K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x27, 1, 1024, -1, ATHLON_64 , 0, "Athlon 64 (San Diego/1024K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x04, 1, 1024, -1, ATHLON_64 , 0, "Athlon 64 (ClawHammer/1024K)" },
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, 0x4b, 2, 256, -1, SEMPRON_DUALCORE , 0, "Athlon 64 X2 (Windsor/256K)" },
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, 0x23, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Toledo/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x4b, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Windsor/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x43, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Windsor/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x6b, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Brisbane/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x2b, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Manchester/512K)"},
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, 0x23, 2, 1024, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Toledo/1024K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x43, 2, 1024, -1, ATHLON_64_X2 , 0, "Athlon 64 X2 (Windsor/1024K)" },
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, 0x08, 1, 128, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Dublin/128K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x08, 1, 256, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Dublin/256K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x0c, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Paris)" },
|
|
||||||
{ 15, -1, -1, 15, 0x1c, 1, 128, -1, SEMPRON , 0, "Sempron 64 (Palermo/128K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x1c, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Palermo/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x1c, 1, 128, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Sonora/128K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x1c, 1, 256, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Sonora/256K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x2c, 1, 128, -1, SEMPRON , 0, "Sempron 64 (Palermo/128K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x2c, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Palermo/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x2c, 1, 128, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Albany/128K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x2c, 1, 256, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Albany/256K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x2f, 1, 128, -1, SEMPRON , 0, "Sempron 64 (Palermo/128K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x2f, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Palermo/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x4f, 1, 128, -1, SEMPRON , 0, "Sempron 64 (Manila/128K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x4f, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Manila/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x5f, 1, 128, -1, SEMPRON , 0, "Sempron 64 (Manila/128K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x5f, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Manila/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x6b, 2, 256, -1, SEMPRON , 0, "Sempron 64 Dual (Sherman/256K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x6b, 2, 512, -1, SEMPRON , 0, "Sempron 64 Dual (Sherman/512K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x7f, 1, 256, -1, SEMPRON , 0, "Sempron 64 (Sparta/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x7f, 1, 512, -1, SEMPRON , 0, "Sempron 64 (Sparta/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x4c, 1, 256, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Keene/256K)"},
|
|
||||||
{ 15, -1, -1, 15, 0x4c, 1, 512, -1, M_SEMPRON , 0, "Mobile Sempron 64 (Keene/512K)"},
|
|
||||||
{ 15, -1, -1, 15, -1, 2, -1, -1, SEMPRON_DUALCORE , 0, "Sempron Dual Core" },
|
|
||||||
|
|
||||||
{ 15, -1, -1, 15, 0x24, 1, 512, -1, TURION_64 , 0, "Turion 64 (Lancaster/512K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x24, 1, 1024, -1, TURION_64 , 0, "Turion 64 (Lancaster/1024K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x48, 2, 256, -1, TURION_X2 , 0, "Turion X2 (Taylor)" },
|
|
||||||
{ 15, -1, -1, 15, 0x48, 2, 512, -1, TURION_X2 , 0, "Turion X2 (Trinidad)" },
|
|
||||||
{ 15, -1, -1, 15, 0x4c, 1, 512, -1, TURION_64 , 0, "Turion 64 (Richmond)" },
|
|
||||||
{ 15, -1, -1, 15, 0x68, 2, 256, -1, TURION_X2 , 0, "Turion X2 (Tyler/256K)" },
|
|
||||||
{ 15, -1, -1, 15, 0x68, 2, 512, -1, TURION_X2 , 0, "Turion X2 (Tyler/512K)" },
|
|
||||||
{ 15, -1, -1, 17, 3, 2, 512, -1, TURION_X2 , 0, "Turion X2 (Griffin/512K)" },
|
|
||||||
{ 15, -1, -1, 17, 3, 2, 1024, -1, TURION_X2 , 0, "Turion X2 (Griffin/1024K)" },
|
|
||||||
|
|
||||||
/* K9 Architecture */
|
|
||||||
{ 15, -1, -1, 16, -1, 1, -1, -1, PHENOM , 0, "Unknown AMD Phenom" },
|
|
||||||
{ 15, 2, -1, 16, -1, 1, -1, -1, PHENOM , 0, "Phenom" },
|
|
||||||
{ 15, 2, -1, 16, -1, 3, -1, -1, PHENOM , 0, "Phenom X3 (Toliman)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 4, -1, -1, PHENOM , 0, "Phenom X4 (Agena)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 3, 512, -1, PHENOM , 0, "Phenom X3 (Toliman/256K)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 3, 512, -1, PHENOM , 0, "Phenom X3 (Toliman/512K)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 4, 128, -1, PHENOM , 0, "Phenom X4 (Agena/128K)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 4, 256, -1, PHENOM , 0, "Phenom X4 (Agena/256K)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 4, 512, -1, PHENOM , 0, "Phenom X4 (Agena/512K)" },
|
|
||||||
{ 15, 2, -1, 16, -1, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon X2 (Kuma)" },
|
|
||||||
/* Phenom II derivates: */
|
|
||||||
{ 15, 4, -1, 16, -1, 4, -1, -1, NO_CODE , 0, "Phenom (Deneb-based)" },
|
|
||||||
{ 15, 4, -1, 16, -1, 1, 1024, -1, SEMPRON , 0, "Sempron (Sargas)" },
|
|
||||||
{ 15, 4, -1, 16, -1, 2, 512, -1, PHENOM2 , 0, "Phenom II X2 (Callisto)" },
|
|
||||||
{ 15, 4, -1, 16, -1, 3, 512, -1, PHENOM2 , 0, "Phenom II X3 (Heka)" },
|
|
||||||
{ 15, 4, -1, 16, -1, 4, 512, -1, PHENOM2 , 0, "Phenom II X4" },
|
|
||||||
{ 15, 4, -1, 16, 4, 4, 512, -1, PHENOM2 , 0, "Phenom II X4 (Deneb)" },
|
|
||||||
{ 15, 5, -1, 16, 5, 4, 512, -1, PHENOM2 , 0, "Phenom II X4 (Deneb)" },
|
|
||||||
{ 15, 4, -1, 16, 10, 4, 512, -1, PHENOM2 , 0, "Phenom II X4 (Zosma)" },
|
|
||||||
{ 15, 4, -1, 16, 10, 6, 512, -1, PHENOM2 , 0, "Phenom II X6 (Thuban)" },
|
|
||||||
|
|
||||||
{ 15, 6, -1, 16, 6, 2, 512, -1, ATHLON , 0, "Athlon II (Champlain)" },
|
|
||||||
{ 15, 6, -1, 16, 6, 2, 512, -1, ATHLON_64_X2 , 0, "Athlon II X2 (Regor)" },
|
|
||||||
{ 15, 6, -1, 16, 6, 2, 1024, -1, ATHLON_64_X2 , 0, "Athlon II X2 (Regor)" },
|
|
||||||
{ 15, 5, -1, 16, 5, 3, 512, -1, ATHLON_64_X3 , 0, "Athlon II X3 (Rana)" },
|
|
||||||
{ 15, 5, -1, 16, 5, 4, 512, -1, ATHLON_64_X4 , 0, "Athlon II X4 (Propus)" },
|
|
||||||
|
|
||||||
/* 2011 CPUs: K10 architecture: Llano */
|
|
||||||
{ 15, 1, -1, 18, 1, 2, 512, -1, FUSION_EA , 0, "Llano X2" },
|
|
||||||
{ 15, 1, -1, 18, 1, 2, 1024, -1, FUSION_EA , 0, "Llano X2" },
|
|
||||||
{ 15, 1, -1, 18, 1, 3, 1024, -1, FUSION_EA , 0, "Llano X3" },
|
|
||||||
{ 15, 1, -1, 18, 1, 4, 1024, -1, FUSION_EA , 0, "Llano X4" },
|
|
||||||
/* 2011 CPUs: Bobcat architecture: Ontario, Zacate, Desna, Hondo */
|
|
||||||
{ 15, 2, -1, 20, -1, 1, 512, -1, FUSION_C , 0, "Brazos Ontario" },
|
|
||||||
{ 15, 2, -1, 20, -1, 2, 512, -1, FUSION_C , 0, "Brazos Ontario (Dual-core)" },
|
|
||||||
{ 15, 1, -1, 20, -1, 1, 512, -1, FUSION_E , 0, "Brazos Zacate" },
|
|
||||||
{ 15, 1, -1, 20, -1, 2, 512, -1, FUSION_E , 0, "Brazos Zacate (Dual-core)" },
|
|
||||||
{ 15, 2, -1, 20, -1, 2, 512, -1, FUSION_Z , 0, "Brazos Desna (Dual-core)" },
|
|
||||||
/* 2012 CPUs: Piledriver architecture: Trinity and Richland */
|
|
||||||
{ 15, 0, -1, 21, 10, 2, 1024, -1, FUSION_A , 0, "Trinity X2" },
|
|
||||||
{ 15, 0, -1, 21, 16, 2, 1024, -1, FUSION_A , 0, "Trinity X2" },
|
|
||||||
{ 15, 0, -1, 21, 10, 4, 1024, -1, FUSION_A , 0, "Trinity X4" },
|
|
||||||
{ 15, 0, -1, 21, 16, 4, 1024, -1, FUSION_A , 0, "Trinity X4" },
|
|
||||||
{ 15, 3, -1, 21, 13, 2, 1024, -1, FUSION_A , 0, "Richland X2" },
|
|
||||||
{ 15, 3, -1, 21, 13, 4, 1024, -1, FUSION_A , 0, "Richland X4" },
|
|
||||||
/* 2013 CPUs: Jaguar architecture: Kabini and Temash */
|
|
||||||
{ 15, 0, -1, 22, 0, 2, 1024, -1, FUSION_A , 0, "Kabini X2" },
|
|
||||||
{ 15, 0, -1, 22, 0, 4, 1024, -1, FUSION_A , 0, "Kabini X4" },
|
|
||||||
/* 2014 CPUs: Steamroller architecture: Kaveri */
|
|
||||||
{ 15, 0, -1, 21, 30, 2, 1024, -1, FUSION_A , 0, "Kaveri X2" },
|
|
||||||
{ 15, 0, -1, 21, 30, 4, 1024, -1, FUSION_A , 0, "Kaveri X4" },
|
|
||||||
/* 2014 CPUs: Puma architecture: Beema and Mullins */
|
|
||||||
{ 15, 0, -1, 22, 30, 2, 1024, -1, FUSION_E , 0, "Mullins X2" },
|
|
||||||
{ 15, 0, -1, 22, 30, 4, 1024, -1, FUSION_A , 0, "Mullins X4" },
|
|
||||||
/* 2015 CPUs: Excavator architecture: Carrizo */
|
|
||||||
{ 15, 1, -1, 21, 60, 2, 1024, -1, FUSION_A , 0, "Carrizo X2" },
|
|
||||||
{ 15, 1, -1, 21, 60, 4, 1024, -1, FUSION_A , 0, "Carrizo X4" },
|
|
||||||
/* 2015 CPUs: Steamroller architecture: Godavari */
|
|
||||||
//TODO
|
|
||||||
/* 2016 CPUs: Excavator architecture: Bristol Ridge */
|
|
||||||
//TODO
|
|
||||||
|
|
||||||
/* Newer Opterons: */
|
|
||||||
{ 15, 9, -1, 22, 9, 8, -1, -1, OPTERON_GENERIC , 0, "Magny-Cours Opteron" },
|
|
||||||
|
|
||||||
/* Bulldozer CPUs: */
|
|
||||||
{ 15, -1, -1, 21, 0, 4, 2048, -1, NO_CODE , 0, "Bulldozer X2" },
|
|
||||||
{ 15, -1, -1, 21, 1, 4, 2048, -1, NO_CODE , 0, "Bulldozer X2" },
|
|
||||||
{ 15, -1, -1, 21, 1, 6, 2048, -1, NO_CODE , 0, "Bulldozer X3" },
|
|
||||||
{ 15, -1, -1, 21, 1, 8, 2048, -1, NO_CODE , 0, "Bulldozer X4" },
|
|
||||||
/* Piledriver CPUs: */
|
|
||||||
{ 15, -1, -1, 21, 2, 4, 2048, -1, NO_CODE , 0, "Vishera X2" },
|
|
||||||
{ 15, -1, -1, 21, 2, 6, 2048, -1, NO_CODE , 0, "Vishera X3" },
|
|
||||||
{ 15, -1, -1, 21, 2, 8, 2048, -1, NO_CODE , 0, "Vishera X4" },
|
|
||||||
/* Steamroller CPUs: */
|
|
||||||
//TODO
|
|
||||||
/* Excavator CPUs: */
|
|
||||||
//TODO
|
|
||||||
/* Zen CPUs: */
|
|
||||||
//TODO
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void load_amd_features(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
const struct feature_map_t matchtable_edx81[] = {
|
|
||||||
{ 20, CPU_FEATURE_NX },
|
|
||||||
{ 22, CPU_FEATURE_MMXEXT },
|
|
||||||
{ 25, CPU_FEATURE_FXSR_OPT },
|
|
||||||
{ 30, CPU_FEATURE_3DNOWEXT },
|
|
||||||
{ 31, CPU_FEATURE_3DNOW },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_ecx81[] = {
|
|
||||||
{ 1, CPU_FEATURE_CMP_LEGACY },
|
|
||||||
{ 2, CPU_FEATURE_SVM },
|
|
||||||
{ 5, CPU_FEATURE_ABM },
|
|
||||||
{ 6, CPU_FEATURE_SSE4A },
|
|
||||||
{ 7, CPU_FEATURE_MISALIGNSSE },
|
|
||||||
{ 8, CPU_FEATURE_3DNOWPREFETCH },
|
|
||||||
{ 9, CPU_FEATURE_OSVW },
|
|
||||||
{ 10, CPU_FEATURE_IBS },
|
|
||||||
{ 11, CPU_FEATURE_XOP },
|
|
||||||
{ 12, CPU_FEATURE_SKINIT },
|
|
||||||
{ 13, CPU_FEATURE_WDT },
|
|
||||||
{ 16, CPU_FEATURE_FMA4 },
|
|
||||||
{ 21, CPU_FEATURE_TBM },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_edx87[] = {
|
|
||||||
{ 0, CPU_FEATURE_TS },
|
|
||||||
{ 1, CPU_FEATURE_FID },
|
|
||||||
{ 2, CPU_FEATURE_VID },
|
|
||||||
{ 3, CPU_FEATURE_TTP },
|
|
||||||
{ 4, CPU_FEATURE_TM_AMD },
|
|
||||||
{ 5, CPU_FEATURE_STC },
|
|
||||||
{ 6, CPU_FEATURE_100MHZSTEPS },
|
|
||||||
{ 7, CPU_FEATURE_HWPSTATE },
|
|
||||||
/* id 8 is handled in common */
|
|
||||||
{ 9, CPU_FEATURE_CPB },
|
|
||||||
{ 10, CPU_FEATURE_APERFMPERF },
|
|
||||||
{ 11, CPU_FEATURE_PFI },
|
|
||||||
{ 12, CPU_FEATURE_PA },
|
|
||||||
};
|
|
||||||
if (raw->ext_cpuid[0][0] >= 0x80000001) {
|
|
||||||
match_features(matchtable_edx81, COUNT_OF(matchtable_edx81), raw->ext_cpuid[1][3], data);
|
|
||||||
match_features(matchtable_ecx81, COUNT_OF(matchtable_ecx81), raw->ext_cpuid[1][2], data);
|
|
||||||
}
|
|
||||||
if (raw->ext_cpuid[0][0] >= 0x80000007)
|
|
||||||
match_features(matchtable_edx87, COUNT_OF(matchtable_edx87), raw->ext_cpuid[7][3], data);
|
|
||||||
if (raw->ext_cpuid[0][0] >= 0x8000001a) {
|
|
||||||
/* We have the extended info about SSE unit size */
|
|
||||||
data->detection_hints[CPU_HINT_SSE_SIZE_AUTH] = 1;
|
|
||||||
data->sse_size = (raw->ext_cpuid[0x1a][0] & 1) ? 128 : 64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_amd_cache_info(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int l3_result;
|
|
||||||
const int assoc_table[16] = {
|
|
||||||
0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, 255
|
|
||||||
};
|
|
||||||
unsigned n = raw->ext_cpuid[0][0];
|
|
||||||
|
|
||||||
if (n >= 0x80000005) {
|
|
||||||
data->l1_data_cache = (raw->ext_cpuid[5][2] >> 24) & 0xff;
|
|
||||||
data->l1_assoc = (raw->ext_cpuid[5][2] >> 16) & 0xff;
|
|
||||||
data->l1_cacheline = (raw->ext_cpuid[5][2]) & 0xff;
|
|
||||||
data->l1_instruction_cache = (raw->ext_cpuid[5][3] >> 24) & 0xff;
|
|
||||||
}
|
|
||||||
if (n >= 0x80000006) {
|
|
||||||
data->l2_cache = (raw->ext_cpuid[6][2] >> 16) & 0xffff;
|
|
||||||
data->l2_assoc = assoc_table[(raw->ext_cpuid[6][2] >> 12) & 0xf];
|
|
||||||
data->l2_cacheline = (raw->ext_cpuid[6][2]) & 0xff;
|
|
||||||
|
|
||||||
l3_result = (raw->ext_cpuid[6][3] >> 18);
|
|
||||||
if (l3_result > 0) {
|
|
||||||
l3_result = 512 * l3_result; /* AMD spec says it's a range,
|
|
||||||
but we take the lower bound */
|
|
||||||
data->l3_cache = l3_result;
|
|
||||||
data->l3_assoc = assoc_table[(raw->ext_cpuid[6][3] >> 12) & 0xf];
|
|
||||||
data->l3_cacheline = (raw->ext_cpuid[6][3]) & 0xff;
|
|
||||||
} else {
|
|
||||||
data->l3_cache = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_amd_number_of_cores(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int logical_cpus = -1, num_cores = -1;
|
|
||||||
|
|
||||||
if (raw->basic_cpuid[0][0] >= 1) {
|
|
||||||
logical_cpus = (raw->basic_cpuid[1][1] >> 16) & 0xff;
|
|
||||||
if (raw->ext_cpuid[0][0] >= 8) {
|
|
||||||
num_cores = 1 + (raw->ext_cpuid[8][2] & 0xff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (data->flags[CPU_FEATURE_HT]) {
|
|
||||||
if (num_cores > 1) {
|
|
||||||
data->num_cores = num_cores;
|
|
||||||
data->num_logical_cpus = logical_cpus;
|
|
||||||
} else {
|
|
||||||
data->num_cores = 1;
|
|
||||||
data->num_logical_cpus = (logical_cpus >= 2 ? logical_cpus : 2);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
data->num_cores = data->num_logical_cpus = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int amd_has_turion_modelname(const char *bs)
|
|
||||||
{
|
|
||||||
/* We search for something like TL-60. Ahh, I miss regexes...*/
|
|
||||||
int i, l, k;
|
|
||||||
char code[3] = {0};
|
|
||||||
const char* codes[] = { "ML", "MT", "MK", "TK", "TL", "RM", "ZM", "" };
|
|
||||||
l = (int) strlen(bs);
|
|
||||||
for (i = 3; i < l - 2; i++) {
|
|
||||||
if (bs[i] == '-' &&
|
|
||||||
isupper(bs[i-1]) && isupper(bs[i-2]) && !isupper(bs[i-3]) &&
|
|
||||||
isdigit(bs[i+1]) && isdigit(bs[i+2]) && !isdigit(bs[i+3]))
|
|
||||||
{
|
|
||||||
code[0] = bs[i-2];
|
|
||||||
code[1] = bs[i-1];
|
|
||||||
for (k = 0; codes[k][0]; k++)
|
|
||||||
if (!strcmp(codes[k], code)) return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static amd_code_t decode_amd_codename_part1(const char *bs)
|
|
||||||
{
|
|
||||||
int is_dual = 0, is_quad = 0, is_tri = 0;
|
|
||||||
if (strstr(bs, "Dual Core") ||
|
|
||||||
strstr(bs, "Dual-Core") ||
|
|
||||||
strstr(bs, " X2 "))
|
|
||||||
is_dual = 1;
|
|
||||||
if (strstr(bs, " X4 ")) is_quad = 1;
|
|
||||||
if (strstr(bs, " X3 ")) is_tri = 1;
|
|
||||||
if (strstr(bs, "Opteron")) {
|
|
||||||
return is_dual ? OPTERON_DUALCORE : OPTERON_SINGLE;
|
|
||||||
}
|
|
||||||
if (strstr(bs, "Phenom")) {
|
|
||||||
if (strstr(bs, "II")) return PHENOM2;
|
|
||||||
else return PHENOM;
|
|
||||||
}
|
|
||||||
if (amd_has_turion_modelname(bs)) {
|
|
||||||
return is_dual ? TURION_X2 : TURION_64;
|
|
||||||
}
|
|
||||||
if (strstr(bs, "Athlon(tm) 64 FX")) return ATHLON_64_FX;
|
|
||||||
if (strstr(bs, "Athlon(tm) FX")) return ATHLON_FX;
|
|
||||||
if (strstr(bs, "Athlon(tm) 64") || strstr(bs, "Athlon(tm) II X") || match_pattern(bs, "Athlon(tm) X#")) {
|
|
||||||
if (is_quad) return ATHLON_64_X4;
|
|
||||||
if (is_dual) return ATHLON_64_X2;
|
|
||||||
if (is_tri) return ATHLON_64_X3;
|
|
||||||
return ATHLON_64;
|
|
||||||
}
|
|
||||||
if (strstr(bs, "Turion")) {
|
|
||||||
return is_dual ? TURION_X2 : TURION_64;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strstr(bs, "mobile") || strstr(bs, "Mobile")) {
|
|
||||||
if (strstr(bs, "Athlon(tm) XP-M (LV)")) return ATHLON_XP_M_LV;
|
|
||||||
if (strstr(bs, "Athlon(tm) XP")) return ATHLON_XP_M;
|
|
||||||
if (strstr(bs, "Sempron(tm)")) return M_SEMPRON;
|
|
||||||
if (strstr(bs, "Athlon")) return MOBILE_ATHLON64;
|
|
||||||
if (strstr(bs, "Duron")) return MOBILE_DURON;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (strstr(bs, "Athlon(tm) XP")) return ATHLON_XP;
|
|
||||||
if (strstr(bs, "Athlon(tm) MP")) return ATHLON_MP;
|
|
||||||
if (strstr(bs, "Sempron(tm)")) return SEMPRON;
|
|
||||||
if (strstr(bs, "Duron")) return DURON;
|
|
||||||
if (strstr(bs, "Athlon")) return ATHLON;
|
|
||||||
}
|
|
||||||
if (match_pattern(bs, "C-##")) return FUSION_C;
|
|
||||||
if (match_pattern(bs, "E-###")) return FUSION_E;
|
|
||||||
if (match_pattern(bs, "Z-##")) return FUSION_Z;
|
|
||||||
if (match_pattern(bs, "E#-####") || match_pattern(bs, "A#-####")) return FUSION_EA;
|
|
||||||
|
|
||||||
return (amd_code_t) NO_CODE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_amd_codename(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
|
|
||||||
{
|
|
||||||
amd_code_t code = decode_amd_codename_part1(data->brand_str);
|
|
||||||
int i = 0;
|
|
||||||
char* code_str = NULL;
|
|
||||||
for (i = 0; i < COUNT_OF(amd_code_str); i++) {
|
|
||||||
if (code == amd_code_str[i].code) {
|
|
||||||
code_str = amd_code_str[i].str;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (code == ATHLON_64_X2 && data->l2_cache < 512)
|
|
||||||
code = SEMPRON_DUALCORE;
|
|
||||||
if (code_str)
|
|
||||||
debugf(2, "Detected AMD brand code: %d (%s)\n", code, code_str);
|
|
||||||
else
|
|
||||||
debugf(2, "Detected AMD brand code: %d\n", code);
|
|
||||||
internal->code.amd = code;
|
|
||||||
internal->score = match_cpu_codename(cpudb_amd, COUNT_OF(cpudb_amd), data, code, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpuid_identify_amd(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
|
|
||||||
{
|
|
||||||
load_amd_features(raw, data);
|
|
||||||
decode_amd_cache_info(raw, data);
|
|
||||||
decode_amd_number_of_cores(raw, data);
|
|
||||||
decode_amd_codename(raw, data, internal);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpuid_get_list_amd(struct cpu_list_t* list)
|
|
||||||
{
|
|
||||||
generic_get_cpu_list(cpudb_amd, COUNT_OF(cpudb_amd), list);
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __RECOG_AMD_H__
|
|
||||||
#define __RECOG_AMD_H__
|
|
||||||
|
|
||||||
int cpuid_identify_amd(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal);
|
|
||||||
void cpuid_get_list_amd(struct cpu_list_t* list);
|
|
||||||
|
|
||||||
#endif /* __RECOG_AMD_H__ */
|
|
@ -1,897 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "libcpuid.h"
|
|
||||||
#include "libcpuid_util.h"
|
|
||||||
#include "libcpuid_internal.h"
|
|
||||||
#include "recog_intel.h"
|
|
||||||
|
|
||||||
const struct intel_bcode_str { intel_code_t code; char *str; } intel_bcode_str[] = {
|
|
||||||
#define CODE(x) { x, #x }
|
|
||||||
#define CODE2(x, y) CODE(x)
|
|
||||||
#include "intel_code_t.h"
|
|
||||||
#undef CODE
|
|
||||||
};
|
|
||||||
|
|
||||||
enum _intel_model_t {
|
|
||||||
UNKNOWN = -1,
|
|
||||||
_3000 = 100,
|
|
||||||
_3100,
|
|
||||||
_3200,
|
|
||||||
X3200,
|
|
||||||
_3300,
|
|
||||||
X3300,
|
|
||||||
_5100,
|
|
||||||
_5200,
|
|
||||||
_5300,
|
|
||||||
_5400,
|
|
||||||
_2xxx, /* Core i[357] 2xxx */
|
|
||||||
_3xxx, /* Core i[357] 3xxx */
|
|
||||||
};
|
|
||||||
typedef enum _intel_model_t intel_model_t;
|
|
||||||
|
|
||||||
const struct match_entry_t cpudb_intel[] = {
|
|
||||||
{ -1, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Intel CPU" },
|
|
||||||
|
|
||||||
/* i486 */
|
|
||||||
{ 4, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown i486" },
|
|
||||||
{ 4, 0, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 DX-25/33" },
|
|
||||||
{ 4, 1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 DX-50" },
|
|
||||||
{ 4, 2, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 SX" },
|
|
||||||
{ 4, 3, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 DX2" },
|
|
||||||
{ 4, 4, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 SL" },
|
|
||||||
{ 4, 5, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 SX2" },
|
|
||||||
{ 4, 7, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 DX2 WriteBack" },
|
|
||||||
{ 4, 8, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 DX4" },
|
|
||||||
{ 4, 9, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "i486 DX4 WriteBack" },
|
|
||||||
|
|
||||||
/* All Pentia:
|
|
||||||
Pentium 1 */
|
|
||||||
{ 5, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Pentium" },
|
|
||||||
{ 5, 0, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium A-Step" },
|
|
||||||
{ 5, 1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium 1 (0.8u)" },
|
|
||||||
{ 5, 2, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium 1 (0.35u)" },
|
|
||||||
{ 5, 3, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium OverDrive" },
|
|
||||||
{ 5, 4, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium 1 (0.35u)" },
|
|
||||||
{ 5, 7, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium 1 (0.35u)" },
|
|
||||||
{ 5, 8, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium MMX (0.25u)" },
|
|
||||||
|
|
||||||
/* Pentium 2 / 3 / M / Conroe / whatsnext - all P6 based. */
|
|
||||||
{ 6, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown P6" },
|
|
||||||
{ 6, 0, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium Pro" },
|
|
||||||
{ 6, 1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium Pro" },
|
|
||||||
{ 6, 3, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium II (Klamath)" },
|
|
||||||
{ 6, 5, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium II (Deschutes)" },
|
|
||||||
{ 6, 5, -1, -1, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile Pentium II (Tonga)"},
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium II (Dixon)" },
|
|
||||||
|
|
||||||
{ 6, 3, -1, -1, -1, 1, -1, -1, XEON , 0, "P-II Xeon (Klamath)" },
|
|
||||||
{ 6, 5, -1, -1, -1, 1, -1, -1, XEON , 0, "P-II Xeon (Drake)" },
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, XEON , 0, "P-II Xeon (Dixon)" },
|
|
||||||
|
|
||||||
{ 6, 5, -1, -1, -1, 1, -1, -1, CELERON , 0, "P-II Celeron (Covingtons" },
|
|
||||||
{ 6, 6, -1, -1, -1, 1, -1, -1, CELERON , 0, "P-II Celeron (Mendocino)" },
|
|
||||||
|
|
||||||
/* -------------------------------------------------- */
|
|
||||||
|
|
||||||
{ 6, 7, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium III (Katmai)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium III (Coppermine)"},
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium III (Coppermine)"},
|
|
||||||
{ 6, 11, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Pentium III (Tualatin)" },
|
|
||||||
|
|
||||||
{ 6, 7, -1, -1, -1, 1, -1, -1, XEON , 0, "P-III Xeon (Tanner)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, XEON , 0, "P-III Xeon (Cascades)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, XEON , 0, "P-III Xeon (Cascades)" },
|
|
||||||
{ 6, 11, -1, -1, -1, 1, -1, -1, XEON , 0, "P-III Xeon (Tualatin)" },
|
|
||||||
|
|
||||||
{ 6, 7, -1, -1, -1, 1, -1, -1, CELERON , 0, "P-III Celeron (Katmai)" },
|
|
||||||
{ 6, 8, -1, -1, -1, 1, -1, -1, CELERON , 0, "P-III Celeron (Coppermine)" },
|
|
||||||
{ 6, 10, -1, -1, -1, 1, -1, -1, CELERON , 0, "P-III Celeron (Coppermine)" },
|
|
||||||
{ 6, 11, -1, -1, -1, 1, -1, -1, CELERON , 0, "P-III Celeron (Tualatin)" },
|
|
||||||
|
|
||||||
/* Netburst based (Pentium 4 and later)
|
|
||||||
classic P4s */
|
|
||||||
{ 15, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Pentium 4" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, CELERON , 0, "Unknown P-4 Celeron" },
|
|
||||||
{ 15, -1, -1, 15, -1, 1, -1, -1, XEON , 0, "Unknown Xeon" },
|
|
||||||
|
|
||||||
{ 15, 0, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium 4 (Willamette)" },
|
|
||||||
{ 15, 1, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium 4 (Willamette)" },
|
|
||||||
{ 15, 2, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium 4 (Northwood)" },
|
|
||||||
{ 15, 3, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium 4 (Prescott)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium 4 (Prescott)" },
|
|
||||||
{ 15, 6, -1, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium 4 (Cedar Mill)" },
|
|
||||||
{ 15, 0, -1, 15, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile P-4 (Willamette)" },
|
|
||||||
{ 15, 1, -1, 15, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile P-4 (Willamette)" },
|
|
||||||
{ 15, 2, -1, 15, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile P-4 (Northwood)" },
|
|
||||||
{ 15, 3, -1, 15, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile P-4 (Prescott)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile P-4 (Prescott)" },
|
|
||||||
{ 15, 6, -1, 15, -1, 1, -1, -1, MOBILE_PENTIUM , 0, "Mobile P-4 (Cedar Mill)" },
|
|
||||||
|
|
||||||
/* server CPUs */
|
|
||||||
{ 15, 0, -1, 15, -1, 1, -1, -1, XEON , 0, "Xeon (Foster)" },
|
|
||||||
{ 15, 1, -1, 15, -1, 1, -1, -1, XEON , 0, "Xeon (Foster)" },
|
|
||||||
{ 15, 2, -1, 15, -1, 1, -1, -1, XEON , 0, "Xeon (Prestonia)" },
|
|
||||||
{ 15, 2, -1, 15, -1, 1, -1, -1, XEONMP , 0, "Xeon (Gallatin)" },
|
|
||||||
{ 15, 3, -1, 15, -1, 1, -1, -1, XEON , 0, "Xeon (Nocona)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, XEON , 0, "Xeon (Nocona)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, XEON_IRWIN , 0, "Xeon (Irwindale)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, XEONMP , 0, "Xeon (Cranford)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, XEON_POTOMAC , 0, "Xeon (Potomac)" },
|
|
||||||
{ 15, 6, -1, 15, -1, 1, -1, -1, XEON , 0, "Xeon (Dempsey)" },
|
|
||||||
|
|
||||||
/* Pentium Ds */
|
|
||||||
{ 15, 4, 4, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium D (SmithField)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, PENTIUM_D , 0, "Pentium D (SmithField)" },
|
|
||||||
{ 15, 4, 7, 15, -1, 1, -1, -1, NO_CODE , 0, "Pentium D (SmithField)" },
|
|
||||||
{ 15, 6, -1, 15, -1, 1, -1, -1, PENTIUM_D , 0, "Pentium D (Presler)" },
|
|
||||||
|
|
||||||
/* Celeron and Celeron Ds */
|
|
||||||
{ 15, 1, -1, 15, -1, 1, -1, -1, CELERON , 0, "P-4 Celeron (Willamette)" },
|
|
||||||
{ 15, 2, -1, 15, -1, 1, -1, -1, CELERON , 0, "P-4 Celeron (Northwood)" },
|
|
||||||
{ 15, 3, -1, 15, -1, 1, -1, -1, CELERON , 0, "P-4 Celeron D (Prescott)" },
|
|
||||||
{ 15, 4, -1, 15, -1, 1, -1, -1, CELERON , 0, "P-4 Celeron D (Prescott)" },
|
|
||||||
{ 15, 6, -1, 15, -1, 1, -1, -1, CELERON , 0, "P-4 Celeron D (Cedar Mill)" },
|
|
||||||
|
|
||||||
/* -------------------------------------------------- */
|
|
||||||
/* Intel Core microarchitecture - P6-based */
|
|
||||||
|
|
||||||
{ 6, 9, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Pentium M" },
|
|
||||||
{ 6, 9, -1, -1, -1, 1, -1, -1, MOBILE_PENTIUM_M , 0, "Unknown Pentium M" },
|
|
||||||
{ 6, 9, -1, -1, -1, 1, -1, -1, PENTIUM , 0, "Pentium M (Banias)" },
|
|
||||||
{ 6, 9, -1, -1, -1, 1, -1, -1, MOBILE_PENTIUM_M , 0, "Pentium M (Banias)" },
|
|
||||||
{ 6, 9, -1, -1, -1, 1, -1, -1, CELERON , 0, "Celeron M" },
|
|
||||||
{ 6, 13, -1, -1, -1, 1, -1, -1, PENTIUM , 0, "Pentium M (Dothan)" },
|
|
||||||
{ 6, 13, -1, -1, -1, 1, -1, -1, MOBILE_PENTIUM_M , 0, "Pentium M (Dothan)" },
|
|
||||||
{ 6, 13, -1, -1, -1, 1, -1, -1, CELERON , 0, "Celeron M" },
|
|
||||||
|
|
||||||
{ 6, 12, -1, -1, -1, -1, -1, -1, ATOM_UNKNOWN , 0, "Unknown Atom" },
|
|
||||||
{ 6, 12, -1, -1, -1, -1, -1, -1, ATOM_DIAMONDVILLE , 0, "Atom (Diamondville)" },
|
|
||||||
{ 6, 12, -1, -1, -1, -1, -1, -1, ATOM_SILVERTHORNE , 0, "Atom (Silverthorne)" },
|
|
||||||
{ 6, 12, -1, -1, -1, -1, -1, -1, ATOM_CEDARVIEW , 0, "Atom (Cedarview)" },
|
|
||||||
{ 6, 6, -1, -1, -1, -1, -1, -1, ATOM_CEDARVIEW , 0, "Atom (Cedarview)" },
|
|
||||||
{ 6, 12, -1, -1, -1, -1, -1, -1, ATOM_PINEVIEW , 0, "Atom (Pineview)" },
|
|
||||||
|
|
||||||
/* -------------------------------------------------- */
|
|
||||||
|
|
||||||
{ 6, 14, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Yonah" },
|
|
||||||
{ 6, 14, -1, -1, -1, 1, -1, -1, CORE_SOLO , 0, "Yonah (Core Solo)" },
|
|
||||||
{ 6, 14, -1, -1, -1, 2, -1, -1, CORE_DUO , 0, "Yonah (Core Duo)" },
|
|
||||||
{ 6, 14, -1, -1, -1, 1, -1, -1, MOBILE_CORE_SOLO , 0, "Yonah (Core Solo)" },
|
|
||||||
{ 6, 14, -1, -1, -1, 2, -1, -1, MOBILE_CORE_DUO , 0, "Yonah (Core Duo)" },
|
|
||||||
{ 6, 14, -1, -1, -1, 1, -1, -1, CORE_SOLO , 0, "Yonah (Core Solo)" },
|
|
||||||
|
|
||||||
{ 6, 15, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Unknown Core 2" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, 4096, -1, CORE_DUO , 0, "Conroe (Core 2 Duo)" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, 1024, -1, CORE_DUO , 0, "Conroe (Core 2 Duo) 1024K" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, 512, -1, CORE_DUO , 0, "Conroe (Core 2 Duo) 512K" },
|
|
||||||
{ 6, 15, -1, -1, -1, 4, -1, -1, QUAD_CORE , 0, "Kentsfield (Core 2 Quad)" },
|
|
||||||
{ 6, 15, -1, -1, -1, 4, 4096, -1, QUAD_CORE , 0, "Kentsfield (Core 2 Quad)" },
|
|
||||||
{ 6, 15, -1, -1, -1, 400, -1, -1, MORE_THAN_QUADCORE, 0, "More than quad-core" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, 2048, -1, CORE_DUO , 0, "Allendale (Core 2 Duo)" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, -1, -1, MOBILE_CORE_DUO , 0, "Merom (Core 2 Duo)" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, 2048, -1, MEROM , 0, "Merom (Core 2 Duo) 2048K" },
|
|
||||||
{ 6, 15, -1, -1, -1, 2, 4096, -1, MEROM , 0, "Merom (Core 2 Duo) 4096K" },
|
|
||||||
|
|
||||||
{ 6, 15, -1, -1, 15, 1, -1, -1, CELERON , 0, "Conroe-L (Celeron)" },
|
|
||||||
{ 6, 6, -1, -1, 22, 1, -1, -1, CELERON , 0, "Conroe-L (Celeron)" },
|
|
||||||
{ 6, 15, -1, -1, 15, 2, -1, -1, CELERON , 0, "Conroe-L (Allendale)" },
|
|
||||||
{ 6, 6, -1, -1, 22, 2, -1, -1, CELERON , 0, "Conroe-L (Allendale)" },
|
|
||||||
|
|
||||||
|
|
||||||
{ 6, 6, -1, -1, 22, 1, -1, -1, NO_CODE , 0, "Unknown Core ?" },
|
|
||||||
{ 6, 7, -1, -1, 23, 1, -1, -1, NO_CODE , 0, "Unknown Core ?" },
|
|
||||||
{ 6, 6, -1, -1, 22, 400, -1, -1, MORE_THAN_QUADCORE, 0, "More than quad-core" },
|
|
||||||
{ 6, 7, -1, -1, 23, 400, -1, -1, MORE_THAN_QUADCORE, 0, "More than quad-core" },
|
|
||||||
|
|
||||||
{ 6, 7, -1, -1, 23, 1, -1, -1, CORE_SOLO , 0, "Unknown Core 45nm" },
|
|
||||||
{ 6, 7, -1, -1, 23, 1, -1, -1, CORE_DUO , 0, "Unknown Core 45nm" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 1024, -1, WOLFDALE , 0, "Celeron Wolfdale 1M" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 2048, -1, WOLFDALE , 0, "Wolfdale (Core 2 Duo) 2M" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 3072, -1, WOLFDALE , 0, "Wolfdale (Core 2 Duo) 3M" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 6144, -1, WOLFDALE , 0, "Wolfdale (Core 2 Duo) 6M" },
|
|
||||||
{ 6, 7, -1, -1, 23, 1, -1, -1, MOBILE_CORE_DUO , 0, "Penryn (Core 2 Duo)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 1024, -1, PENRYN , 0, "Penryn (Core 2 Duo)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 3072, -1, PENRYN , 0, "Penryn (Core 2 Duo) 3M" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 6144, -1, PENRYN , 0, "Penryn (Core 2 Duo) 6M" },
|
|
||||||
{ 6, 7, -1, -1, 23, 4, 2048, -1, QUAD_CORE , 0, "Yorkfield (Core 2 Quad) 2M"},
|
|
||||||
{ 6, 7, -1, -1, 23, 4, 3072, -1, QUAD_CORE , 0, "Yorkfield (Core 2 Quad) 3M"},
|
|
||||||
{ 6, 7, -1, -1, 23, 4, 6144, -1, QUAD_CORE , 0, "Yorkfield (Core 2 Quad) 6M"},
|
|
||||||
|
|
||||||
/* Core microarchitecture-based Xeons: */
|
|
||||||
{ 6, 14, -1, -1, 14, 1, -1, -1, XEON , 0, "Xeon LV" },
|
|
||||||
{ 6, 15, -1, -1, 15, 2, 4096, -1, XEON , _5100, "Xeon (Woodcrest)" },
|
|
||||||
{ 6, 15, -1, -1, 15, 2, 2048, -1, XEON , _3000, "Xeon (Conroe/2M)" },
|
|
||||||
{ 6, 15, -1, -1, 15, 2, 4096, -1, XEON , _3000, "Xeon (Conroe/4M)" },
|
|
||||||
{ 6, 15, -1, -1, 15, 4, 4096, -1, XEON , X3200, "Xeon (Kentsfield)" },
|
|
||||||
{ 6, 15, -1, -1, 15, 4, 4096, -1, XEON , _5300, "Xeon (Clovertown)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 6144, -1, XEON , _3100, "Xeon (Wolfdale)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 2, 6144, -1, XEON , _5200, "Xeon (Wolfdale DP)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 4, 6144, -1, XEON , _5400, "Xeon (Harpertown)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 4, 3072, -1, XEON , X3300, "Xeon (Yorkfield/3M)" },
|
|
||||||
{ 6, 7, -1, -1, 23, 4, 6144, -1, XEON , X3300, "Xeon (Yorkfield/6M)" },
|
|
||||||
|
|
||||||
/* Nehalem CPUs (45nm): */
|
|
||||||
{ 6, 10, -1, -1, 26, 4, -1, -1, XEON_GAINESTOWN , 0, "Gainestown (Xeon)" },
|
|
||||||
{ 6, 10, -1, -1, 26, 4, -1, 4096, XEON_GAINESTOWN , 0, "Gainestown 4M (Xeon)" },
|
|
||||||
{ 6, 10, -1, -1, 26, 4, -1, 8192, XEON_GAINESTOWN , 0, "Gainestown 8M (Xeon)" },
|
|
||||||
{ 6, 10, -1, -1, 26, 4, -1, -1, XEON_I7 , 0, "Bloomfield (Xeon)" },
|
|
||||||
{ 6, 10, -1, -1, 26, 4, -1, -1, CORE_I7 , 0, "Bloomfield (Core i7)" },
|
|
||||||
{ 6, 10, -1, -1, 30, 4, -1, -1, CORE_I7 , 0, "Lynnfield (Core i7)" },
|
|
||||||
{ 6, 5, -1, -1, 37, 4, -1, 8192, CORE_I5 , 0, "Lynnfield (Core i5)" },
|
|
||||||
|
|
||||||
/* Westmere CPUs (32nm): */
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, -1, NO_CODE , 0, "Unknown Core i3/i5" },
|
|
||||||
{ 6, 12, -1, -1, 44, -1, -1, -1, XEON_WESTMERE , 0, "Westmere (Xeon)" },
|
|
||||||
{ 6, 12, -1, -1, 44, -1, -1, 12288, XEON_WESTMERE , 0, "Gulftown (Xeon)" },
|
|
||||||
{ 6, 12, -1, -1, 44, 4, -1, 12288, CORE_I7 , 0, "Gulftown (Core i7)" },
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, 4096, CORE_I5 , 0, "Clarkdale (Core i5)" },
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, 4096, CORE_I3 , 0, "Clarkdale (Core i3)" },
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, -1, PENTIUM , 0, "Arrandale" },
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, 4096, CORE_I7 , 0, "Arrandale (Core i7)" },
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, 3072, CORE_I5 , 0, "Arrandale (Core i5)" },
|
|
||||||
{ 6, 5, -1, -1, 37, 2, -1, 3072, CORE_I3 , 0, "Arrandale (Core i3)" },
|
|
||||||
|
|
||||||
/* Sandy Bridge CPUs (32nm): */
|
|
||||||
{ 6, 10, -1, -1, 42, -1, -1, -1, NO_CODE , 0, "Unknown Sandy Bridge" },
|
|
||||||
{ 6, 10, -1, -1, 42, -1, -1, -1, XEON , 0, "Sandy Bridge (Xeon)" },
|
|
||||||
{ 6, 10, -1, -1, 42, -1, -1, -1, CORE_I7 , 0, "Sandy Bridge (Core i7)" },
|
|
||||||
{ 6, 10, -1, -1, 42, 4, -1, -1, CORE_I7 , 0, "Sandy Bridge (Core i7)" },
|
|
||||||
{ 6, 10, -1, -1, 42, 4, -1, -1, CORE_I5 , 0, "Sandy Bridge (Core i5)" },
|
|
||||||
{ 6, 10, -1, -1, 42, 2, -1, -1, CORE_I3 , 0, "Sandy Bridge (Core i3)" },
|
|
||||||
{ 6, 10, -1, -1, 42, 2, -1, -1, PENTIUM , 0, "Sandy Bridge (Pentium)" },
|
|
||||||
{ 6, 10, -1, -1, 42, 1, -1, -1, CELERON , 0, "Sandy Bridge (Celeron)" },
|
|
||||||
{ 6, 10, -1, -1, 42, 2, -1, -1, CELERON , 0, "Sandy Bridge (Celeron)" },
|
|
||||||
{ 6, 13, -1, -1, 45, -1, -1, -1, NO_CODE , 0, "Sandy Bridge-E" },
|
|
||||||
{ 6, 13, -1, -1, 45, -1, -1, -1, XEON , 0, "Sandy Bridge-E (Xeon)" },
|
|
||||||
|
|
||||||
/* Ivy Bridge CPUs (22nm): */
|
|
||||||
{ 6, 10, -1, -1, 58, -1, -1, -1, XEON , 0, "Ivy Bridge (Xeon)" },
|
|
||||||
{ 6, 10, -1, -1, 58, 4, -1, -1, CORE_IVY7 , 0, "Ivy Bridge (Core i7)" },
|
|
||||||
{ 6, 10, -1, -1, 58, 4, -1, -1, CORE_IVY5 , 0, "Ivy Bridge (Core i5)" },
|
|
||||||
{ 6, 10, -1, -1, 58, 2, -1, -1, CORE_IVY3 , 0, "Ivy Bridge (Core i3)" },
|
|
||||||
{ 6, 10, -1, -1, 58, 2, -1, -1, PENTIUM , 0, "Ivy Bridge (Pentium)" },
|
|
||||||
{ 6, 10, -1, -1, 58, 1, -1, -1, CELERON , 0, "Ivy Bridge (Celeron)" },
|
|
||||||
{ 6, 10, -1, -1, 58, 2, -1, -1, CELERON , 0, "Ivy Bridge (Celeron)" },
|
|
||||||
{ 6, 14, -1, -1, 62, -1, -1, -1, NO_CODE , 0, "Ivy Bridge-E" },
|
|
||||||
|
|
||||||
/* Haswell CPUs (22nm): */
|
|
||||||
{ 6, 12, -1, -1, 60, -1, -1, -1, XEON , 0, "Haswell (Xeon)" },
|
|
||||||
{ 6, 12, -1, -1, 60, 4, -1, -1, CORE_HASWELL7 , 0, "Haswell (Core i7)" },
|
|
||||||
{ 6, 5, -1, -1, 69, 4, -1, -1, CORE_HASWELL7 , 0, "Haswell (Core i7)" },
|
|
||||||
{ 6, 12, -1, -1, 60, 4, -1, -1, CORE_HASWELL5 , 0, "Haswell (Core i5)" },
|
|
||||||
{ 6, 5, -1, -1, 69, 4, -1, -1, CORE_HASWELL5 , 0, "Haswell (Core i5)" },
|
|
||||||
{ 6, 12, -1, -1, 60, 2, -1, -1, CORE_HASWELL3 , 0, "Haswell (Core i3)" },
|
|
||||||
{ 6, 5, -1, -1, 69, 2, -1, -1, CORE_HASWELL3 , 0, "Haswell (Core i3)" },
|
|
||||||
{ 6, 12, -1, -1, 60, 2, -1, -1, PENTIUM , 0, "Haswell (Pentium)" },
|
|
||||||
{ 6, 12, -1, -1, 60, 2, -1, -1, CELERON , 0, "Haswell (Celeron)" },
|
|
||||||
{ 6, 12, -1, -1, 60, 1, -1, -1, CELERON , 0, "Haswell (Celeron)" },
|
|
||||||
{ 6, 15, -1, -1, 63, -1, -1, -1, NO_CODE , 0, "Haswell-E" },
|
|
||||||
|
|
||||||
/* Broadwell CPUs (14nm): */
|
|
||||||
{ 6, 7, -1, -1, 71, 4, -1, -1, CORE_BROADWELL7 , 0, "Broadwell (Core i7)" },
|
|
||||||
{ 6, 7, -1, -1, 71, 4, -1, -1, CORE_BROADWELL5 , 0, "Broadwell (Core i5)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 4, -1, -1, CORE_BROADWELL7 , 0, "Broadwell-U (Core i7)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 2, -1, -1, CORE_BROADWELL7 , 0, "Broadwell-U (Core i7)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 2, -1, -1, CORE_BROADWELL5 , 0, "Broadwell-U (Core i5)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 2, -1, -1, CORE_BROADWELL3 , 0, "Broadwell-U (Core i3)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 2, -1, -1, PENTIUM , 0, "Broadwell-U (Pentium)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 2, -1, -1, CELERON , 0, "Broadwell-U (Celeron)" },
|
|
||||||
{ 6, 13, -1, -1, 61, 2, -1, -1, NA , 0, "Broadwell-U (Core M)" },
|
|
||||||
{ 6, 15, -1, -1, 79, 2, -1, -1, CORE_BROADWELL3 , 0, "Broadwell-E (Core i3)" },
|
|
||||||
{ 6, 15, -1, -1, 79, 2, -1, -1, CORE_BROADWELL5 , 0, "Broadwell-E (Core i5)" },
|
|
||||||
{ 6, 15, -1, -1, 79, 4, -1, -1, CORE_BROADWELL5 , 0, "Broadwell-E (Core i5)" },
|
|
||||||
{ 6, 15, -1, -1, 79, 2, -1, -1, CORE_BROADWELL7 , 0, "Broadwell-E (Core i7)" },
|
|
||||||
{ 6, 15, -1, -1, 79, 4, -1, -1, CORE_BROADWELL7 , 0, "Broadwell-E (Core i7)" },
|
|
||||||
|
|
||||||
/* Skylake CPUs (14nm): */
|
|
||||||
{ 6, 14, -1, -1, 94, 4, -1, -1, CORE_BROADWELL7 , 0, "Skylake (Core i7)" },
|
|
||||||
{ 6, 14, -1, -1, 94, 4, -1, -1, CORE_BROADWELL5 , 0, "Skylake (Core i5)" },
|
|
||||||
{ 6, 14, -1, -1, 94, 4, -1, -1, CORE_BROADWELL3 , 0, "Skylake (Core i3)" },
|
|
||||||
{ 6, 14, -1, -1, 94, 4, -1, -1, PENTIUM , 0, "Skylake (Pentium)" },
|
|
||||||
|
|
||||||
/* Itaniums */
|
|
||||||
{ 7, -1, -1, -1, -1, 1, -1, -1, NO_CODE , 0, "Itanium" },
|
|
||||||
{ 15, -1, -1, 16, -1, 1, -1, -1, NO_CODE , 0, "Itanium 2" },
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void load_intel_features(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
const struct feature_map_t matchtable_edx1[] = {
|
|
||||||
{ 18, CPU_FEATURE_PN },
|
|
||||||
{ 21, CPU_FEATURE_DTS },
|
|
||||||
{ 22, CPU_FEATURE_ACPI },
|
|
||||||
{ 27, CPU_FEATURE_SS },
|
|
||||||
{ 29, CPU_FEATURE_TM },
|
|
||||||
{ 30, CPU_FEATURE_IA64 },
|
|
||||||
{ 31, CPU_FEATURE_PBE },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_ecx1[] = {
|
|
||||||
{ 2, CPU_FEATURE_DTS64 },
|
|
||||||
{ 4, CPU_FEATURE_DS_CPL },
|
|
||||||
{ 5, CPU_FEATURE_VMX },
|
|
||||||
{ 6, CPU_FEATURE_SMX },
|
|
||||||
{ 7, CPU_FEATURE_EST },
|
|
||||||
{ 8, CPU_FEATURE_TM2 },
|
|
||||||
{ 10, CPU_FEATURE_CID },
|
|
||||||
{ 14, CPU_FEATURE_XTPR },
|
|
||||||
{ 15, CPU_FEATURE_PDCM },
|
|
||||||
{ 18, CPU_FEATURE_DCA },
|
|
||||||
{ 21, CPU_FEATURE_X2APIC },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_edx81[] = {
|
|
||||||
{ 20, CPU_FEATURE_XD },
|
|
||||||
};
|
|
||||||
const struct feature_map_t matchtable_ebx7[] = {
|
|
||||||
{ 2, CPU_FEATURE_SGX },
|
|
||||||
{ 4, CPU_FEATURE_HLE },
|
|
||||||
{ 11, CPU_FEATURE_RTM },
|
|
||||||
{ 16, CPU_FEATURE_AVX512F },
|
|
||||||
{ 17, CPU_FEATURE_AVX512DQ },
|
|
||||||
{ 18, CPU_FEATURE_RDSEED },
|
|
||||||
{ 19, CPU_FEATURE_ADX },
|
|
||||||
{ 26, CPU_FEATURE_AVX512PF },
|
|
||||||
{ 27, CPU_FEATURE_AVX512ER },
|
|
||||||
{ 28, CPU_FEATURE_AVX512CD },
|
|
||||||
{ 29, CPU_FEATURE_SHA_NI },
|
|
||||||
{ 30, CPU_FEATURE_AVX512BW },
|
|
||||||
{ 31, CPU_FEATURE_AVX512VL },
|
|
||||||
};
|
|
||||||
if (raw->basic_cpuid[0][0] >= 1) {
|
|
||||||
match_features(matchtable_edx1, COUNT_OF(matchtable_edx1), raw->basic_cpuid[1][3], data);
|
|
||||||
match_features(matchtable_ecx1, COUNT_OF(matchtable_ecx1), raw->basic_cpuid[1][2], data);
|
|
||||||
}
|
|
||||||
if (raw->ext_cpuid[0][0] >= 1) {
|
|
||||||
match_features(matchtable_edx81, COUNT_OF(matchtable_edx81), raw->ext_cpuid[1][3], data);
|
|
||||||
}
|
|
||||||
// detect TSX/AVX512:
|
|
||||||
if (raw->basic_cpuid[0][0] >= 7) {
|
|
||||||
match_features(matchtable_ebx7, COUNT_OF(matchtable_ebx7), raw->basic_cpuid[7][1], data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum _cache_type_t {
|
|
||||||
L1I,
|
|
||||||
L1D,
|
|
||||||
L2,
|
|
||||||
L3,
|
|
||||||
L4
|
|
||||||
};
|
|
||||||
typedef enum _cache_type_t cache_type_t;
|
|
||||||
|
|
||||||
static void check_case(uint8_t on, cache_type_t cache, int size, int assoc, int linesize, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
if (!on) return;
|
|
||||||
switch (cache) {
|
|
||||||
case L1I:
|
|
||||||
data->l1_instruction_cache = size;
|
|
||||||
break;
|
|
||||||
case L1D:
|
|
||||||
data->l1_data_cache = size;
|
|
||||||
data->l1_assoc = assoc;
|
|
||||||
data->l1_cacheline = linesize;
|
|
||||||
break;
|
|
||||||
case L2:
|
|
||||||
data->l2_cache = size;
|
|
||||||
data->l2_assoc = assoc;
|
|
||||||
data->l2_cacheline = linesize;
|
|
||||||
break;
|
|
||||||
case L3:
|
|
||||||
data->l3_cache = size;
|
|
||||||
data->l3_assoc = assoc;
|
|
||||||
data->l3_cacheline = linesize;
|
|
||||||
break;
|
|
||||||
case L4:
|
|
||||||
data->l4_cache = size;
|
|
||||||
data->l4_assoc = assoc;
|
|
||||||
data->l4_cacheline = linesize;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_intel_oldstyle_cache_info(struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
uint8_t f[256] = {0};
|
|
||||||
int reg, off;
|
|
||||||
uint32_t x;
|
|
||||||
for (reg = 0; reg < 4; reg++) {
|
|
||||||
x = raw->basic_cpuid[2][reg];
|
|
||||||
if (x & 0x80000000) continue;
|
|
||||||
for (off = 0; off < 4; off++) {
|
|
||||||
f[x & 0xff] = 1;
|
|
||||||
x >>= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check_case(f[0x06], L1I, 8, 4, 32, data);
|
|
||||||
check_case(f[0x08], L1I, 16, 4, 32, data);
|
|
||||||
check_case(f[0x0A], L1D, 8, 2, 32, data);
|
|
||||||
check_case(f[0x0C], L1D, 16, 4, 32, data);
|
|
||||||
check_case(f[0x22], L3, 512, 4, 64, data);
|
|
||||||
check_case(f[0x23], L3, 1024, 8, 64, data);
|
|
||||||
check_case(f[0x25], L3, 2048, 8, 64, data);
|
|
||||||
check_case(f[0x29], L3, 4096, 8, 64, data);
|
|
||||||
check_case(f[0x2C], L1D, 32, 8, 64, data);
|
|
||||||
check_case(f[0x30], L1I, 32, 8, 64, data);
|
|
||||||
check_case(f[0x39], L2, 128, 4, 64, data);
|
|
||||||
check_case(f[0x3A], L2, 192, 6, 64, data);
|
|
||||||
check_case(f[0x3B], L2, 128, 2, 64, data);
|
|
||||||
check_case(f[0x3C], L2, 256, 4, 64, data);
|
|
||||||
check_case(f[0x3D], L2, 384, 6, 64, data);
|
|
||||||
check_case(f[0x3E], L2, 512, 4, 64, data);
|
|
||||||
check_case(f[0x41], L2, 128, 4, 32, data);
|
|
||||||
check_case(f[0x42], L2, 256, 4, 32, data);
|
|
||||||
check_case(f[0x43], L2, 512, 4, 32, data);
|
|
||||||
check_case(f[0x44], L2, 1024, 4, 32, data);
|
|
||||||
check_case(f[0x45], L2, 2048, 4, 32, data);
|
|
||||||
check_case(f[0x46], L3, 4096, 4, 64, data);
|
|
||||||
check_case(f[0x47], L3, 8192, 8, 64, data);
|
|
||||||
check_case(f[0x4A], L3, 6144, 12, 64, data);
|
|
||||||
check_case(f[0x4B], L3, 8192, 16, 64, data);
|
|
||||||
check_case(f[0x4C], L3, 12288, 12, 64, data);
|
|
||||||
check_case(f[0x4D], L3, 16384, 16, 64, data);
|
|
||||||
check_case(f[0x4E], L2, 6144, 24, 64, data);
|
|
||||||
check_case(f[0x60], L1D, 16, 8, 64, data);
|
|
||||||
check_case(f[0x66], L1D, 8, 4, 64, data);
|
|
||||||
check_case(f[0x67], L1D, 16, 4, 64, data);
|
|
||||||
check_case(f[0x68], L1D, 32, 4, 64, data);
|
|
||||||
/* The following four entries are trace cache. Intel does not
|
|
||||||
* specify a cache-line size, so we use -1 instead
|
|
||||||
*/
|
|
||||||
check_case(f[0x70], L1I, 12, 8, -1, data);
|
|
||||||
check_case(f[0x71], L1I, 16, 8, -1, data);
|
|
||||||
check_case(f[0x72], L1I, 32, 8, -1, data);
|
|
||||||
check_case(f[0x73], L1I, 64, 8, -1, data);
|
|
||||||
|
|
||||||
check_case(f[0x78], L2, 1024, 4, 64, data);
|
|
||||||
check_case(f[0x79], L2, 128, 8, 64, data);
|
|
||||||
check_case(f[0x7A], L2, 256, 8, 64, data);
|
|
||||||
check_case(f[0x7B], L2, 512, 8, 64, data);
|
|
||||||
check_case(f[0x7C], L2, 1024, 8, 64, data);
|
|
||||||
check_case(f[0x7D], L2, 2048, 8, 64, data);
|
|
||||||
check_case(f[0x7F], L2, 512, 2, 64, data);
|
|
||||||
check_case(f[0x82], L2, 256, 8, 32, data);
|
|
||||||
check_case(f[0x83], L2, 512, 8, 32, data);
|
|
||||||
check_case(f[0x84], L2, 1024, 8, 32, data);
|
|
||||||
check_case(f[0x85], L2, 2048, 8, 32, data);
|
|
||||||
check_case(f[0x86], L2, 512, 4, 64, data);
|
|
||||||
check_case(f[0x87], L2, 1024, 8, 64, data);
|
|
||||||
|
|
||||||
if (f[0x49]) {
|
|
||||||
/* This flag is overloaded with two meanings. On Xeon MP
|
|
||||||
* (family 0xf, model 0x6) this means L3 cache. On all other
|
|
||||||
* CPUs (notably Conroe et al), this is L2 cache. In both cases
|
|
||||||
* it means 4MB, 16-way associative, 64-byte line size.
|
|
||||||
*/
|
|
||||||
if (data->family == 0xf && data->model == 0x6) {
|
|
||||||
data->l3_cache = 4096;
|
|
||||||
data->l3_assoc = 16;
|
|
||||||
data->l3_cacheline = 64;
|
|
||||||
} else {
|
|
||||||
data->l2_cache = 4096;
|
|
||||||
data->l2_assoc = 16;
|
|
||||||
data->l2_cacheline = 64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (f[0x40]) {
|
|
||||||
/* Again, a special flag. It means:
|
|
||||||
* 1) If no L2 is specified, then CPU is w/o L2 (0 KB)
|
|
||||||
* 2) If L2 is specified by other flags, then, CPU is w/o L3.
|
|
||||||
*/
|
|
||||||
if (data->l2_cache == -1) {
|
|
||||||
data->l2_cache = 0;
|
|
||||||
} else {
|
|
||||||
data->l3_cache = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_intel_deterministic_cache_info(struct cpu_raw_data_t* raw,
|
|
||||||
struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int ecx;
|
|
||||||
int ways, partitions, linesize, sets, size, level, typenumber;
|
|
||||||
cache_type_t type;
|
|
||||||
for (ecx = 0; ecx < MAX_INTELFN4_LEVEL; ecx++) {
|
|
||||||
typenumber = raw->intel_fn4[ecx][0] & 0x1f;
|
|
||||||
if (typenumber == 0) break;
|
|
||||||
level = (raw->intel_fn4[ecx][0] >> 5) & 0x7;
|
|
||||||
if (level == 1 && typenumber == 1)
|
|
||||||
type = L1D;
|
|
||||||
else if (level == 1 && typenumber == 2)
|
|
||||||
type = L1I;
|
|
||||||
else if (level == 2 && typenumber == 3)
|
|
||||||
type = L2;
|
|
||||||
else if (level == 3 && typenumber == 3)
|
|
||||||
type = L3;
|
|
||||||
else if (level == 4 && typenumber == 3)
|
|
||||||
type = L4;
|
|
||||||
else {
|
|
||||||
warnf("deterministic_cache: unknown level/typenumber combo (%d/%d), cannot\n", level, typenumber);
|
|
||||||
warnf("deterministic_cache: recognize cache type\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ways = ((raw->intel_fn4[ecx][1] >> 22) & 0x3ff) + 1;
|
|
||||||
partitions = ((raw->intel_fn4[ecx][1] >> 12) & 0x3ff) + 1;
|
|
||||||
linesize = (raw->intel_fn4[ecx][1] & 0xfff) + 1;
|
|
||||||
sets = raw->intel_fn4[ecx][2] + 1;
|
|
||||||
size = ways * partitions * linesize * sets / 1024;
|
|
||||||
check_case(1, type, size, ways, linesize, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int decode_intel_extended_topology(struct cpu_raw_data_t* raw,
|
|
||||||
struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int i, level_type, num_smt = -1, num_core = -1;
|
|
||||||
for (i = 0; i < MAX_INTELFN11_LEVEL; i++) {
|
|
||||||
level_type = (raw->intel_fn11[i][2] & 0xff00) >> 8;
|
|
||||||
switch (level_type) {
|
|
||||||
case 0x01:
|
|
||||||
num_smt = raw->intel_fn11[i][1] & 0xffff;
|
|
||||||
break;
|
|
||||||
case 0x02:
|
|
||||||
num_core = raw->intel_fn11[i][1] & 0xffff;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (num_smt == -1 || num_core == -1) return 0;
|
|
||||||
data->num_logical_cpus = num_core;
|
|
||||||
data->num_cores = num_core / num_smt;
|
|
||||||
// make sure num_cores is at least 1. In VMs, the CPUID instruction
|
|
||||||
// is rigged and may give nonsensical results, but we should at least
|
|
||||||
// avoid outputs like data->num_cores == 0.
|
|
||||||
if (data->num_cores <= 0) data->num_cores = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_intel_number_of_cores(struct cpu_raw_data_t* raw,
|
|
||||||
struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int logical_cpus = -1, num_cores = -1;
|
|
||||||
|
|
||||||
if (raw->basic_cpuid[0][0] >= 11) {
|
|
||||||
if (decode_intel_extended_topology(raw, data)) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (raw->basic_cpuid[0][0] >= 1) {
|
|
||||||
logical_cpus = (raw->basic_cpuid[1][1] >> 16) & 0xff;
|
|
||||||
if (raw->basic_cpuid[0][0] >= 4) {
|
|
||||||
num_cores = 1 + ((raw->basic_cpuid[4][0] >> 26) & 0x3f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (data->flags[CPU_FEATURE_HT]) {
|
|
||||||
if (num_cores > 1) {
|
|
||||||
data->num_cores = num_cores;
|
|
||||||
data->num_logical_cpus = logical_cpus;
|
|
||||||
} else {
|
|
||||||
data->num_cores = 1;
|
|
||||||
data->num_logical_cpus = (logical_cpus >= 1 ? logical_cpus : 1);
|
|
||||||
if (data->num_logical_cpus == 1)
|
|
||||||
data->flags[CPU_FEATURE_HT] = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
data->num_cores = data->num_logical_cpus = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static intel_code_t get_brand_code(struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
intel_code_t code = (intel_code_t) NO_CODE;
|
|
||||||
int i, need_matchtable = 1, core_ix_base = 0;
|
|
||||||
const char* bs = data->brand_str;
|
|
||||||
const char* s;
|
|
||||||
const struct { intel_code_t c; const char *search; } matchtable[] = {
|
|
||||||
{ XEONMP, "Xeon MP" },
|
|
||||||
{ XEONMP, "Xeon(TM) MP" },
|
|
||||||
{ XEON, "Xeon" },
|
|
||||||
{ CELERON, "Celeron" },
|
|
||||||
{ MOBILE_PENTIUM_M, "Pentium(R) M" },
|
|
||||||
{ CORE_SOLO, "Pentium(R) Dual CPU" },
|
|
||||||
{ CORE_SOLO, "Pentium(R) Dual-Core" },
|
|
||||||
{ PENTIUM_D, "Pentium(R) D" },
|
|
||||||
{ PENTIUM, "Pentium" },
|
|
||||||
{ CORE_SOLO, "Genuine Intel(R) CPU" },
|
|
||||||
{ CORE_SOLO, "Intel(R) Core(TM)" },
|
|
||||||
{ ATOM_DIAMONDVILLE, "Atom(TM) CPU [N ][23]## " },
|
|
||||||
{ ATOM_SILVERTHORNE, "Atom(TM) CPU Z" },
|
|
||||||
{ ATOM_PINEVIEW, "Atom(TM) CPU [ND][45]## " },
|
|
||||||
{ ATOM_CEDARVIEW, "Atom(TM) CPU [ND]#### " },
|
|
||||||
{ ATOM_UNKNOWN, "Atom(TM) CPU" },
|
|
||||||
};
|
|
||||||
|
|
||||||
if (strstr(bs, "Mobile")) {
|
|
||||||
need_matchtable = 0;
|
|
||||||
if (strstr(bs, "Celeron"))
|
|
||||||
code = MOBILE_CELERON;
|
|
||||||
else if (strstr(bs, "Pentium"))
|
|
||||||
code = MOBILE_PENTIUM;
|
|
||||||
}
|
|
||||||
if ((i = match_pattern(bs, "Core(TM) i[357]")) != 0) {
|
|
||||||
/* Core i3, Core i5 or Core i7 */
|
|
||||||
need_matchtable = 0;
|
|
||||||
|
|
||||||
core_ix_base = CORE_I3;
|
|
||||||
|
|
||||||
/* if it has RdRand, then it is at least Ivy Bridge */
|
|
||||||
if (data->flags[CPU_FEATURE_RDRAND])
|
|
||||||
core_ix_base = CORE_IVY3;
|
|
||||||
/* if it has FMA, then it is at least Haswell */
|
|
||||||
if (data->flags[CPU_FEATURE_FMA3])
|
|
||||||
core_ix_base = CORE_HASWELL3;
|
|
||||||
/* if it has RTM, then it is at least a Broadwell-E or Skylake */
|
|
||||||
if (data->flags[CPU_FEATURE_RDSEED])
|
|
||||||
core_ix_base = CORE_BROADWELL3;
|
|
||||||
|
|
||||||
switch (bs[i + 9]) {
|
|
||||||
case '3': code = core_ix_base + 0; break;
|
|
||||||
case '5': code = core_ix_base + 1; break;
|
|
||||||
case '7': code = core_ix_base + 2; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (need_matchtable) {
|
|
||||||
for (i = 0; i < COUNT_OF(matchtable); i++)
|
|
||||||
if (match_pattern(bs, matchtable[i].search)) {
|
|
||||||
code = matchtable[i].c;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
debugf(2, "intel matchtable result is %d\n", code);
|
|
||||||
}
|
|
||||||
if (code == XEON) {
|
|
||||||
if (match_pattern(bs, "W35##") || match_pattern(bs, "[ELXW]75##"))
|
|
||||||
code = XEON_I7;
|
|
||||||
else if (match_pattern(bs, "[ELXW]55##"))
|
|
||||||
code = XEON_GAINESTOWN;
|
|
||||||
else if (match_pattern(bs, "[ELXW]56##"))
|
|
||||||
code = XEON_WESTMERE;
|
|
||||||
else if (data->l3_cache > 0 && data->family == 16)
|
|
||||||
/* restrict by family, since later Xeons also have L3 ... */
|
|
||||||
code = XEON_IRWIN;
|
|
||||||
}
|
|
||||||
if (code == XEONMP && data->l3_cache > 0)
|
|
||||||
code = XEON_POTOMAC;
|
|
||||||
if (code == CORE_SOLO) {
|
|
||||||
s = strstr(bs, "CPU");
|
|
||||||
if (s) {
|
|
||||||
s += 3;
|
|
||||||
while (*s == ' ') s++;
|
|
||||||
if (*s == 'T')
|
|
||||||
code = (data->num_cores == 1) ? MOBILE_CORE_SOLO : MOBILE_CORE_DUO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (code == CORE_SOLO) {
|
|
||||||
switch (data->num_cores) {
|
|
||||||
case 1: break;
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
code = CORE_DUO;
|
|
||||||
if (data->num_logical_cpus > 2)
|
|
||||||
code = DUAL_CORE_HT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
|
||||||
{
|
|
||||||
code = QUAD_CORE;
|
|
||||||
if (data->num_logical_cpus > 4)
|
|
||||||
code = QUAD_CORE_HT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
code = MORE_THAN_QUADCORE; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (code == CORE_DUO && data->ext_model >= 23) {
|
|
||||||
code = WOLFDALE;
|
|
||||||
}
|
|
||||||
if (code == PENTIUM_D && data->ext_model >= 23) {
|
|
||||||
code = WOLFDALE;
|
|
||||||
}
|
|
||||||
if (code == MOBILE_CORE_DUO && data->model != 14) {
|
|
||||||
if (data->ext_model < 23) {
|
|
||||||
code = MEROM;
|
|
||||||
} else {
|
|
||||||
code = PENRYN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static intel_model_t get_model_code(struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
int l = (int) strlen(data->brand_str);
|
|
||||||
const char *bs = data->brand_str;
|
|
||||||
int mod_flags = 0, model_no = 0, ndigs = 0;
|
|
||||||
/* If the CPU is a Core ix, then just return the model number generation: */
|
|
||||||
if ((i = match_pattern(bs, "Core(TM) i[357]")) != 0) {
|
|
||||||
i += 11;
|
|
||||||
if (i + 4 >= l) return UNKNOWN;
|
|
||||||
if (bs[i] == '2') return _2xxx;
|
|
||||||
if (bs[i] == '3') return _3xxx;
|
|
||||||
return UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For Core2-based Xeons: */
|
|
||||||
while (i < l - 3) {
|
|
||||||
if (bs[i] == 'C' && bs[i+1] == 'P' && bs[i+2] == 'U')
|
|
||||||
break;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (i >= l - 3) return UNKNOWN;
|
|
||||||
i += 3;
|
|
||||||
while (i < l - 4 && bs[i] == ' ') i++;
|
|
||||||
if (i >= l - 4) return UNKNOWN;
|
|
||||||
while (i < l - 4 && !isdigit(bs[i])) {
|
|
||||||
if (bs[i] >= 'A' && bs[i] <= 'Z')
|
|
||||||
mod_flags |= (1 << (bs[i] - 'A'));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (i >= l - 4) return UNKNOWN;
|
|
||||||
while (isdigit(bs[i])) {
|
|
||||||
ndigs++;
|
|
||||||
model_no = model_no * 10 + (int) (bs[i] - '0');
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (ndigs != 4) return UNKNOWN;
|
|
||||||
#define HAVE(ch, flags) ((flags & (1 << ((int)(ch-'A')))) != 0)
|
|
||||||
switch (model_no / 100) {
|
|
||||||
case 30: return _3000;
|
|
||||||
case 31: return _3100;
|
|
||||||
case 32:
|
|
||||||
{
|
|
||||||
return (HAVE('X', mod_flags)) ? X3200 : _3200;
|
|
||||||
}
|
|
||||||
case 33:
|
|
||||||
{
|
|
||||||
return (HAVE('X', mod_flags)) ? X3300 : _3300;
|
|
||||||
}
|
|
||||||
case 51: return _5100;
|
|
||||||
case 52: return _5200;
|
|
||||||
case 53: return _5300;
|
|
||||||
case 54: return _5400;
|
|
||||||
default:
|
|
||||||
return UNKNOWN;
|
|
||||||
}
|
|
||||||
#undef HAVE
|
|
||||||
}
|
|
||||||
|
|
||||||
static void decode_intel_sgx_features(const struct cpu_raw_data_t* raw, struct cpu_id_t* data)
|
|
||||||
{
|
|
||||||
struct cpu_epc_t epc;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (raw->basic_cpuid[0][0] < 0x12) return; // no 12h leaf
|
|
||||||
if (raw->basic_cpuid[0x12][0] == 0) return; // no sub-leafs available, probably it's disabled by BIOS
|
|
||||||
|
|
||||||
// decode sub-leaf 0:
|
|
||||||
if (raw->basic_cpuid[0x12][0] & 1) data->sgx.flags[INTEL_SGX1] = 1;
|
|
||||||
if (raw->basic_cpuid[0x12][0] & 2) data->sgx.flags[INTEL_SGX2] = 1;
|
|
||||||
if (data->sgx.flags[INTEL_SGX1] || data->sgx.flags[INTEL_SGX2])
|
|
||||||
data->sgx.present = 1;
|
|
||||||
data->sgx.misc_select = raw->basic_cpuid[0x12][1];
|
|
||||||
data->sgx.max_enclave_32bit = (raw->basic_cpuid[0x12][3] ) & 0xff;
|
|
||||||
data->sgx.max_enclave_64bit = (raw->basic_cpuid[0x12][3] >> 8) & 0xff;
|
|
||||||
|
|
||||||
// decode sub-leaf 1:
|
|
||||||
data->sgx.secs_attributes = raw->intel_fn12h[1][0] | (((uint64_t) raw->intel_fn12h[1][1]) << 32);
|
|
||||||
data->sgx.secs_xfrm = raw->intel_fn12h[1][2] | (((uint64_t) raw->intel_fn12h[1][3]) << 32);
|
|
||||||
|
|
||||||
// decode higher-order subleafs, whenever present:
|
|
||||||
data->sgx.num_epc_sections = -1;
|
|
||||||
for (i = 0; i < 1000000; i++) {
|
|
||||||
epc = cpuid_get_epc(i, raw);
|
|
||||||
if (epc.length == 0) {
|
|
||||||
debugf(2, "SGX: epc section request for %d returned null, no more EPC sections.\n", i);
|
|
||||||
data->sgx.num_epc_sections = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (data->sgx.num_epc_sections == -1) {
|
|
||||||
debugf(1, "SGX: warning: seems to be infinitude of EPC sections.\n");
|
|
||||||
data->sgx.num_epc_sections = 1000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct cpu_epc_t cpuid_get_epc(int index, const struct cpu_raw_data_t* raw)
|
|
||||||
{
|
|
||||||
uint32_t regs[4];
|
|
||||||
struct cpu_epc_t retval = {0, 0};
|
|
||||||
if (raw && index < MAX_INTELFN12H_LEVEL - 2) {
|
|
||||||
// this was queried already, use the data:
|
|
||||||
memcpy(regs, raw->intel_fn12h[2 + index], sizeof(regs));
|
|
||||||
} else {
|
|
||||||
// query this ourselves:
|
|
||||||
regs[0] = 0x12;
|
|
||||||
regs[2] = 2 + index;
|
|
||||||
regs[1] = regs[3] = 0;
|
|
||||||
cpu_exec_cpuid_ext(regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// decode values:
|
|
||||||
if ((regs[0] & 0xf) == 0x1) {
|
|
||||||
retval.start_addr |= (regs[0] & 0xfffff000); // bits [12, 32) -> bits [12, 32)
|
|
||||||
retval.start_addr |= ((uint64_t) (regs[1] & 0x000fffff)) << 32; // bits [0, 20) -> bits [32, 52)
|
|
||||||
retval.length |= (regs[2] & 0xfffff000); // bits [12, 32) -> bits [12, 32)
|
|
||||||
retval.length |= ((uint64_t) (regs[3] & 0x000fffff)) << 32; // bits [0, 20) -> bits [32, 52)
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal)
|
|
||||||
{
|
|
||||||
intel_code_t brand_code;
|
|
||||||
intel_model_t model_code;
|
|
||||||
int i;
|
|
||||||
char* brand_code_str = NULL;
|
|
||||||
|
|
||||||
load_intel_features(raw, data);
|
|
||||||
if (raw->basic_cpuid[0][0] >= 4) {
|
|
||||||
/* Deterministic way is preferred, being more generic */
|
|
||||||
decode_intel_deterministic_cache_info(raw, data);
|
|
||||||
} else if (raw->basic_cpuid[0][0] >= 2) {
|
|
||||||
decode_intel_oldstyle_cache_info(raw, data);
|
|
||||||
}
|
|
||||||
decode_intel_number_of_cores(raw, data);
|
|
||||||
|
|
||||||
brand_code = get_brand_code(data);
|
|
||||||
model_code = get_model_code(data);
|
|
||||||
for (i = 0; i < COUNT_OF(intel_bcode_str); i++) {
|
|
||||||
if (brand_code == intel_bcode_str[i].code) {
|
|
||||||
brand_code_str = intel_bcode_str[i].str;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (brand_code_str)
|
|
||||||
debugf(2, "Detected Intel brand code: %d (%s)\n", brand_code, brand_code_str);
|
|
||||||
else
|
|
||||||
debugf(2, "Detected Intel brand code: %d\n", brand_code);
|
|
||||||
debugf(2, "Detected Intel model code: %d\n", model_code);
|
|
||||||
|
|
||||||
internal->code.intel = brand_code;
|
|
||||||
|
|
||||||
if (data->flags[CPU_FEATURE_SGX]) {
|
|
||||||
debugf(2, "SGX seems to be present, decoding...\n");
|
|
||||||
// if SGX is indicated by the CPU, verify its presence:
|
|
||||||
decode_intel_sgx_features(raw, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal->score = match_cpu_codename(cpudb_intel, COUNT_OF(cpudb_intel), data,
|
|
||||||
brand_code, model_code);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpuid_get_list_intel(struct cpu_list_t* list)
|
|
||||||
{
|
|
||||||
generic_get_cpu_list(cpudb_intel, COUNT_OF(cpudb_intel), list);
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 Veselin Georgiev,
|
|
||||||
* anrieffNOSPAM @ mgail_DOT.com (convert to gmail)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __RECOG_INTEL_H__
|
|
||||||
#define __RECOG_INTEL_H__
|
|
||||||
|
|
||||||
int cpuid_identify_intel(struct cpu_raw_data_t* raw, struct cpu_id_t* data, struct internal_id_info_t* internal);
|
|
||||||
void cpuid_get_list_intel(struct cpu_list_t* list);
|
|
||||||
|
|
||||||
#endif /*__RECOG_INTEL_H__*/
|
|
2
contrib/libunwind
vendored
2
contrib/libunwind
vendored
@ -1 +1 @@
|
|||||||
Subproject commit ede00622ff8ecb1848ed22187eabbfaf8b4e9307
|
Subproject commit 27026ef4a9c6c8cc956d1d131c4d794e24096981
|
2
contrib/lz4
vendored
2
contrib/lz4
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 3d67671559be723b0912bbee2fcd2eb14783a721
|
Subproject commit f39b79fb02962a1cd880bbdecb6dffba4f754a11
|
@ -12,5 +12,6 @@ add_library (lz4
|
|||||||
${LIBRARY_DIR}/lz4hc.h)
|
${LIBRARY_DIR}/lz4hc.h)
|
||||||
|
|
||||||
target_compile_definitions(lz4 PUBLIC LZ4_DISABLE_DEPRECATE_WARNINGS=1)
|
target_compile_definitions(lz4 PUBLIC LZ4_DISABLE_DEPRECATE_WARNINGS=1)
|
||||||
|
target_compile_options(lz4 PRIVATE -fno-sanitize=undefined)
|
||||||
|
|
||||||
target_include_directories(lz4 PUBLIC ${LIBRARY_DIR})
|
target_include_directories(lz4 PUBLIC ${LIBRARY_DIR})
|
||||||
|
1
contrib/openldap
vendored
Submodule
1
contrib/openldap
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 34b9ba94b30319ed6389a4e001d057f7983fe363
|
202
contrib/openldap-cmake/CMakeLists.txt
Normal file
202
contrib/openldap-cmake/CMakeLists.txt
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
set(OPENLDAP_SOURCE_DIR ${ClickHouse_SOURCE_DIR}/contrib/openldap)
|
||||||
|
|
||||||
|
# How these lists were generated?
|
||||||
|
# I compiled the original OpenLDAP with it's original build system and copied the list of source files from build commands.
|
||||||
|
|
||||||
|
set(_libs_type SHARED)
|
||||||
|
if(OPENLDAP_USE_STATIC_LIBS)
|
||||||
|
set(_libs_type STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(OPENLDAP_VERSION_STRING "2.5.X")
|
||||||
|
|
||||||
|
macro(mkversion _lib_name)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_lib_name}-version.c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E env bash -c "${OPENLDAP_SOURCE_DIR}/build/mkversion -v '${OPENLDAP_VERSION_STRING}' liblber.la > ${CMAKE_CURRENT_BINARY_DIR}/${_lib_name}-version.c"
|
||||||
|
MAIN_DEPENDENCY ${OPENLDAP_SOURCE_DIR}/build/mkversion
|
||||||
|
WORKING_DIRECTORY ${OPENLDAP_SOURCE_DIR}
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
string(TOLOWER "${CMAKE_SYSTEM_NAME}" _system_name)
|
||||||
|
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _system_processor)
|
||||||
|
|
||||||
|
if(
|
||||||
|
"${_system_processor}" STREQUAL "amd64" OR
|
||||||
|
"${_system_processor}" STREQUAL "x64"
|
||||||
|
)
|
||||||
|
set(_system_processor "x86_64")
|
||||||
|
elseif(
|
||||||
|
"${_system_processor}" STREQUAL "arm64"
|
||||||
|
)
|
||||||
|
set (_system_processor "aarch64")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_extra_build_dir "${CMAKE_CURRENT_SOURCE_DIR}/${_system_name}_${_system_processor}")
|
||||||
|
|
||||||
|
set(_lber_srcs
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/assert.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/decode.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/encode.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/io.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/bprint.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/debug.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/memory.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/options.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/sockbuf.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/liblber/stdio.c
|
||||||
|
)
|
||||||
|
|
||||||
|
mkversion(lber)
|
||||||
|
|
||||||
|
add_library(lber ${_libs_type}
|
||||||
|
${_lber_srcs}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/lber-version.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(lber
|
||||||
|
PRIVATE ${OPENSSL_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(lber
|
||||||
|
PRIVATE ${_extra_build_dir}/include
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/include
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/libraries/liblber
|
||||||
|
PRIVATE ${OPENSSL_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(lber
|
||||||
|
PRIVATE LBER_LIBRARY
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_ldap_srcs
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/bind.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/open.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/result.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/error.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/compare.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/search.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/controls.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/messages.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/references.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/extended.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/cyrus.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/modify.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/add.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/modrdn.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/delete.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/abandon.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/sasl.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/sbind.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/unbind.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/cancel.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/filter.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/free.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/sort.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/passwd.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/whoami.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/vc.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/getdn.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/getentry.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/getattr.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/getvalues.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/addentry.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/request.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/os-ip.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/url.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/pagectrl.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/sortctrl.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/vlvctrl.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/init.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/options.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/print.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/string.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/util-int.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/schema.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/charray.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/os-local.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/dnssrv.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/utf-8.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/utf-8-conv.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/tls2.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/tls_o.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/tls_g.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/turn.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/ppolicy.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/dds.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/txn.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/ldap_sync.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/stctrl.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/assertion.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/deref.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/ldifutil.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/ldif.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/fetch.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/lbase64.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/msctrl.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap/psearchctrl.c
|
||||||
|
)
|
||||||
|
|
||||||
|
mkversion(ldap)
|
||||||
|
|
||||||
|
add_library(ldap ${_libs_type}
|
||||||
|
${_ldap_srcs}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/ldap-version.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ldap
|
||||||
|
PRIVATE lber
|
||||||
|
PRIVATE ${OPENSSL_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(ldap
|
||||||
|
PRIVATE ${_extra_build_dir}/include
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/include
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/libraries/libldap
|
||||||
|
PRIVATE ${OPENSSL_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(ldap
|
||||||
|
PRIVATE LDAP_LIBRARY
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_ldap_r_specific_srcs
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/threads.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/rdwr.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/tpool.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/rq.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/thr_posix.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/thr_thr.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/thr_nt.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/thr_pth.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/thr_stub.c
|
||||||
|
${OPENLDAP_SOURCE_DIR}/libraries/libldap_r/thr_debug.c
|
||||||
|
)
|
||||||
|
|
||||||
|
mkversion(ldap_r)
|
||||||
|
|
||||||
|
add_library(ldap_r ${_libs_type}
|
||||||
|
${_ldap_r_specific_srcs}
|
||||||
|
${_ldap_srcs}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/ldap_r-version.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ldap_r
|
||||||
|
PRIVATE lber
|
||||||
|
PRIVATE ${OPENSSL_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(ldap_r
|
||||||
|
PRIVATE ${_extra_build_dir}/include
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/include
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/libraries/libldap_r
|
||||||
|
PRIVATE ${OPENLDAP_SOURCE_DIR}/libraries/libldap
|
||||||
|
PRIVATE ${OPENSSL_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(ldap_r
|
||||||
|
PRIVATE LDAP_R_COMPILE
|
||||||
|
PRIVATE LDAP_LIBRARY
|
||||||
|
)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user