Architecture specific change in rpms/rust-tokio-rustls.git
by githook-noreply@fedoraproject.org
The package rpms/rust-tokio-rustls.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-tokio-rustls.git/commit/?id=....
Change:
+%ifarch %{supported_arches}
Thanks.
Full change:
============
commit e155c920f512c72e99fe1a536a1b78cc1bd9d669
Author: Fabio Valentini <decathorpe(a)gmail.com>
Date: Wed Jun 28 18:26:17 2023 +0200
Update to version 0.24.1; Fixes RHBZ#2183492
diff --git a/.gitignore b/.gitignore
index bea875c..f799e8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
/tokio-rustls-0.22.0.crate
/tokio-rustls-0.23.4.crate
+/tokio-rustls-0.24.1.crate
diff --git a/rust-tokio-rustls.spec b/rust-tokio-rustls.spec
index 2a894c1..288eb39 100644
--- a/rust-tokio-rustls.spec
+++ b/rust-tokio-rustls.spec
@@ -4,8 +4,11 @@
%global crate tokio-rustls
+# compile and run tests only on supported architectures
+%global supported_arches x86_64 %{ix86} aarch64 %{arm}
+
Name: rust-tokio-rustls
-Version: 0.23.4
+Version: 0.24.1
Release: %autorelease
Summary: Asynchronous TLS/SSL streams for Tokio using Rustls
@@ -13,12 +16,6 @@ Summary: Asynchronous TLS/SSL streams for Tokio using Rustls
License: MIT OR Apache-2.0
URL: https://crates.io/crates/tokio-rustls
Source: %{crates_source}
-# Manually created patch for downstream crate metadata changes
-# * bump rustls-pemfile dev-dependency from 0.2 to 1.0
-Patch: tokio-rustls-fix-metadata.diff
-
-# ring is not available on ppc64le and s390x
-ExcludeArch: ppc64le s390x
BuildRequires: rust-packaging >= 21
@@ -90,6 +87,18 @@ use the "logging" feature of the "%{crate}" crate.
%files -n %{name}+logging-devel
%ghost %{crate_instdir}/Cargo.toml
+%package -n %{name}+secret_extraction-devel
+Summary: %{summary}
+BuildArch: noarch
+
+%description -n %{name}+secret_extraction-devel %{_description}
+
+This package contains library source intended for building other packages which
+use the "secret_extraction" feature of the "%{crate}" crate.
+
+%files -n %{name}+secret_extraction-devel
+%ghost %{crate_instdir}/Cargo.toml
+
%package -n %{name}+tls12-devel
Summary: %{summary}
BuildArch: noarch
@@ -110,16 +119,19 @@ use the "tls12" feature of the "%{crate}" crate.
%cargo_generate_buildrequires
%build
+%ifarch %{supported_arches}
%cargo_build
+%endif
%install
%cargo_install
%if %{with check}
+%ifarch %{supported_arches}
%check
# * skip tests that require an internet connection
-# * skip tests that fail due to expired certificates
-%cargo_test -- -- --skip common::test_stream::stream --skip test_modern --skip test_tls12 --skip pass --skip test_lazy_config_acceptor
+%cargo_test -- -- --skip test_modern --skip test_tls12
+%endif
%endif
%changelog
diff --git a/rust2rpm.conf b/rust2rpm.conf
new file mode 100644
index 0000000..53a9929
--- /dev/null
+++ b/rust2rpm.conf
@@ -0,0 +1,6 @@
+[DEFAULT]
+supported-arches =
+ x86_64
+ %{ix86}
+ aarch64
+ %{arm}
diff --git a/sources b/sources
index fb7cfc5..a2d4d6f 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (tokio-rustls-0.23.4.crate) = 92d9f5f94f8a81bb12e5923e08e9e185340351342ed167f23a9855d0c2e77089ae882c0c24faccfbf3c8f1033589a76281da42824e8447ce1b56c7a383f38b13
+SHA512 (tokio-rustls-0.24.1.crate) = 93098f34d117107214e2e80e0e6c030423850ba160d1858b5149c165643700d308dacef7723e45b79fc911ba13bc1bf363c89ccac047cc6636e48a9a5a9502fa
diff --git a/tokio-rustls-fix-metadata.diff b/tokio-rustls-fix-metadata.diff
deleted file mode 100644
index 2fd8704..0000000
--- a/tokio-rustls-fix-metadata.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- tokio-rustls-0.23.4/Cargo.toml 1970-01-01T00:00:01+00:00
-+++ tokio-rustls-0.23.4/Cargo.toml 2023-03-18T21:37:39.147173+00:00
-@@ -43,7 +43,7 @@
- version = "1"
-
- [dev-dependencies.rustls-pemfile]
--version = "0.2.1"
-+version = "1.0"
-
- [dev-dependencies.tokio]
- version = "1.0"
10 months, 1 week
Architecture specific change in rpms/rust-rustls.git
by githook-noreply@fedoraproject.org
The package rpms/rust-rustls.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-rustls.git/commit/?id=225344....
Change:
+%ifarch %{supported_arches}
Thanks.
Full change:
============
commit 225344fcd752895e7da47c758de9d11a6a4c8a84
Author: Fabio Valentini <decathorpe(a)gmail.com>
Date: Wed Jun 28 18:25:29 2023 +0200
Update to version 0.21.2; Fixes RHBZ#2182860
diff --git a/.gitignore b/.gitignore
index 0b264e1..1a68013 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
/rustls-0.19.1.crate
/rustls-0.20.8.crate
+/rustls-0.21.1.crate
diff --git a/rust-rustls.spec b/rust-rustls.spec
index 9b48561..d4b006c 100644
--- a/rust-rustls.spec
+++ b/rust-rustls.spec
@@ -4,21 +4,17 @@
%global crate rustls
+# compile and run tests only on supported architectures
+%global supported_arches x86_64 %{ix86} aarch64 %{arm}
+
Name: rust-rustls
-Version: 0.20.8
+Version: 0.21.1
Release: %autorelease
Summary: Modern TLS library written in Rust
-# Upstream license specification: Apache-2.0/ISC/MIT
License: Apache-2.0 OR ISC OR MIT
URL: https://crates.io/crates/rustls
Source: %{crates_source}
-# Manually created patch for downstream crate metadata changes
-# * drop unused, benchmark-only criterion dev-dependency to speed up builds
-Patch: rustls-fix-metadata.diff
-
-# ring is not available on ppc64le and s390x
-ExcludeArch: ppc64le s390x
BuildRequires: rust-packaging >= 21
@@ -159,17 +155,21 @@ use the "tls12" feature of the "%{crate}" crate.
%cargo_generate_buildrequires
%build
+%ifarch %{supported_arches}
%cargo_build
+%endif
%install
%cargo_install
%if %{with check}
+%ifarch %{supported_arches}
%check
# * files needed for integration tests are not included in published crates
%cargo_test -- --lib -- --skip msgs::message_test::test_read_fuzz_corpus
%cargo_test -- --doc
%endif
+%endif
%changelog
%autochangelog
diff --git a/rust2rpm.conf b/rust2rpm.conf
new file mode 100644
index 0000000..53a9929
--- /dev/null
+++ b/rust2rpm.conf
@@ -0,0 +1,6 @@
+[DEFAULT]
+supported-arches =
+ x86_64
+ %{ix86}
+ aarch64
+ %{arm}
diff --git a/rustls-fix-metadata.diff b/rustls-fix-metadata.diff
deleted file mode 100644
index d85df7c..0000000
--- a/rustls-fix-metadata.diff
+++ /dev/null
@@ -1,24 +0,0 @@
---- rustls-0.20.8/Cargo.toml 1970-01-01T00:00:01+00:00
-+++ rustls-0.20.8/Cargo.toml 2023-03-18T21:17:17.212541+00:00
-@@ -50,11 +50,6 @@
- name = "bench"
- path = "examples/internal/bench.rs"
-
--[[bench]]
--name = "benchmarks"
--path = "benches/benchmarks.rs"
--harness = false
--
- [dependencies.log]
- version = "0.4.4"
- optional = true
-@@ -74,9 +69,6 @@
-
- [dev-dependencies.base64]
- version = "0.13.0"
--
--[dev-dependencies.criterion]
--version = "0.3.0"
-
- [dev-dependencies.env_logger]
- version = "0.9.0"
diff --git a/sources b/sources
index d7e4abd..a22f5c6 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (rustls-0.20.8.crate) = 4f56494987cd3a56f47dd07d31c7f73d262a4d003cf9cc11e0bce5fa85c87f18124b1c364186501736f0d40a1f193a24d5d73f37a491ff81ca8eff568559e547
+SHA512 (rustls-0.21.1.crate) = df07a0612841f94c81d73334f4c38f887bc58ce5e4190a465c124ff56e1c6ca7051fffc754bbd314d4e6ddae50b0ad75511547e7505bcbaea7cf07ba1e2ea4dc
10 months, 1 week
Architecture specific change in rpms/rust-webpki-roots.git
by githook-noreply@fedoraproject.org
The package rpms/rust-webpki-roots.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/rust-webpki-roots.git/commit/?id=....
Change:
+%ifarch %{supported_arches}
Thanks.
Full change:
============
commit ad99bb87e1085379fbd6d1002941e607927ae4e7
Author: Fabio Valentini <decathorpe(a)gmail.com>
Date: Wed Jun 28 18:23:19 2023 +0200
Update to version 0.23.1; Fixes RHBZ#2183557
diff --git a/.gitignore b/.gitignore
index 6b24c8c..e5611ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
/webpki-roots-0.21.1.crate
/webpki-roots-0.22.6.crate
+/webpki-roots-0.23.1.crate
diff --git a/rust-webpki-roots.spec b/rust-webpki-roots.spec
index 6004fe1..93983ef 100644
--- a/rust-webpki-roots.spec
+++ b/rust-webpki-roots.spec
@@ -4,8 +4,11 @@
%global crate webpki-roots
+# compile and run tests only on supported architectures
+%global supported_arches x86_64 %{ix86} aarch64 %{arm}
+
Name: rust-webpki-roots
-Version: 0.22.6
+Version: 0.23.1
Release: %autorelease
Summary: Mozilla's CA root certificates for use with webpki
@@ -16,9 +19,6 @@ Source: %{crates_source}
# * prevent development-only executable from being built
Patch: webpki-roots-fix-metadata.diff
-# ring is not available on ppc64le and s390x
-ExcludeArch: ppc64le s390x
-
BuildRequires: rust-packaging >= 21
%global _description %{expand:
@@ -60,15 +60,19 @@ use the "default" feature of the "%{crate}" crate.
%cargo_generate_buildrequires
%build
+%ifarch %{supported_arches}
%cargo_build
+%endif
%install
%cargo_install
%if %{with check}
+%ifarch %{supported_arches}
%check
%cargo_test
%endif
+%endif
%changelog
%autochangelog
diff --git a/rust2rpm.conf b/rust2rpm.conf
new file mode 100644
index 0000000..53a9929
--- /dev/null
+++ b/rust2rpm.conf
@@ -0,0 +1,6 @@
+[DEFAULT]
+supported-arches =
+ x86_64
+ %{ix86}
+ aarch64
+ %{arm}
diff --git a/sources b/sources
index 774feae..aa00084 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (webpki-roots-0.22.6.crate) = 00413a8354e2277f50c29851ed49a97f76bacb2017d61b10333981d15bcee13eceef8711e87d2aef1ed4f8a85763c6b1e7e21d61a57e7f689fe4aa6e67f4c140
+SHA512 (webpki-roots-0.23.1.crate) = 0fc144a385c92cc641f8683e935ccc3c30678404094f75b1b4396adbdaa40a2a758cc196c3df6f550a3e617bc780bf5d1448b752a3a1cd626605e28dbf307fb6
diff --git a/webpki-roots-fix-metadata.diff b/webpki-roots-fix-metadata.diff
index 364a5a7..4ed71e9 100644
--- a/webpki-roots-fix-metadata.diff
+++ b/webpki-roots-fix-metadata.diff
@@ -1,10 +1,10 @@
---- webpki-roots-0.22.6/Cargo.toml 1970-01-01T00:00:01+00:00
-+++ webpki-roots-0.22.6/Cargo.toml 2023-03-18T21:25:06.575320+00:00
-@@ -19,6 +19,7 @@
+--- webpki-roots-0.23.1/Cargo.toml 1970-01-01T00:00:01+00:00
++++ webpki-roots-0.23.1/Cargo.toml 2023-06-28T16:22:48.212333+00:00
+@@ -18,6 +18,7 @@
readme = "README.md"
license = "MPL-2.0"
repository = "https://github.com/rustls/webpki-roots"
+autobins = false
[dependencies.webpki]
- version = "0.22.0"
+ version = "0.100.0"
10 months, 1 week
Architecture specific change in rpms/stats-collect.git
by githook-noreply@fedoraproject.org
The package rpms/stats-collect.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/stats-collect.git/commit/?id=0939....
Change:
+ExclusiveArch: %{ix86} x86_64 noarch
Thanks.
Full change:
============
commit 57d4236d5d389f91ef8c33d16eea3f860e4a3e4e
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Wed Jun 28 15:21:35 2023 +0300
update to 1.0.7
diff --git a/sources b/sources
index c5c996a..c22ab42 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (stats-collect-1.0.6.tar.gz) = b2f11c8bb00378a3b946c639dcc41abb439e0121b660c1fe2ec8416b1909ef31c36a7e5e36ca7a7d0f84aa4f29dc5ed1a5f9a07490e913b6d781c1a42ebc8ad9
+SHA512 (stats-collect-1.0.7.tar.gz) = 734c8879574fa800b2a479b1902916078ecd87a2926ae6e80042ba7444670b1f7674b390a3d8d253739c63264f83851ed380abef099ca0bb8f41809c7a2e6d52
diff --git a/stats-collect.spec b/stats-collect.spec
index da52b5e..b7d6afd 100644
--- a/stats-collect.spec
+++ b/stats-collect.spec
@@ -1,7 +1,7 @@
%global debug_package %{nil}
Name: stats-collect
-Version: 1.0.6
+Version: 1.0.7
Release: %autorelease
Summary: A tool for collecting and visualising system statistics and telemetry
commit 906c0a6cc72bac7704b7d6363b27552faa8c88ac
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Tue Jun 13 17:46:46 2023 +0300
circular dep fix
diff --git a/stats-collect.spec b/stats-collect.spec
index 171c01a..da52b5e 100644
--- a/stats-collect.spec
+++ b/stats-collect.spec
@@ -17,7 +17,6 @@ BuildRequires: python3-pytest
BuildRequires: web-assets-devel
Provides: bundled(lit) = 2.2.8
Requires: web-assets-filesystem
-Requires: wult%{?_isa} >= 1.11.21
%description
The Statistics Collection Tool project provides the 'stats-collect'
commit d8ebb2831988e48f06a63cb876c66fd78b90426e
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Tue Jun 13 16:10:51 2023 +0300
add missing code_of_conduct.md
diff --git a/stats-collect.spec b/stats-collect.spec
index ef950a4..171c01a 100644
--- a/stats-collect.spec
+++ b/stats-collect.spec
@@ -43,7 +43,7 @@ STATS_COLLECT_WEB_ASSETS_PATH=%{buildroot}%{_jsdir}/%{name} STATS_COLLECT_DATA_P
%files -n %{name} -f %{pyproject_files}
%license js/dist/main.js.LICENSE.txt
-%doc CHANGELOG.md README.md security.md
+%doc CHANGELOG.md CODE_OF_CONDUCT.md README.md security.md
%{_bindir}/ipmi-helper
%{_bindir}/stats-collect
%{_bindir}/stc-agent
commit 09394399d727d54bb9df877d8abe6d93212c8e70
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Mon Jun 12 18:14:14 2023 +0300
1st release
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8ff781e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/stats-collect-*.tar.gz
diff --git a/sources b/sources
new file mode 100644
index 0000000..c5c996a
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (stats-collect-1.0.6.tar.gz) = b2f11c8bb00378a3b946c639dcc41abb439e0121b660c1fe2ec8416b1909ef31c36a7e5e36ca7a7d0f84aa4f29dc5ed1a5f9a07490e913b6d781c1a42ebc8ad9
diff --git a/stats-collect.spec b/stats-collect.spec
new file mode 100644
index 0000000..ef950a4
--- /dev/null
+++ b/stats-collect.spec
@@ -0,0 +1,55 @@
+%global debug_package %{nil}
+
+Name: stats-collect
+Version: 1.0.6
+Release: %autorelease
+Summary: A tool for collecting and visualising system statistics and telemetry
+
+License: BSD-3-Clause
+Url: https://github.com/intel/stats-collect
+Source0: %url/archive/v%{version}/%{name}-%{version}.tar.gz
+
+BuildArch: noarch
+ExclusiveArch: %{ix86} x86_64 noarch
+
+BuildRequires: python3-devel
+BuildRequires: python3-pytest
+BuildRequires: web-assets-devel
+Provides: bundled(lit) = 2.2.8
+Requires: web-assets-filesystem
+Requires: wult%{?_isa} >= 1.11.21
+
+%description
+The Statistics Collection Tool project provides the 'stats-collect'
+command-line tool. This tool collects system statistics and telemetry,
+and visualizes them. It’s for debugging and tracing purposes only.
+
+%prep
+%autosetup
+
+%generate_buildrequires
+%pyproject_buildrequires
+
+%build
+%pyproject_wheel
+
+%install
+%pyproject_install
+%pyproject_save_files statscollectlibs statscollecttools
+install -pDm644 docs/man1/stats-collect.1 %{buildroot}/%{_mandir}/man1/stats-collect.1
+
+%check
+STATS_COLLECT_WEB_ASSETS_PATH=%{buildroot}%{_jsdir}/%{name} STATS_COLLECT_DATA_PATH=%{buildroot}%{_datadir}/%{name} %pytest -v
+
+%files -n %{name} -f %{pyproject_files}
+%license js/dist/main.js.LICENSE.txt
+%doc CHANGELOG.md README.md security.md
+%{_bindir}/ipmi-helper
+%{_bindir}/stats-collect
+%{_bindir}/stc-agent
+%{_datadir}/%{name}
+%{_jsdir}/%{name}
+%{_mandir}/man1/stats-collect.1*
+
+%changelog
+%autochangelog
10 months, 1 week
Architecture specific change in rpms/stats-collect.git
by githook-noreply@fedoraproject.org
The package rpms/stats-collect.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/stats-collect.git/commit/?id=0939....
Change:
+ExclusiveArch: %{ix86} x86_64 noarch
Thanks.
Full change:
============
commit 57d4236d5d389f91ef8c33d16eea3f860e4a3e4e
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Wed Jun 28 15:21:35 2023 +0300
update to 1.0.7
diff --git a/sources b/sources
index c5c996a..c22ab42 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (stats-collect-1.0.6.tar.gz) = b2f11c8bb00378a3b946c639dcc41abb439e0121b660c1fe2ec8416b1909ef31c36a7e5e36ca7a7d0f84aa4f29dc5ed1a5f9a07490e913b6d781c1a42ebc8ad9
+SHA512 (stats-collect-1.0.7.tar.gz) = 734c8879574fa800b2a479b1902916078ecd87a2926ae6e80042ba7444670b1f7674b390a3d8d253739c63264f83851ed380abef099ca0bb8f41809c7a2e6d52
diff --git a/stats-collect.spec b/stats-collect.spec
index da52b5e..b7d6afd 100644
--- a/stats-collect.spec
+++ b/stats-collect.spec
@@ -1,7 +1,7 @@
%global debug_package %{nil}
Name: stats-collect
-Version: 1.0.6
+Version: 1.0.7
Release: %autorelease
Summary: A tool for collecting and visualising system statistics and telemetry
commit 906c0a6cc72bac7704b7d6363b27552faa8c88ac
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Tue Jun 13 17:46:46 2023 +0300
circular dep fix
diff --git a/stats-collect.spec b/stats-collect.spec
index 171c01a..da52b5e 100644
--- a/stats-collect.spec
+++ b/stats-collect.spec
@@ -17,7 +17,6 @@ BuildRequires: python3-pytest
BuildRequires: web-assets-devel
Provides: bundled(lit) = 2.2.8
Requires: web-assets-filesystem
-Requires: wult%{?_isa} >= 1.11.21
%description
The Statistics Collection Tool project provides the 'stats-collect'
commit d8ebb2831988e48f06a63cb876c66fd78b90426e
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Tue Jun 13 16:10:51 2023 +0300
add missing code_of_conduct.md
diff --git a/stats-collect.spec b/stats-collect.spec
index ef950a4..171c01a 100644
--- a/stats-collect.spec
+++ b/stats-collect.spec
@@ -43,7 +43,7 @@ STATS_COLLECT_WEB_ASSETS_PATH=%{buildroot}%{_jsdir}/%{name} STATS_COLLECT_DATA_P
%files -n %{name} -f %{pyproject_files}
%license js/dist/main.js.LICENSE.txt
-%doc CHANGELOG.md README.md security.md
+%doc CHANGELOG.md CODE_OF_CONDUCT.md README.md security.md
%{_bindir}/ipmi-helper
%{_bindir}/stats-collect
%{_bindir}/stc-agent
commit 09394399d727d54bb9df877d8abe6d93212c8e70
Author: Ali Erdinc Koroglu <aekoroglu(a)linux.intel.com>
Date: Mon Jun 12 18:14:14 2023 +0300
1st release
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8ff781e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/stats-collect-*.tar.gz
diff --git a/sources b/sources
new file mode 100644
index 0000000..c5c996a
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (stats-collect-1.0.6.tar.gz) = b2f11c8bb00378a3b946c639dcc41abb439e0121b660c1fe2ec8416b1909ef31c36a7e5e36ca7a7d0f84aa4f29dc5ed1a5f9a07490e913b6d781c1a42ebc8ad9
diff --git a/stats-collect.spec b/stats-collect.spec
new file mode 100644
index 0000000..ef950a4
--- /dev/null
+++ b/stats-collect.spec
@@ -0,0 +1,55 @@
+%global debug_package %{nil}
+
+Name: stats-collect
+Version: 1.0.6
+Release: %autorelease
+Summary: A tool for collecting and visualising system statistics and telemetry
+
+License: BSD-3-Clause
+Url: https://github.com/intel/stats-collect
+Source0: %url/archive/v%{version}/%{name}-%{version}.tar.gz
+
+BuildArch: noarch
+ExclusiveArch: %{ix86} x86_64 noarch
+
+BuildRequires: python3-devel
+BuildRequires: python3-pytest
+BuildRequires: web-assets-devel
+Provides: bundled(lit) = 2.2.8
+Requires: web-assets-filesystem
+Requires: wult%{?_isa} >= 1.11.21
+
+%description
+The Statistics Collection Tool project provides the 'stats-collect'
+command-line tool. This tool collects system statistics and telemetry,
+and visualizes them. It’s for debugging and tracing purposes only.
+
+%prep
+%autosetup
+
+%generate_buildrequires
+%pyproject_buildrequires
+
+%build
+%pyproject_wheel
+
+%install
+%pyproject_install
+%pyproject_save_files statscollectlibs statscollecttools
+install -pDm644 docs/man1/stats-collect.1 %{buildroot}/%{_mandir}/man1/stats-collect.1
+
+%check
+STATS_COLLECT_WEB_ASSETS_PATH=%{buildroot}%{_jsdir}/%{name} STATS_COLLECT_DATA_PATH=%{buildroot}%{_datadir}/%{name} %pytest -v
+
+%files -n %{name} -f %{pyproject_files}
+%license js/dist/main.js.LICENSE.txt
+%doc CHANGELOG.md README.md security.md
+%{_bindir}/ipmi-helper
+%{_bindir}/stats-collect
+%{_bindir}/stc-agent
+%{_datadir}/%{name}
+%{_jsdir}/%{name}
+%{_mandir}/man1/stats-collect.1*
+
+%changelog
+%autochangelog
10 months, 1 week
Architecture specific change in rpms/nagios-plugins-check-updates.git
by githook-noreply@fedoraproject.org
The package rpms/nagios-plugins-check-updates.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/nagios-plugins-check-updates.git/....
Change:
+ExcludeArch: %{ix86}
Thanks.
Full change:
============
commit d451a8fe5efc2f630d2d65c4e0fa18a779db6812
Author: Alessio <alciregi(a)fedoraproject.org>
Date: Wed Jun 28 11:17:25 2023 +0200
Exclude Arch: ix86
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index 7088978..7211b93 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -6,13 +6,15 @@
Name: nagios-plugins-check-updates
Version: 2.0.4
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPLv3+
URL: https://github.com/matteocorti/check_updates
Source: https://github.com/matteocorti/check_updates/releases/download/v%{version...
+# https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval
+ExcludeArch: %{ix86}
BuildRequires: coreutils
BuildRequires: findutils
commit 48ff428394d78c3e3c955ac069993ea1865e87bf
Author: Alessio <alciregi(a)fedoraproject.org>
Date: Wed Jun 28 10:31:40 2023 +0200
Update to 2.0.4
diff --git a/.gitignore b/.gitignore
index 9728b61..2a5cd77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@
/check_updates-1.7.10.tar.gz
/check_updates-1.8.5.tar.gz
/check_updates-2.0.3.tar.gz
+/check_updates-2.0.4.tar.gz
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index f946a80..7088978 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -5,8 +5,8 @@
%define debug_package %{nil}
Name: nagios-plugins-check-updates
-Version: 2.0.3
-Release: 3%{?dist}
+Version: 2.0.4
+Release: 1%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPLv3+
@@ -82,6 +82,9 @@ make test
%changelog
+* Wed Jun 28 2023 Alessio <alciregi(a)fedoraproject.org> - 2.0.4-1
+- Update to 2.0.4
+
* Thu Jan 19 2023 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.0.3-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
diff --git a/sources b/sources
index 35f3109..74f0393 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (check_updates-2.0.3.tar.gz) = e90cd2bdf137e7710865c053124245efb2bcb48081bf5084d2a06d165d27b0163f178702afaaa49b364928a889f718bd2278bc76073cc45410bf09eae5411714
+SHA512 (check_updates-2.0.4.tar.gz) = 543102774b0af9af58bf25142e3d970434981a05ecb84a28a81f1c4a1965e5a347a9a812d6a8184957a7417177cfc051bea94a66985128605f018adba99fda8a
commit 08e8a30a2cb414859c9cecb33cfc351b8d3320f4
Author: Fedora Release Engineering <releng(a)fedoraproject.org>
Date: Thu Jan 19 21:12:34 2023 +0000
Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng(a)fedoraproject.org>
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index 7e0b3bb..f946a80 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -6,7 +6,7 @@
Name: nagios-plugins-check-updates
Version: 2.0.3
-Release: 2%{?dist}
+Release: 3%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPLv3+
@@ -82,6 +82,9 @@ make test
%changelog
+* Thu Jan 19 2023 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.0.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
+
* Sat Nov 19 2022 piotr1212(a)gmail.com - 2.0.3-2
- Fix licensing shortcode
- Remove obsoletes
commit dbd1ab6d69062bfb1b4d3e8365b05916e3e024c9
Author: Piotr Popieluch <piotr1212(a)gmail.com>
Date: Sat Nov 19 19:36:14 2022 +0100
Fix licensing shortcode
Remove obsoletes
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index fe4c302..7e0b3bb 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -49,8 +49,6 @@ Requires: yum-plugin-security
Requires: perl(Monitoring::Plugin)
-Obsoletes: check_updates < 1.4.11
-
%description
%{summary}.
@@ -86,6 +84,7 @@ make test
%changelog
* Sat Nov 19 2022 piotr1212(a)gmail.com - 2.0.3-2
- Fix licensing shortcode
+- Remove obsoletes
* Tue Nov 15 2022 Alexander Acevedo <alex.acevedo(a)netfire.net> - 2.0.3-1
- Update to 2.0.3
commit 40539ca2f6ae2c4627bfaa4021b29170c0be5e98
Author: Piotr Popieluch <piotr1212(a)gmail.com>
Date: Sat Nov 19 19:27:23 2022 +0100
Fix licensing shortcode
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index 951fbe9..fe4c302 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -6,10 +6,10 @@
Name: nagios-plugins-check-updates
Version: 2.0.3
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
-License: GPL-3.0-or-later
+License: GPLv3+
URL: https://github.com/matteocorti/check_updates
Source: https://github.com/matteocorti/check_updates/releases/download/v%{version...
@@ -84,6 +84,9 @@ make test
%changelog
+* Sat Nov 19 2022 piotr1212(a)gmail.com - 2.0.3-2
+- Fix licensing shortcode
+
* Tue Nov 15 2022 Alexander Acevedo <alex.acevedo(a)netfire.net> - 2.0.3-1
- Update to 2.0.3
commit efd1383d51f853920674e9dbd0c4c5f07368c34e
Author: Alexander Acevedo <alex.acevedo(a)netfire.net>
Date: Tue Nov 15 22:41:00 2022 +0000
AUTHORS is now AUTHORS.md
AUTHORS is now AUTHORS.md
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index a93e606..951fbe9 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -78,7 +78,7 @@ make test
%files
%license COPYING COPYRIGHT
-%doc AUTHORS Changes NEWS README.md
+%doc AUTHORS.md Changes NEWS README.md
%{nagiospluginsdir}/*
%{_mandir}/man1/*.1*
commit e030a61ab710fe328a285fcc96f7d46aa5b5c5a5
Author: Alexander Acevedo <alex.acevedo(a)netfire.net>
Date: Tue Nov 15 22:26:22 2022 +0000
Fix changelog date for 2.0.3
Fix changelog date for 2.0.3
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index fae4965..a93e606 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -84,7 +84,7 @@ make test
%changelog
-* Tue Nov 10 2022 Alexander Acevedo <alex.acevedo(a)netfire.net> - 2.0.3-1
+* Tue Nov 15 2022 Alexander Acevedo <alex.acevedo(a)netfire.net> - 2.0.3-1
- Update to 2.0.3
* Sat Sep 10 2022 Carl George <carl(a)george.computer> - 1.8.5-2
commit 8101af844237602ba04d586fb96a7430f2d11515
Author: Alexander Acevedo <alex.acevedo(a)netfire.net>
Date: Tue Nov 15 22:08:25 2022 +0000
Add check-updates-2.0.3.tar.gz to .gitignore
Add check-updates-2.0.3.tar.gz to .gitignore
diff --git a/.gitignore b/.gitignore
index 78508e1..9728b61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@
/check_updates-1.7.9.tar.gz
/check_updates-1.7.10.tar.gz
/check_updates-1.8.5.tar.gz
+/check_updates-2.0.3.tar.gz
commit 5714376e3899e929816ac0bb5e23a6e327edf378
Author: Alexander Acevedo <alex.acevedo(a)netfire.net>
Date: Tue Nov 15 22:04:42 2022 +0000
Update sources to 2.0.3
Update sources to 2.0.3
diff --git a/sources b/sources
index c3af488..35f3109 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (check_updates-1.8.5.tar.gz) = 5e8397d24621bbc73eee7bfb8e3e5bbe9370602f1af1daf253858df725d69960320804121d3e189952af06973bb5cbdfcb84a59487dde6ee78788941ce509d32
+SHA512 (check_updates-2.0.3.tar.gz) = e90cd2bdf137e7710865c053124245efb2bcb48081bf5084d2a06d165d27b0163f178702afaaa49b364928a889f718bd2278bc76073cc45410bf09eae5411714
commit 98d10b2e8b1f18858f5f5d6985c147563780d876
Author: Alexander Acevedo <alex.acevedo(a)netfire.net>
Date: Tue Nov 15 21:59:36 2022 +0000
Update to 2.0.3
Update to 2.0.3
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index 2efb646..fae4965 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -5,8 +5,8 @@
%define debug_package %{nil}
Name: nagios-plugins-check-updates
-Version: 1.8.5
-Release: 2%{?dist}
+Version: 2.0.3
+Release: 1%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPL-3.0-or-later
@@ -84,6 +84,9 @@ make test
%changelog
+* Tue Nov 10 2022 Alexander Acevedo <alex.acevedo(a)netfire.net> - 2.0.3-1
+- Update to 2.0.3
+
* Sat Sep 10 2022 Carl George <carl(a)george.computer> - 1.8.5-2
- Fix license handling
commit e7e73f64036c26c30272dd61781650d4090134b5
Author: Carl George <carl(a)george.computer>
Date: Fri Sep 9 23:07:46 2022 -0500
Fix license handling
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index c4d30e2..2efb646 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -6,10 +6,10 @@
Name: nagios-plugins-check-updates
Version: 1.8.5
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
-License: GPLv3+
+License: GPL-3.0-or-later
URL: https://github.com/matteocorti/check_updates
Source: https://github.com/matteocorti/check_updates/releases/download/v%{version...
@@ -77,12 +77,16 @@ make test
%files
-%doc AUTHORS Changes NEWS README.md COPYING COPYRIGHT
+%license COPYING COPYRIGHT
+%doc AUTHORS Changes NEWS README.md
%{nagiospluginsdir}/*
%{_mandir}/man1/*.1*
%changelog
+* Sat Sep 10 2022 Carl George <carl(a)george.computer> - 1.8.5-2
+- Fix license handling
+
* Sat Jul 30 2022 Sean Mottles <seanmottles(a)posteo.net> - 1.8.5-1
- Update version to support AlmaLinux and Rocky Linux
- Skip the kernel checks if the kernel is not installed with RPM
commit dd46b7f7943ca058770faac10e222ba9d161f798
Author: seaninspace <seanm(a)member.fsf.org>
Date: Sat Jul 30 12:33:36 2022 +0200
Updating version to 1.8.5
diff --git a/.gitignore b/.gitignore
index 1043e11..78508e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,4 @@
/check_updates-1.7.8.tar.gz
/check_updates-1.7.9.tar.gz
/check_updates-1.7.10.tar.gz
+/check_updates-1.8.5.tar.gz
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index c24d33f..c4d30e2 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -5,8 +5,8 @@
%define debug_package %{nil}
Name: nagios-plugins-check-updates
-Version: 1.7.10
-Release: 6%{?dist}
+Version: 1.8.5
+Release: 1%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPLv3+
@@ -77,12 +77,16 @@ make test
%files
-%doc AUTHORS Changes NEWS README.md TODO COPYING COPYRIGHT
+%doc AUTHORS Changes NEWS README.md COPYING COPYRIGHT
%{nagiospluginsdir}/*
%{_mandir}/man1/*.1*
%changelog
+* Sat Jul 30 2022 Sean Mottles <seanmottles(a)posteo.net> - 1.8.5-1
+- Update version to support AlmaLinux and Rocky Linux
+- Skip the kernel checks if the kernel is not installed with RPM
+
* Fri Jul 22 2022 Fedora Release Engineering <releng(a)fedoraproject.org> - 1.7.10-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
diff --git a/sources b/sources
index 508f300..c3af488 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (check_updates-1.7.10.tar.gz) = 3ad05e075876b401611664460a381f4b032026cf0252167070aebde89c476edca8d5eeaeb598c54ba51946c9a754dc4c3fb852f05ff0aa671cca509c5d84ba3c
+SHA512 (check_updates-1.8.5.tar.gz) = 5e8397d24621bbc73eee7bfb8e3e5bbe9370602f1af1daf253858df725d69960320804121d3e189952af06973bb5cbdfcb84a59487dde6ee78788941ce509d32
10 months, 1 week
Architecture specific change in rpms/nagios-plugins-check-updates.git
by githook-noreply@fedoraproject.org
The package rpms/nagios-plugins-check-updates.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/nagios-plugins-check-updates.git/....
Change:
+ExcludeArch: %{ix86}
Thanks.
Full change:
============
commit d451a8fe5efc2f630d2d65c4e0fa18a779db6812
Author: Alessio <alciregi(a)fedoraproject.org>
Date: Wed Jun 28 11:17:25 2023 +0200
Exclude Arch: ix86
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index 7088978..7211b93 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -6,13 +6,15 @@
Name: nagios-plugins-check-updates
Version: 2.0.4
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPLv3+
URL: https://github.com/matteocorti/check_updates
Source: https://github.com/matteocorti/check_updates/releases/download/v%{version...
+# https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval
+ExcludeArch: %{ix86}
BuildRequires: coreutils
BuildRequires: findutils
commit 48ff428394d78c3e3c955ac069993ea1865e87bf
Author: Alessio <alciregi(a)fedoraproject.org>
Date: Wed Jun 28 10:31:40 2023 +0200
Update to 2.0.4
diff --git a/.gitignore b/.gitignore
index 9728b61..2a5cd77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@
/check_updates-1.7.10.tar.gz
/check_updates-1.8.5.tar.gz
/check_updates-2.0.3.tar.gz
+/check_updates-2.0.4.tar.gz
diff --git a/nagios-plugins-check-updates.spec b/nagios-plugins-check-updates.spec
index f946a80..7088978 100644
--- a/nagios-plugins-check-updates.spec
+++ b/nagios-plugins-check-updates.spec
@@ -5,8 +5,8 @@
%define debug_package %{nil}
Name: nagios-plugins-check-updates
-Version: 2.0.3
-Release: 3%{?dist}
+Version: 2.0.4
+Release: 1%{?dist}
Summary: A Nagios plugin to check if Red Hat or Fedora system is up-to-date
License: GPLv3+
@@ -82,6 +82,9 @@ make test
%changelog
+* Wed Jun 28 2023 Alessio <alciregi(a)fedoraproject.org> - 2.0.4-1
+- Update to 2.0.4
+
* Thu Jan 19 2023 Fedora Release Engineering <releng(a)fedoraproject.org> - 2.0.3-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
diff --git a/sources b/sources
index 35f3109..74f0393 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (check_updates-2.0.3.tar.gz) = e90cd2bdf137e7710865c053124245efb2bcb48081bf5084d2a06d165d27b0163f178702afaaa49b364928a889f718bd2278bc76073cc45410bf09eae5411714
+SHA512 (check_updates-2.0.4.tar.gz) = 543102774b0af9af58bf25142e3d970434981a05ecb84a28a81f1c4a1965e5a347a9a812d6a8184957a7417177cfc051bea94a66985128605f018adba99fda8a
10 months, 1 week
Architecture specific change in rpms/crash.git
by githook-noreply@fedoraproject.org
The package rpms/crash.git has added or updated architecture specific content in its
spec file (ExclusiveArch/ExcludeArch or %ifarch/%ifnarch) in commit(s):
https://src.fedoraproject.org/cgit/rpms/crash.git/commit/?id=8ec96351b502....
Change:
-%ifarch ppc64le
Thanks.
Full change:
============
commit 8ec96351b5024b931301ef5cc71640c7cb90fca7
Author: Lianbo Jiang <lijiang(a)redhat.com>
Date: Tue Jun 27 14:57:53 2023 +0800
Rebase(crash-8.0.3) and update to the latest commit <7750e61fdb2a>
Release: crash-8.0.3-1
Support module memory layout change on Linux 6.4
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
diff --git a/.gitignore b/.gitignore
index 0a407bd..4d89d06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,5 +47,6 @@ crash-5.0.6.tar.gz
/crash-8.0.0.tar.gz
/crash-8.0.1.tar.gz
/crash-8.0.2.tar.gz
+/crash-8.0.3.tar.gz
/gdb-7.6.tar.gz
/gdb-10.2.tar.gz
diff --git a/0001-Fix-kernel-version-macros-for-revision-numbers-over-.patch b/0001-Fix-kernel-version-macros-for-revision-numbers-over-.patch
new file mode 100644
index 0000000..b044206
--- /dev/null
+++ b/0001-Fix-kernel-version-macros-for-revision-numbers-over-.patch
@@ -0,0 +1,52 @@
+From 040a56e9f9d0df15a2f8161ed3a0a907d70dda03 Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Date: Wed, 10 May 2023 16:09:03 +0900
+Subject: [PATCH 01/13] Fix kernel version macros for revision numbers over 255
+
+The current comparison macros for kernel version shift minor number only
+8 bits. This can cause an unexpected result on kernels with revision
+number over 255, e.g. Linux 4.14.314.
+
+In fact, on Linux 4.14.314 for x86_64 without CONFIG_RANDOMIZE_BASE=y
+(KASLR), the following condition became false in x86_64_init().
+
+ ((THIS_KERNEL_VERSION >= LINUX(4,14,84)) &&
+ (THIS_KERNEL_VERSION < LINUX(4,15,0)))
+
+As a result, crash used a wrong hard-coded value for PAGE_OFFSET and
+failed to start a session with the following seek error.
+
+ crash: seek error: physical address: 200e000 type: "pud page"
+
+Shift the major and minor number by 24 and 16 bits respectively to fix
+this issue.
+
+Reported-by: Luiz Capitulino <luizcap(a)amazon.com>
+Tested-by: Luiz Capitulino <luizcap(a)amazon.com>
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/defs.h b/defs.h
+index 12ad6aaa0998..211fc9d55d33 100644
+--- a/defs.h
++++ b/defs.h
+@@ -807,10 +807,10 @@ struct kernel_table { /* kernel data */
+ } \
+ }
+
+-#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 16) + \
+- (kt->kernel_version[1] << 8) + \
++#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 24) + \
++ (kt->kernel_version[1] << 16) + \
+ (kt->kernel_version[2]))
+-#define LINUX(x,y,z) (((uint)(x) << 16) + ((uint)(y) << 8) + (uint)(z))
++#define LINUX(x,y,z) (((uint)(x) << 24) + ((uint)(y) << 16) + (uint)(z))
+
+ #define THIS_GCC_VERSION ((kt->gcc_version[0] << 16) + \
+ (kt->gcc_version[1] << 8) + \
+--
+2.37.1
+
diff --git a/0001-ps-Provide-an-option-to-display-no-header-line.patch b/0001-ps-Provide-an-option-to-display-no-header-line.patch
deleted file mode 100644
index 0b6bd07..0000000
--- a/0001-ps-Provide-an-option-to-display-no-header-line.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From 9f1256958d2b18953b4c8b244d88c023048a964f Mon Sep 17 00:00:00 2001
-From: Aaron Tomlin <atomlin(a)redhat.com>
-Date: Tue, 29 Nov 2022 14:05:26 +0000
-Subject: [PATCH 01/28] ps: Provide an option to display no header line
-
-One might often find it useful to redirect/or filter the output
-generated by the 'ps' command. This simple patch provides an option
-(i.e. '-H') to display no header line so it does not need to be
-considered e.g.
-
-crash> ps -u -H | head -5
- 1 0 1 ffff956e8028d280 IN 0.0 174276 9272 systemd
- 1067 1 2 ffff956e81380000 IN 0.1 59480 15788 systemd-journal
- 1080 1 0 ffff956e8d152940 IN 0.0 36196 3548 systemd-udevd
- 1278 1 6 ffff956e8aa60000 IN 0.0 17664 3072 systemd-oomd
- 1366 1 7 ffff956e88548000 IN 0.0 10868 2328 dbus-broker-lau
-
-Signed-off-by: Aaron Tomlin <atomlin(a)atomlin.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- help.c | 3 ++-
- task.c | 6 +++++-
- 2 files changed, 7 insertions(+), 2 deletions(-)
-
-diff --git a/help.c b/help.c
-index 99214c1590fa..14981cd01d48 100644
---- a/help.c
-+++ b/help.c
-@@ -1379,7 +1379,7 @@ NULL
- char *help_ps[] = {
- "ps",
- "display process status information",
--"[-k|-u|-G|-y policy] [-s] [-p|-c|-t|-[l|m][-C cpu]|-a|-g|-r|-S|-A]\n [pid | task | command] ...",
-+"[-k|-u|-G|-y policy] [-s] [-p|-c|-t|-[l|m][-C cpu]|-a|-g|-r|-S|-A|-H]\n [pid | task | command] ...",
- " This command displays process status for selected, or all, processes" ,
- " in the system. If no arguments are entered, the process data is",
- " is displayed for all processes. Specific processes may be selected",
-@@ -1458,6 +1458,7 @@ char *help_ps[] = {
- " -r display resource limits (rlimits) of selected, or all, tasks.",
- " -S display a summary consisting of the number of tasks in a task state.",
- " -A display only the active task on each cpu.",
-+" -H display no header line.",
- "\nEXAMPLES",
- " Show the process status of all current tasks:\n",
- " %s> ps",
-diff --git a/task.c b/task.c
-index db2abc8106a2..88941c7b0e4d 100644
---- a/task.c
-+++ b/task.c
-@@ -3504,7 +3504,7 @@ cmd_ps(void)
- cpuspec = NULL;
- flag = 0;
-
-- while ((c = getopt(argcnt, args, "ASgstcpkuGlmarC:y:")) != EOF) {
-+ while ((c = getopt(argcnt, args, "HASgstcpkuGlmarC:y:")) != EOF) {
- switch(c)
- {
- case 'k':
-@@ -3615,6 +3615,10 @@ cmd_ps(void)
- flag |= PS_ACTIVE;
- break;
-
-+ case 'H':
-+ flag |= PS_NO_HEADER;
-+ break;
-+
- default:
- argerrs++;
- break;
---
-2.37.1
-
diff --git a/0002-Fix-failure-of-dev-d-D-options-on-Linux-6.4-and-late.patch b/0002-Fix-failure-of-dev-d-D-options-on-Linux-6.4-and-late.patch
new file mode 100644
index 0000000..c7789e7
--- /dev/null
+++ b/0002-Fix-failure-of-dev-d-D-options-on-Linux-6.4-and-late.patch
@@ -0,0 +1,179 @@
+From 58c1816521c2e6bece3d69256b1866c9df8d93aa Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Date: Tue, 16 May 2023 08:59:50 +0900
+Subject: [PATCH 02/13] Fix failure of "dev -d|-D" options on Linux 6.4 and
+ later kernels
+
+Kernel commit 2df418cf4b72 ("driver core: class: remove subsystem
+private pointer from struct class"), which is contained in Linux 6.4 and
+later kernels, removed the class.p member for struct subsys_private. As
+a result, the "dev -d|-D" options fail with the following error.
+
+ dev: invalid structure member offset: class_p
+ FILE: dev.c LINE: 4689 FUNCTION: init_iter()
+
+Search the class_kset list for the subsys_private of block class to fix
+this.
+
+As a preparation, introduce get_subsys_private() function, which is
+abstracted from the same search procedure in init_memory_block().
+
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 1 +
+ dev.c | 20 +++++++++++++++++---
+ memory.c | 35 +++--------------------------------
+ tools.c | 43 +++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 64 insertions(+), 35 deletions(-)
+
+diff --git a/defs.h b/defs.h
+index 211fc9d55d33..21cc760444d1 100644
+--- a/defs.h
++++ b/defs.h
+@@ -5521,6 +5521,7 @@ struct rb_node *rb_left(struct rb_node *, struct rb_node *);
+ struct rb_node *rb_next(struct rb_node *);
+ struct rb_node *rb_last(struct rb_root *);
+ long percpu_counter_sum_positive(ulong fbc);
++ulong get_subsys_private(char *, char *);
+
+ /*
+ * symbols.c
+diff --git a/dev.c b/dev.c
+index 75d30bd022a1..9d38aef9b3db 100644
+--- a/dev.c
++++ b/dev.c
+@@ -4686,9 +4686,16 @@ init_iter(struct iter *i)
+ } else {
+ /* kernel version > 2.6.27, klist */
+ unsigned long class_private_addr;
+- readmem(block_class_addr + OFFSET(class_p), KVADDR,
+- &class_private_addr, sizeof(class_private_addr),
+- "class.p", FAULT_ON_ERROR);
++
++ if (INVALID_MEMBER(class_p)) /* kernel version >= 6.4 */
++ class_private_addr = get_subsys_private("class_kset", "block");
++ else
++ readmem(block_class_addr + OFFSET(class_p), KVADDR,
++ &class_private_addr, sizeof(class_private_addr),
++ "class.p", FAULT_ON_ERROR);
++
++ if (!class_private_addr)
++ error(FATAL, "cannot determine subsys_private for block.\n");
+
+ if (VALID_STRUCT(class_private)) {
+ /* 2.6.27 < kernel version <= 2.6.37-rc2 */
+@@ -4823,6 +4830,13 @@ void diskio_init(void)
+ if (INVALID_MEMBER(class_devices))
+ MEMBER_OFFSET_INIT(class_devices, "class", "devices");
+ MEMBER_OFFSET_INIT(class_p, "class", "p");
++ if (INVALID_MEMBER(class_p)) {
++ MEMBER_OFFSET_INIT(kset_list, "kset", "list");
++ MEMBER_OFFSET_INIT(kset_kobj, "kset", "kobj");
++ MEMBER_OFFSET_INIT(kobject_name, "kobject", "name");
++ MEMBER_OFFSET_INIT(kobject_entry, "kobject", "entry");
++ MEMBER_OFFSET_INIT(subsys_private_subsys, "subsys_private", "subsys");
++ }
+ MEMBER_OFFSET_INIT(class_private_devices, "class_private",
+ "class_devices");
+ MEMBER_OFFSET_INIT(device_knode_class, "device", "knode_class");
+diff --git a/memory.c b/memory.c
+index 0568f18eb9b7..953fc380c03c 100644
+--- a/memory.c
++++ b/memory.c
+@@ -17865,38 +17865,9 @@ init_memory_block(int *klistcnt, ulong **klistbuf)
+ * v6.3-rc1
+ * d2bf38c088e0 driver core: remove private pointer from struct bus_type
+ */
+- if (INVALID_MEMBER(bus_type_p)) {
+- int i, cnt;
+- char buf[32];
+- ulong bus_kset, list, name;
+-
+- BZERO(ld, sizeof(struct list_data));
+-
+- get_symbol_data("bus_kset", sizeof(ulong), &bus_kset);
+- readmem(bus_kset + OFFSET(kset_list), KVADDR, &list,
+- sizeof(ulong), "bus_kset.list", FAULT_ON_ERROR);
+-
+- ld->flags |= LIST_ALLOCATE;
+- ld->start = list;
+- ld->end = bus_kset + OFFSET(kset_list);
+- ld->list_head_offset = OFFSET(kobject_entry);
+-
+- cnt = do_list(ld);
+- for (i = 0; i < cnt; i++) {
+- readmem(ld->list_ptr[i] + OFFSET(kobject_name), KVADDR, &name,
+- sizeof(ulong), "kobject.name", FAULT_ON_ERROR);
+- read_string(name, buf, sizeof(buf)-1);
+- if (CRASHDEBUG(1))
+- fprintf(fp, "kobject: %lx name: %s\n", ld->list_ptr[i], buf);
+- if (STREQ(buf, "memory")) {
+- /* entry is subsys_private.subsys.kobj. See bus_to_subsys(). */
+- private = ld->list_ptr[i] - OFFSET(kset_kobj)
+- - OFFSET(subsys_private_subsys);
+- break;
+- }
+- }
+- FREEBUF(ld->list_ptr);
+- } else {
++ if (INVALID_MEMBER(bus_type_p))
++ private = get_subsys_private("bus_kset", "memory");
++ else {
+ ulong memory_subsys = symbol_value("memory_subsys");
+ readmem(memory_subsys + OFFSET(bus_type_p), KVADDR, &private,
+ sizeof(void *), "memory_subsys.private", FAULT_ON_ERROR);
+diff --git a/tools.c b/tools.c
+index c2cfa7e280bc..392a79707e61 100644
+--- a/tools.c
++++ b/tools.c
+@@ -6963,3 +6963,46 @@ percpu_counter_sum_positive(ulong fbc)
+
+ return (ret < 0) ? 0 : ret;
+ }
++
++ulong
++get_subsys_private(char *kset_name, char *target_name)
++{
++ ulong kset_addr, kset_list, name_addr, private = 0;
++ struct list_data list_data, *ld;
++ char buf[32];
++ int i, cnt;
++
++ if (!symbol_exists(kset_name))
++ return 0;
++
++ ld = &list_data;
++ BZERO(ld, sizeof(struct list_data));
++
++ get_symbol_data(kset_name, sizeof(ulong), &kset_addr);
++ readmem(kset_addr + OFFSET(kset_list), KVADDR, &kset_list,
++ sizeof(ulong), "kset.list", FAULT_ON_ERROR);
++
++ ld->flags |= LIST_ALLOCATE;
++ ld->start = kset_list;
++ ld->end = kset_addr + OFFSET(kset_list);
++ ld->list_head_offset = OFFSET(kobject_entry);
++
++ cnt = do_list(ld);
++
++ for (i = 0; i < cnt; i++) {
++ readmem(ld->list_ptr[i] + OFFSET(kobject_name), KVADDR, &name_addr,
++ sizeof(ulong), "kobject.name", FAULT_ON_ERROR);
++ read_string(name_addr, buf, sizeof(buf)-1);
++ if (CRASHDEBUG(1))
++ fprintf(fp, "kobject: %lx name: %s\n", ld->list_ptr[i], buf);
++ if (STREQ(buf, target_name)) {
++ /* entry is subsys_private.subsys.kobj. See bus_to_subsys(). */
++ private = ld->list_ptr[i] - OFFSET(kset_kobj)
++ - OFFSET(subsys_private_subsys);
++ break;
++ }
++ }
++ FREEBUF(ld->list_ptr);
++
++ return private;
++}
+--
+2.37.1
+
diff --git a/0002-arm64-fix-backtraces-of-KASAN-kernel-dumpfile-trunca.patch b/0002-arm64-fix-backtraces-of-KASAN-kernel-dumpfile-trunca.patch
deleted file mode 100644
index fe5d2b3..0000000
--- a/0002-arm64-fix-backtraces-of-KASAN-kernel-dumpfile-trunca.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-From 5f27639196c3240810fbf30d367da0063a6612ff Mon Sep 17 00:00:00 2001
-From: Ding Hui <dinghui(a)sangfor.com.cn>
-Date: Thu, 1 Dec 2022 15:01:45 +0800
-Subject: [PATCH 02/28] arm64: fix backtraces of KASAN kernel dumpfile
- truncated
-
-We met "bt" command on KASAN kernel vmcore display truncated backtraces
-like this:
-
- crash> bt
- PID: 4131 TASK: ffff8001521df000 CPU: 3 COMMAND: "bash"
- #0 [ffff2000224b0cb0] machine_kexec_prepare at ffff2000200bff4c
-
-After digging the root cause, it turns out that arm64_in_kdump_text()
-found wrong bt->bptr at "machine_kexec" branch.
-
-Disassemble machine_kexec() of KASAN vmlinux (gcc 7.3.0):
-
- crash> dis -x machine_kexec
- 0xffff2000200bff50 <machine_kexec>: stp x29, x30, [sp,#-208]!
- 0xffff2000200bff54 <machine_kexec+0x4>: mov x29, sp
- 0xffff2000200bff58 <machine_kexec+0x8>: stp x19, x20, [sp,#16]
- 0xffff2000200bff5c <machine_kexec+0xc>: str x24, [sp,#56]
- 0xffff2000200bff60 <machine_kexec+0x10>: str x26, [sp,#72]
- 0xffff2000200bff64 <machine_kexec+0x14>: mov x2, #0x8ab3
- 0xffff2000200bff68 <machine_kexec+0x18>: add x1, x29, #0x70
- 0xffff2000200bff6c <machine_kexec+0x1c>: lsr x1, x1, #3
- 0xffff2000200bff70 <machine_kexec+0x20>: movk x2, #0x41b5, lsl #16
- 0xffff2000200bff74 <machine_kexec+0x24>: mov x19, #0x200000000000
- 0xffff2000200bff78 <machine_kexec+0x28>: adrp x3, 0xffff2000224b0000
- 0xffff2000200bff7c <machine_kexec+0x2c>: movk x19, #0xdfff, lsl #48
- 0xffff2000200bff80 <machine_kexec+0x30>: add x3, x3, #0xcb0
- 0xffff2000200bff84 <machine_kexec+0x34>: add x4, x1, x19
- 0xffff2000200bff88 <machine_kexec+0x38>: stp x2, x3, [x29,#112]
- 0xffff2000200bff8c <machine_kexec+0x3c>: adrp x2, 0xffff2000200bf000 <swsusp_arch_resume+0x1e8>
- 0xffff2000200bff90 <machine_kexec+0x40>: add x2, x2, #0xf50
- 0xffff2000200bff94 <machine_kexec+0x44>: str x2, [x29,#128]
- 0xffff2000200bff98 <machine_kexec+0x48>: mov w2, #0xf1f1f1f1
- 0xffff2000200bff9c <machine_kexec+0x4c>: str w2, [x1,x19]
- 0xffff2000200bffa0 <machine_kexec+0x50>: mov w2, #0xf200
- 0xffff2000200bffa4 <machine_kexec+0x54>: mov w1, #0xf3f3f3f3
- 0xffff2000200bffa8 <machine_kexec+0x58>: movk w2, #0xf2f2, lsl #16
- 0xffff2000200bffac <machine_kexec+0x5c>: stp w2, w1, [x4,#4]
-
-We notice that:
-1. machine_kexec() start address is 0xffff2000200bff50
-2. the instruction at machine_kexec+0x44 stores the same value
- 0xffff2000200bff50 (comes from 0xffff2000200bf000 + 0xf50)
- into stack postion [x29,#128].
-
-When arm64_in_kdump_text() searches for LR from stack, it met
-0xffff2000200bff50 firstly, so got wrong bt->bptr.
-
-We know that the real LR is always greater than the start address
-of a function, so let's fix it by changing the search conditon to
-(*ptr > xxx_start) && (*ptr < xxx_end).
-
-Signed-off-by: Ding Hui <dinghui(a)sangfor.com.cn>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- arm64.c | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/arm64.c b/arm64.c
-index c3e26a371a61..7e8a7db1fcc4 100644
---- a/arm64.c
-+++ b/arm64.c
-@@ -3479,7 +3479,7 @@ arm64_in_kdump_text(struct bt_info *bt, struct arm64_stackframe *frame)
- ms = machdep->machspec;
- for (ptr = start - 8; ptr >= base; ptr--) {
- if (bt->flags & BT_OPT_BACK_TRACE) {
-- if ((*ptr >= ms->crash_kexec_start) &&
-+ if ((*ptr > ms->crash_kexec_start) &&
- (*ptr < ms->crash_kexec_end) &&
- INSTACK(*(ptr - 1), bt)) {
- bt->bptr = ((ulong)(ptr - 1) - (ulong)base)
-@@ -3488,7 +3488,7 @@ arm64_in_kdump_text(struct bt_info *bt, struct arm64_stackframe *frame)
- fprintf(fp, "%lx: %lx (crash_kexec)\n", bt->bptr, *ptr);
- return TRUE;
- }
-- if ((*ptr >= ms->crash_save_cpu_start) &&
-+ if ((*ptr > ms->crash_save_cpu_start) &&
- (*ptr < ms->crash_save_cpu_end) &&
- INSTACK(*(ptr - 1), bt)) {
- bt->bptr = ((ulong)(ptr - 1) - (ulong)base)
-@@ -3498,14 +3498,14 @@ arm64_in_kdump_text(struct bt_info *bt, struct arm64_stackframe *frame)
- return TRUE;
- }
- } else {
-- if ((*ptr >= ms->machine_kexec_start) && (*ptr < ms->machine_kexec_end)) {
-+ if ((*ptr > ms->machine_kexec_start) && (*ptr < ms->machine_kexec_end)) {
- bt->bptr = ((ulong)ptr - (ulong)base)
- + task_to_stackbase(bt->tc->task);
- if (CRASHDEBUG(1))
- fprintf(fp, "%lx: %lx (machine_kexec)\n", bt->bptr, *ptr);
- return TRUE;
- }
-- if ((*ptr >= ms->crash_kexec_start) && (*ptr < ms->crash_kexec_end)) {
-+ if ((*ptr > ms->crash_kexec_start) && (*ptr < ms->crash_kexec_end)) {
- /*
- * Stash the first crash_kexec frame in case the machine_kexec
- * frame is not found.
-@@ -3519,7 +3519,7 @@ arm64_in_kdump_text(struct bt_info *bt, struct arm64_stackframe *frame)
- }
- continue;
- }
-- if ((*ptr >= ms->crash_save_cpu_start) && (*ptr < ms->crash_save_cpu_end)) {
-+ if ((*ptr > ms->crash_save_cpu_start) && (*ptr < ms->crash_save_cpu_end)) {
- bt->bptr = ((ulong)ptr - (ulong)base)
- + task_to_stackbase(bt->tc->task);
- if (CRASHDEBUG(1))
-@@ -3566,7 +3566,7 @@ arm64_in_kdump_text_on_irq_stack(struct bt_info *bt)
-
- for (ptr = start - 8; ptr >= base; ptr--) {
- if (bt->flags & BT_OPT_BACK_TRACE) {
-- if ((*ptr >= ms->crash_kexec_start) &&
-+ if ((*ptr > ms->crash_kexec_start) &&
- (*ptr < ms->crash_kexec_end) &&
- INSTACK(*(ptr - 1), bt)) {
- bt->bptr = ((ulong)(ptr - 1) - (ulong)base) + stackbase;
-@@ -3576,7 +3576,7 @@ arm64_in_kdump_text_on_irq_stack(struct bt_info *bt)
- FREEBUF(stackbuf);
- return TRUE;
- }
-- if ((*ptr >= ms->crash_save_cpu_start) &&
-+ if ((*ptr > ms->crash_save_cpu_start) &&
- (*ptr < ms->crash_save_cpu_end) &&
- INSTACK(*(ptr - 1), bt)) {
- bt->bptr = ((ulong)(ptr - 1) - (ulong)base) + stackbase;
-@@ -3587,7 +3587,7 @@ arm64_in_kdump_text_on_irq_stack(struct bt_info *bt)
- return TRUE;
- }
- } else {
-- if ((*ptr >= ms->crash_kexec_start) && (*ptr < ms->crash_kexec_end)) {
-+ if ((*ptr > ms->crash_kexec_start) && (*ptr < ms->crash_kexec_end)) {
- bt->bptr = ((ulong)ptr - (ulong)base) + stackbase;
- if (CRASHDEBUG(1))
- fprintf(fp, "%lx: %lx (crash_kexec on IRQ stack)\n",
-@@ -3595,7 +3595,7 @@ arm64_in_kdump_text_on_irq_stack(struct bt_info *bt)
- FREEBUF(stackbuf);
- return TRUE;
- }
-- if ((*ptr >= ms->crash_save_cpu_start) && (*ptr < ms->crash_save_cpu_end)) {
-+ if ((*ptr > ms->crash_save_cpu_start) && (*ptr < ms->crash_save_cpu_end)) {
- bt->bptr = ((ulong)ptr - (ulong)base) + stackbase;
- if (CRASHDEBUG(1))
- fprintf(fp, "%lx: %lx (crash_save_cpu on IRQ stack)\n",
---
-2.37.1
-
diff --git a/0003-Fix-kmem-v-option-displaying-no-regions-on-Linux-6.3.patch b/0003-Fix-kmem-v-option-displaying-no-regions-on-Linux-6.3.patch
new file mode 100644
index 0000000..8d9a657
--- /dev/null
+++ b/0003-Fix-kmem-v-option-displaying-no-regions-on-Linux-6.3.patch
@@ -0,0 +1,86 @@
+From 342cf340ed0386880fe2a3115d6bef32eabb511b Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Date: Thu, 18 May 2023 11:48:28 +0900
+Subject: [PATCH 03/13] Fix "kmem -v" option displaying no regions on Linux 6.3
+ and later
+
+Kernel commit 869176a09606 ("mm/vmalloc.c: add flags to mark vm_map_ram
+area"), which is contained in Linux 6.3 and later, added "flags" member
+to struct vmap_area. This was the revival of the "flags" member as
+kernel commit 688fcbfc06e4 had eliminated it before.
+
+As a result, crash started to use the old procedure using the member and
+displays no vmalloc'd regions, because it does not have the same flag
+value as the old one.
+
+ crash> kmem -v
+ VMAP_AREA VM_STRUCT ADDRESS RANGE SIZE
+ crash>
+
+To fix this, also check if vmap_area.purge_list exists, which was
+introduced with the flags and removed later, to determine that the flags
+member is the old one.
+
+Related vmap_area history:
+ v2.6.28 db64fe02258f introduced vmap_area with flags and purge_list
+ v5.4 688fcbfc06e4 removed flags
+ v5.11 96e2db456135 removed purge_list
+ v6.3 869176a09606 added flags again
+
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 1 +
+ memory.c | 4 +++-
+ symbols.c | 1 +
+ 3 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/defs.h b/defs.h
+index 21cc760444d1..bfa07c3f5150 100644
+--- a/defs.h
++++ b/defs.h
+@@ -2216,6 +2216,7 @@ struct offset_table { /* stash of commonly-used offsets */
+ long in6_addr_in6_u;
+ long kset_kobj;
+ long subsys_private_subsys;
++ long vmap_area_purge_list;
+ };
+
+ struct size_table { /* stash of commonly-used sizes */
+diff --git a/memory.c b/memory.c
+index 953fc380c03c..15fa8b2f08f1 100644
+--- a/memory.c
++++ b/memory.c
+@@ -429,6 +429,7 @@ vm_init(void)
+ MEMBER_OFFSET_INIT(vmap_area_vm, "vmap_area", "vm");
+ if (INVALID_MEMBER(vmap_area_vm))
+ MEMBER_OFFSET_INIT(vmap_area_vm, "vmap_area", "private");
++ MEMBER_OFFSET_INIT(vmap_area_purge_list, "vmap_area", "purge_list");
+ STRUCT_SIZE_INIT(vmap_area, "vmap_area");
+ if (VALID_MEMBER(vmap_area_va_start) &&
+ VALID_MEMBER(vmap_area_va_end) &&
+@@ -9063,7 +9064,8 @@ dump_vmap_area(struct meminfo *vi)
+ readmem(ld->list_ptr[i], KVADDR, vmap_area_buf,
+ SIZE(vmap_area), "vmap_area struct", FAULT_ON_ERROR);
+
+- if (VALID_MEMBER(vmap_area_flags)) {
++ if (VALID_MEMBER(vmap_area_flags) &&
++ VALID_MEMBER(vmap_area_purge_list)) {
+ flags = ULONG(vmap_area_buf + OFFSET(vmap_area_flags));
+ if (flags != VM_VM_AREA)
+ continue;
+diff --git a/symbols.c b/symbols.c
+index f0721023816d..7b1d59203b90 100644
+--- a/symbols.c
++++ b/symbols.c
+@@ -9169,6 +9169,7 @@ dump_offset_table(char *spec, ulong makestruct)
+ OFFSET(vmap_area_vm));
+ fprintf(fp, " vmap_area_flags: %ld\n",
+ OFFSET(vmap_area_flags));
++ fprintf(fp, " vmap_area_purge_list: %ld\n", OFFSET(vmap_area_purge_list));
+
+ fprintf(fp, " module_size_of_struct: %ld\n",
+ OFFSET(module_size_of_struct));
+--
+2.37.1
+
diff --git a/0003-arm64-handle-vabits_actual-symbol-missing-case.patch b/0003-arm64-handle-vabits_actual-symbol-missing-case.patch
deleted file mode 100644
index 1aea6ff..0000000
--- a/0003-arm64-handle-vabits_actual-symbol-missing-case.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 141e75f3c11cc9342f11418e0bec86877424bef8 Mon Sep 17 00:00:00 2001
-From: Pavankumar Kondeti <quic_pkondeti(a)quicinc.com>
-Date: Thu, 8 Dec 2022 09:55:07 +0530
-Subject: [PATCH 03/28] arm64: handle vabits_actual symbol missing case
-
-After kernel commit 0d9b1ffefabe ("arm64: mm: make vabits_actual
-a build time constant if possible") introduced in Linux v5.19,
-the crash will not find vabits_actual symbol if VA_BITS <= 48.
-Add a fallback option to initialize VA_BITS based on the user
-supplied machdep option.
-
-Tested ramdumps loading in both 6.0 and 5.15 kernels.
-
-Signed-off-by: Pavankumar Kondeti <quic_pkondeti(a)quicinc.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- arm64.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/arm64.c b/arm64.c
-index 7e8a7db1fcc4..56fb841f43f8 100644
---- a/arm64.c
-+++ b/arm64.c
-@@ -4671,6 +4671,10 @@ arm64_calc_VA_BITS(void)
- return;
- } else if (arm64_set_va_bits_by_tcr()) {
- return;
-+ } else if (machdep->machspec->VA_BITS_ACTUAL) {
-+ machdep->machspec->VA_BITS = machdep->machspec->VA_BITS_ACTUAL;
-+ machdep->machspec->VA_START = _VA_START(machdep->machspec->VA_BITS_ACTUAL);
-+ return;
- }
-
- if (!(sp = symbol_search("swapper_pg_dir")) &&
---
-2.37.1
-
diff --git a/0004-EPPIC-extension-support-for-crash-8.x-gdb-10.x.patch b/0004-EPPIC-extension-support-for-crash-8.x-gdb-10.x.patch
deleted file mode 100644
index 18107d1..0000000
--- a/0004-EPPIC-extension-support-for-crash-8.x-gdb-10.x.patch
+++ /dev/null
@@ -1,479 +0,0 @@
-From 2f1085df4dc9c197be9a7a6828a381785058c7b7 Mon Sep 17 00:00:00 2001
-From: Luc Chouinard <lucchouina(a)gmail.com>
-Date: Fri, 9 Dec 2022 11:19:17 -0800
-Subject: [PATCH 04/28] EPPIC extension support for crash-8.x + gdb-10.x
-
-The previous version of the interface between eppic and crash/gdb was
-messy and not portable. This new version uses a clean interface with
-execution through the standard gnu_request and gdb command funnel.
-
-Signed-off-by: Luc Chouinard <lucchouina(a)gmail.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 20 +++
- extensions/eppic.mk | 80 ++++++------
- gdb-10.2.patch | 302 ++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 364 insertions(+), 38 deletions(-)
-
-diff --git a/defs.h b/defs.h
-index afdcf6c4ac20..67c9df2130a6 100644
---- a/defs.h
-+++ b/defs.h
-@@ -4768,6 +4768,23 @@ static inline unsigned int __const_hweight8(unsigned long w)
-
- #endif /* !GDB_COMMON */
-
-+typedef enum drill_ops_s {
-+ EOP_MEMBER_SIZES,
-+ EOP_MEMBER_NAME,
-+ EOP_POINTER,
-+ EOP_TYPEDEF,
-+ EOP_INT,
-+ EOP_VALUE,
-+ EOP_ARRAY,
-+ EOP_UNION,
-+ EOP_ENUM,
-+ EOP_ENUMVAL,
-+ EOP_STRUCT,
-+ EOP_FUNCTION,
-+ EOP_DONE,
-+ EOP_OOPS
-+} drill_ops_t;
-+
- /*
- * Common request structure for BFD or GDB data or commands.
- */
-@@ -4818,6 +4835,9 @@ struct gnu_request {
- char *member_target_type_name;
- char *member_target_type_tag_name;
- char *type_tag_name;
-+ /* callback function for 3rd party symbol and type (EPPIC for now) */
-+ void *priv;
-+ int (*tcb)(drill_ops_t, struct gnu_request *, const void *, const void *, const void *, const void *);
- };
-
- /*
-diff --git a/extensions/eppic.mk b/extensions/eppic.mk
-index b9c046b710ad..943579346ece 100644
---- a/extensions/eppic.mk
-+++ b/extensions/eppic.mk
-@@ -11,64 +11,68 @@
-
- TARGET_FLAGS = -D$(TARGET)
- ifeq ($(TARGET), PPC64)
-- TARGET_FLAGS += -m64
-+ TARGET_FLAGS += -m64
- endif
- ifeq ($(TARGET), ARM)
-- TARGET_FLAGS += -m32
-+ TARGET_FLAGS += -m32
- endif
- ifeq ($(TARGET), MIPS)
-- TARGET_FLAGS += -m32
-+ TARGET_FLAGS += -m32
- endif
- ifeq ($(TARGET), X86)
-- TARGET_FLAGS += -m32
-+ TARGET_FLAGS += -m32
- endif
-
- APPFILE=eppic/applications/crash/eppic.c
- GIT := $(shell which git 2> /dev/null)
-+# crash 8 with gdb 10 uses new third party callback (tcb) API
-+EPPIC_BRANCH=v5.0
-
- all:
-- @if [ -f /usr/bin/flex ] && [ -f /usr/bin/bison ]; then \
-- if [ -f ../$(GDB)/crash.target ]; \
-- then \
-- if [ ! -f $(APPFILE) ]; \
-- then \
-- if [ -f "$(GIT)" ]; \
-- then \
-- if [ -n "$(EPPIC_GIT_URL)" ]; then \
-- git clone $(EPPIC_GIT_OPTIONS) $(EPPIC_GIT_URL) eppic; \
-- else \
-- if ping -c 1 -W 5 github.com >/dev/null ; then \
-- git clone $(EPPIC_GIT_OPTIONS) https://github.com/lucchouina/eppic.git eppic; \
-- fi; \
-- fi; \
-- else \
-- if [ ! -f "$(GIT)" ]; then \
-- echo "eppic.so: git command is needed for pulling eppic extension code"; \
-- fi; \
-- fi; \
-- fi; \
-- if [ -f $(APPFILE) ]; \
-- then \
-- make -f eppic.mk eppic.so; \
-- else \
-- echo "eppic.so: failed to pull eppic code from git repo"; \
-- fi; \
-- else \
-- echo "eppic.so: build failed: requires the crash $(GDB) module"; \
-- fi ;\
-+ @if [ -f /usr/bin/flex ] && [ -f /usr/bin/bison ]; \
-+ then \
-+ if [ -f ../$(GDB)/crash.target ]; \
-+ then \
-+ if [ ! -f $(APPFILE) ]; \
-+ then \
-+ if [ -f "$(GIT)" ]; \
-+ then \
-+ if [ -n "$(EPPIC_GIT_URL)" ]; \
-+ then \
-+ git clone $(EPPIC_GIT_OPTIONS) $(EPPIC_GIT_URL) eppic; \
-+ else \
-+ if ping -c 1 -W 5 github.com >/dev/null ; then \
-+ git clone -b $(EPPIC_BRANCH) $(EPPIC_GIT_OPTIONS) https://github.com/lucchouina/eppic.git eppic; \
-+ fi; \
-+ fi; \
-+ else \
-+ if [ ! -f "$(GIT)" ]; then \
-+ echo "eppic.so: git command is needed for pulling eppic extension code"; \
-+ fi; \
-+ fi; \
-+ fi; \
-+ if [ -f $(APPFILE) ]; \
-+ then \
-+ make -f eppic.mk eppic.so; \
-+ else \
-+ echo "eppic.so: failed to pull eppic code from git repo"; \
-+ fi; \
-+ else \
-+ echo "eppic.so: build failed: requires the crash $(GDB) module"; \
-+ fi ;\
- else \
-- echo "eppic.so: build failed: requires /usr/bin/flex and /usr/bin/bison"; \
-- fi
-+ echo "eppic.so: build failed: requires /usr/bin/flex and /usr/bin/bison"; \
-+ fi
-
- lib-eppic:
- cd eppic/libeppic && make
--
-+
- eppic.so: ../defs.h $(APPFILE) lib-eppic
-- gcc -g -Ieppic/libeppic -I../$(GDB)/gdb -I../$(GDB)/bfd -I../$(GDB)/include -I../$(GDB)/gdb/config -I../$(GDB)/gdb/common -I../$(GDB) -nostartfiles -shared -rdynamic -o eppic.so $(APPFILE) -fPIC $(TARGET_FLAGS) $(GDB_FLAGS) -Leppic/libeppic -leppic
-+ gcc -g -O0 -Ieppic/libeppic -I.. -nostartfiles -shared -rdynamic -o eppic.so $(APPFILE) -fPIC $(TARGET_FLAGS) $(GDB_FLAGS) -Leppic/libeppic -leppic
-
- clean:
- if [ -d eppic/libeppic ]; \
- then \
-- cd eppic/libeppic && make -i clean; \
-+ cd eppic/libeppic && make -i clean; \
- fi
- rm -f eppic.so
-diff --git a/gdb-10.2.patch b/gdb-10.2.patch
-index 91edfb338445..7055f6e0fb0b 100644
---- a/gdb-10.2.patch
-+++ b/gdb-10.2.patch
-@@ -1737,3 +1737,305 @@ exit 0
- struct field *nextfield;
- short nfields;
- struct type *typedef_type, *target_type;
-+--- gdb-10.2/gdb/symtab.c.orig
-++++ gdb-10.2/gdb/symtab.c
-+@@ -6913,7 +6913,7 @@
-+ #include "../../defs.h"
-+
-+ static void get_member_data(struct gnu_request *, struct type *, long, int);
-+-static void dump_enum(struct type *, struct gnu_request *);
-++static void walk_enum(struct type *, struct gnu_request *);
-+ static void eval_enum(struct type *, struct gnu_request *);
-+ static void gdb_get_line_number(struct gnu_request *);
-+ static void gdb_get_datatype(struct gnu_request *);
-+@@ -7122,6 +7122,79 @@
-+
-+
-+ /*
-++ * Follow the type linkage for full member and value type resolution, with callback
-++ */
-++static void drillDownType(struct gnu_request *req, struct type *type)
-++{
-++ while (type)
-++ {
-++ /* check out for stub types and pull in the definition instead */
-++ if (TYPE_STUB(type) && TYPE_TAG_NAME(type)) {
-++ struct symbol *sym;
-++ sym = lookup_symbol(TYPE_TAG_NAME(type), 0, STRUCT_DOMAIN, 0).symbol;
-++ if (sym)
-++ type = sym->type;
-++ }
-++ switch (TYPE_CODE(type)) {
-++ drill_ops_t op;
-++ long l1, l2;
-++ int typecode;
-++
-++ case TYPE_CODE_PTR:
-++ req->tcb(EOP_POINTER, req, 0, 0, 0, 0);
-++ break;
-++
-++ case TYPE_CODE_TYPEDEF:
-++ req->is_typedef = 1;
-++ req->typecode = TYPE_CODE(type);
-++ if (!req->tcb(EOP_TYPEDEF, req, TYPE_NAME(type), 0, 0, 0))
-++ return;
-++ break;
-++
-++ case TYPE_CODE_FUNC:
-++ req->tcb(EOP_FUNCTION, req, 0, 0, 0, 0);
-++ break;
-++
-++ case TYPE_CODE_ARRAY:
-++ l1 = TYPE_LENGTH (type);
-++ l2 = TYPE_LENGTH (check_typedef(TYPE_TARGET_TYPE (type)));
-++ req->tcb(EOP_ARRAY, req, &l1, &l2, 0, 0);
-++ break;
-++
-++ case TYPE_CODE_VOID:
-++ case TYPE_CODE_INT:
-++ case TYPE_CODE_BOOL:
-++ l1 = TYPE_LENGTH(type);
-++ req->tcb(EOP_INT, req, &l1, 0, 0, 0);
-++ break;
-++
-++ case TYPE_CODE_UNION:
-++ op = EOP_UNION;
-++ goto label;
-++
-++ case TYPE_CODE_ENUM:
-++ op = EOP_ENUM;
-++ goto label;
-++
-++ case TYPE_CODE_STRUCT:
-++ op = EOP_STRUCT;
-++ goto label;
-++
-++ default:
-++ typecode = TYPE_CODE(type);
-++ req->tcb(EOP_OOPS, req, &typecode, "Unknown typecode", 0, 0);
-++ return; /* not reached */
-++
-++ label:
-++ l1 = TYPE_LENGTH(type);
-++ req->tcb(op, req, &l1, type, TYPE_TAG_NAME(type), 0);
-++ }
-++ type = TYPE_TARGET_TYPE(type);
-++ }
-++ req->tcb(EOP_DONE, req, 0, 0, 0, 0);
-++}
-++
-++/*
-+ * General purpose routine for determining datatypes.
-+ */
-+
-+@@ -7149,10 +7222,8 @@
-+ if (req->member)
-+ get_member_data(req, sym->type, 0, 1);
-+
-+- if (TYPE_CODE(sym->type) == TYPE_CODE_ENUM) {
-+- if (req->flags & GNU_PRINT_ENUMERATORS)
-+- dump_enum(sym->type, req);
-+- }
-++ if (TYPE_CODE(sym->type) == TYPE_CODE_ENUM)
-++ walk_enum(sym->type, req);
-+
-+ return;
-+ }
-+@@ -7172,17 +7243,25 @@
-+ if (gdb_CRASHDEBUG(2))
-+ console("expr->elts[0].opcode: OP_VAR_VALUE\n");
-+ type = expr.get()->elts[2].symbol->type;
-+- if (req->flags & GNU_VAR_LENGTH_TYPECODE) {
-++ if (req->tcb) {
-++ long value = SYMBOL_VALUE(expr->elts[2].symbol);
-++ /* callback with symbol value */
-+ req->typecode = TYPE_CODE(type);
-+- req->length = TYPE_LENGTH(type);
-+- }
-+- if (TYPE_CODE(type) == TYPE_CODE_ENUM) {
-+- req->typecode = TYPE_CODE(type);
-+- req->value = SYMBOL_VALUE(expr.get()->elts[2].symbol);
-+- req->tagname = (char *)TYPE_TAG_NAME(type);
-+- if (!req->tagname) {
-+- val = evaluate_type(expr.get());
-+- eval_enum(value_type(val), req);
-++ req->tcb(EOP_VALUE, req, &value, 0, 0, 0);
-++ drillDownType(req, type);
-++ } else {
-++ if (req->flags & GNU_VAR_LENGTH_TYPECODE) {
-++ req->typecode = TYPE_CODE(type);
-++ req->length = TYPE_LENGTH(type);
-++ }
-++ if (TYPE_CODE(type) == TYPE_CODE_ENUM) {
-++ req->typecode = TYPE_CODE(type);
-++ req->value = SYMBOL_VALUE(expr->elts[2].symbol);
-++ req->tagname = (char *)TYPE_TAG_NAME(type);
-++ if (!req->tagname) {
-++ val = evaluate_type(expr.get());
-++ eval_enum(value_type(val), req);
-++ }
-+ }
-+ }
-+ break;
-+@@ -7192,26 +7271,21 @@
-+ console("expr->elts[0].opcode: OP_TYPE\n");
-+ type = expr.get()->elts[1].type;
-+
-+- req->typecode = TYPE_CODE(type);
-+- req->length = TYPE_LENGTH(type);
-+-
-+- if (TYPE_CODE(type) == TYPE_CODE_TYPEDEF) {
-+- req->is_typedef = TYPE_CODE_TYPEDEF;
-+- if ((typedef_type = check_typedef(type))) {
-+- req->typecode = TYPE_CODE(typedef_type);
-+- req->length = TYPE_LENGTH(typedef_type);
-+- type = typedef_type;
-+- }
-+- }
-+-
-+- if (TYPE_CODE(type) == TYPE_CODE_ENUM) {
-+- if (req->is_typedef)
-+- if (req->flags & GNU_PRINT_ENUMERATORS) {
-+- if (req->is_typedef)
-+- fprintf_filtered(gdb_stdout,
-+- "typedef ");
-+- dump_enum(type, req);
-++ if (req->tcb) {
-++ drillDownType(req, type);
-++ } else {
-++ req->typecode = TYPE_CODE(type);
-++ req->length = TYPE_LENGTH(type);
-++ if (TYPE_CODE(type) == TYPE_CODE_TYPEDEF) {
-++ req->is_typedef = TYPE_CODE_TYPEDEF;
-++ if ((typedef_type = check_typedef(type))) {
-++ req->typecode = TYPE_CODE(typedef_type);
-++ req->length = TYPE_LENGTH(typedef_type);
-++ type = typedef_type;
-++ }
-+ }
-++ if (TYPE_CODE(type) == TYPE_CODE_ENUM)
-++ walk_enum(type, req);
-+ }
-+
-+ if (req->member)
-+@@ -7233,36 +7307,38 @@
-+ * identifier, each on its own line.
-+ */
-+ static void
-+-dump_enum(struct type *type, struct gnu_request *req)
-++walk_enum(struct type *type, struct gnu_request *req)
-+ {
-+ int i;
-+- int len;
-++ int len, print = (req->flags & GNU_PRINT_ENUMERATORS);
-+ long long lastval;
-+
-+- len = TYPE_NFIELDS (type);
-+- lastval = 0;
-+- if (TYPE_TAG_NAME(type))
-+- fprintf_filtered(gdb_stdout,
-+- "enum %s {\n", TYPE_TAG_NAME (type));
-+- else
-+- fprintf_filtered(gdb_stdout, "enum {\n");
-++ if (print) {
-++ if (req->is_typedef)
-++ fprintf_filtered(gdb_stdout, "typedef ");
-++ if (TYPE_TAG_NAME(type))
-++ fprintf_filtered(gdb_stdout, "enum %s {\n", TYPE_TAG_NAME (type));
-++ else
-++ fprintf_filtered(gdb_stdout, "enum {\n");
-++ }
-+
-++ len = TYPE_NFIELDS (type);
-+ for (i = 0; i < len; i++) {
-+- fprintf_filtered(gdb_stdout, " %s",
-+- TYPE_FIELD_NAME (type, i));
-+- if (lastval != TYPE_FIELD_ENUMVAL (type, i)) {
-+- fprintf_filtered (gdb_stdout, " = %s",
-+- plongest(TYPE_FIELD_ENUMVAL (type, i)));
-+- lastval = TYPE_FIELD_ENUMVAL (type, i);
-+- } else
-++ if (print)
-++ fprintf_filtered(gdb_stdout, " %s", TYPE_FIELD_NAME (type, i));
-++ lastval = TYPE_FIELD_ENUMVAL (type, i);
-++ if (print) {
-+ fprintf_filtered(gdb_stdout, " = %s", plongest(lastval));
-+- fprintf_filtered(gdb_stdout, "\n");
-+- lastval++;
-++ fprintf_filtered(gdb_stdout, "\n");
-++ } else if (req->tcb)
-++ req->tcb(EOP_ENUMVAL, req, TYPE_FIELD_NAME (type, i), &lastval, 0, 0);
-++ }
-++ if (print) {
-++ if (TYPE_TAG_NAME(type))
-++ fprintf_filtered(gdb_stdout, "};\n");
-++ else
-++ fprintf_filtered(gdb_stdout, "} %s;\n", req->name);
-+ }
-+- if (TYPE_TAG_NAME(type))
-+- fprintf_filtered(gdb_stdout, "};\n");
-+- else
-+- fprintf_filtered(gdb_stdout, "} %s;\n", req->name);
-+ }
-+
-+ /*
-+@@ -7320,26 +7396,43 @@
-+ }
-+
-+ for (i = 0; i < nfields; i++) {
-+- if (STREQ(req->member, nextfield->name)) {
-+- req->member_offset = offset + nextfield->loc.bitpos;
-+- req->member_length = TYPE_LENGTH(nextfield->type());
-+- req->member_typecode = TYPE_CODE(nextfield->type());
-+- req->member_main_type_name = (char *)TYPE_NAME(nextfield->type());
-+- req->member_main_type_tag_name = (char *)TYPE_TAG_NAME(nextfield->type());
-+- target_type = TYPE_TARGET_TYPE(nextfield->type());
-+- if (target_type) {
-+- req->member_target_type_name = (char *)TYPE_NAME(target_type);
-+- req->member_target_type_tag_name = (char *)TYPE_TAG_NAME(target_type);
-+- }
-+- if ((req->member_typecode == TYPE_CODE_TYPEDEF) &&
-+- (typedef_type = check_typedef(nextfield->type())))
-+- req->member_length = TYPE_LENGTH(typedef_type);
-+- return;
-+- } else if (*nextfield->name == 0) { /* Anonymous struct/union */
-++ if (*nextfield->name == 0) { /* Anonymous struct/union */
-+ get_member_data(req, nextfield->type(),
-+ offset + nextfield->loc.bitpos, 0);
-+ if (req->member_offset != -1)
-+ return;
-++ } else {
-++ /* callback may be just looking for a specific member name */
-++ if (req->tcb) {
-++ if (req->tcb(EOP_MEMBER_NAME, req, nextfield->name, 0, 0, 0)) {
-++ long bitpos = FIELD_BITPOS(*nextfield);
-++ long bitsize = FIELD_BITSIZE(*nextfield);
-++ long len = TYPE_LENGTH(nextfield->type());
-++ long byteOffset;
-++ offset += nextfield->loc.bitpos;
-++ byteOffset = offset/8;
-++ console("EOP_MEMBER_SIZES\n");
-++ req->tcb(EOP_MEMBER_SIZES, req, &byteOffset, &len, &bitpos, &bitsize);
-++ /* callback with full type info */
-++ drillDownType(req, nextfield->type());
-++ }
-++ } else if (STREQ(req->member, nextfield->name)) {
-++ req->member_offset = offset + nextfield->loc.bitpos;
-++ req->member_length = TYPE_LENGTH(nextfield->type());
-++ req->member_typecode = TYPE_CODE(nextfield->type());
-++ req->member_main_type_name = (char *)TYPE_NAME(nextfield->type());
-++ req->member_main_type_tag_name = (char *)TYPE_TAG_NAME(nextfield->type());
-++ target_type = TYPE_TARGET_TYPE(nextfield->type());
-++ if (target_type) {
-++ req->member_target_type_name = (char *)TYPE_NAME(target_type);
-++ req->member_target_type_tag_name = (char *)TYPE_TAG_NAME(target_type);
-++ }
-++ if ((req->member_typecode == TYPE_CODE_TYPEDEF) &&
-++ (typedef_type = check_typedef(nextfield->type()))) {
-++ req->member_length = TYPE_LENGTH(typedef_type);
-++ }
-++ return;
-++ }
-+ }
-+ nextfield++;
-+ }
---
-2.37.1
-
diff --git a/0004-arm64-x86_64-Enhance-vtop-command-to-show-zero_pfn-i.patch b/0004-arm64-x86_64-Enhance-vtop-command-to-show-zero_pfn-i.patch
new file mode 100644
index 0000000..55464d3
--- /dev/null
+++ b/0004-arm64-x86_64-Enhance-vtop-command-to-show-zero_pfn-i.patch
@@ -0,0 +1,225 @@
+From a0eceb041dfa248d66f9f9a455106184b7823bec Mon Sep 17 00:00:00 2001
+From: Rongwei Wang <rongwei.wang(a)linux.alibaba.com>
+Date: Mon, 29 May 2023 19:55:51 +0800
+Subject: [PATCH 04/13] arm64/x86_64: Enhance "vtop" command to show zero_pfn
+ information
+
+Enhance the "vtop" command to show "ZERO PAGE" information when PTE or
+PMD has attached to {huge_}zero_pfn. For example:
+
+ crash> vtop -c 13674 ffff8917e000
+ VIRTUAL PHYSICAL
+ ffff8917e000 836e71000
+
+ PAGE DIRECTORY: ffff000802f8d000
+ PGD: ffff000802f8dff8 => 884e29003
+ PUD: ffff000844e29ff0 => 884e93003
+ PMD: ffff000844e93240 => 840413003
+ PTE: ffff000800413bf0 => 160000836e71fc3
+ PAGE: 836e71000 (ZERO PAGE)
+ ...
+
+Hugepage case:
+ crash> vtop -c 14538 ffff95800000
+ VIRTUAL PHYSICAL
+ ffff95800000 910c00000
+
+ PAGE DIRECTORY: ffff000801fa0000
+ PGD: ffff000801fa0ff8 => 884f53003
+ PUD: ffff000844f53ff0 => 8426cb003
+ PMD: ffff0008026cb560 => 60000910c00fc1
+ PAGE: 910c00000 (2MB, ZERO PAGE)
+ ...
+
+Note that
+1. support displaying zero page only for THP (except for 1G THP)
+2. do not support hugetlb cases.
+
+Signed-off-by: Rongwei Wang <rongwei.wang(a)linux.alibaba.com>
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ arm64.c | 24 ++++++++++++++++--------
+ defs.h | 5 +++++
+ memory.c | 23 +++++++++++++++++++++++
+ x86_64.c | 9 +++++----
+ 4 files changed, 49 insertions(+), 12 deletions(-)
+
+diff --git a/arm64.c b/arm64.c
+index 56fb841f43f8..efbdccbec9d3 100644
+--- a/arm64.c
++++ b/arm64.c
+@@ -1787,7 +1787,8 @@ arm64_vtop_2level_64k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if ((pgd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
+ ulong sectionbase = (pgd_val & SECTION_PAGE_MASK_512MB) & PHYS_MASK;
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx (512MB)\n\n", sectionbase);
++ fprintf(fp, " PAGE: %lx (512MB%s)\n\n", sectionbase,
++ IS_ZEROPAGE(sectionbase) ? ", ZERO PAGE" : "");
+ arm64_translate_pte(pgd_val, 0, 0);
+ }
+ *paddr = sectionbase + (vaddr & ~SECTION_PAGE_MASK_512MB);
+@@ -1806,7 +1807,8 @@ arm64_vtop_2level_64k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if (pte_val & PTE_VALID) {
+ *paddr = (PAGEBASE(pte_val) & PHYS_MASK) + PAGEOFFSET(vaddr);
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(*paddr));
++ fprintf(fp, " PAGE: %lx %s\n\n", PAGEBASE(*paddr),
++ IS_ZEROPAGE(PAGEBASE(*paddr)) ? "(ZERO PAGE)" : "");
+ arm64_translate_pte(pte_val, 0, 0);
+ }
+ } else {
+@@ -1859,7 +1861,8 @@ arm64_vtop_3level_64k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if ((pmd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
+ ulong sectionbase = PTE_TO_PHYS(pmd_val) & SECTION_PAGE_MASK_512MB;
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx (512MB)\n\n", sectionbase);
++ fprintf(fp, " PAGE: %lx (512MB%s)\n\n", sectionbase,
++ IS_ZEROPAGE(sectionbase) ? ", ZERO PAGE" : "");
+ arm64_translate_pte(pmd_val, 0, 0);
+ }
+ *paddr = sectionbase + (vaddr & ~SECTION_PAGE_MASK_512MB);
+@@ -1878,7 +1881,8 @@ arm64_vtop_3level_64k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if (pte_val & PTE_VALID) {
+ *paddr = PTE_TO_PHYS(pte_val) + PAGEOFFSET(vaddr);
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(*paddr));
++ fprintf(fp, " PAGE: %lx %s\n\n", PAGEBASE(*paddr),
++ IS_ZEROPAGE(PAGEBASE(*paddr)) ? "(ZERO PAGE)" : "");
+ arm64_translate_pte(pte_val, 0, 0);
+ }
+ } else {
+@@ -1940,7 +1944,8 @@ arm64_vtop_3level_4k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if ((pmd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
+ ulong sectionbase = (pmd_val & SECTION_PAGE_MASK_2MB) & PHYS_MASK;
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx (2MB)\n\n", sectionbase);
++ fprintf(fp, " PAGE: %lx (2MB%s)\n\n", sectionbase,
++ IS_ZEROPAGE(sectionbase) ? ", ZERO PAGE" : "");
+ arm64_translate_pte(pmd_val, 0, 0);
+ }
+ *paddr = sectionbase + (vaddr & ~SECTION_PAGE_MASK_2MB);
+@@ -1959,7 +1964,8 @@ arm64_vtop_3level_4k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if (pte_val & PTE_VALID) {
+ *paddr = (PAGEBASE(pte_val) & PHYS_MASK) + PAGEOFFSET(vaddr);
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(*paddr));
++ fprintf(fp, " PAGE: %lx %s\n\n", PAGEBASE(*paddr),
++ IS_ZEROPAGE(PAGEBASE(*paddr)) ? "(ZERO PAGE)" : "");
+ arm64_translate_pte(pte_val, 0, 0);
+ }
+ } else {
+@@ -2029,7 +2035,8 @@ arm64_vtop_4level_4k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if ((pmd_val & PMD_TYPE_MASK) == PMD_TYPE_SECT) {
+ ulong sectionbase = (pmd_val & SECTION_PAGE_MASK_2MB) & PHYS_MASK;
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx (2MB)\n\n", sectionbase);
++ fprintf(fp, " PAGE: %lx (2MB%s)\n\n", sectionbase,
++ IS_ZEROPAGE(sectionbase) ? ", ZERO PAGE" : "");
+ arm64_translate_pte(pmd_val, 0, 0);
+ }
+ *paddr = sectionbase + (vaddr & ~SECTION_PAGE_MASK_2MB);
+@@ -2048,7 +2055,8 @@ arm64_vtop_4level_4k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose)
+ if (pte_val & PTE_VALID) {
+ *paddr = (PAGEBASE(pte_val) & PHYS_MASK) + PAGEOFFSET(vaddr);
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(*paddr));
++ fprintf(fp, " PAGE: %lx %s\n\n", PAGEBASE(*paddr),
++ IS_ZEROPAGE(PAGEBASE(*paddr)) ? "(ZERO PAGE)" : "");
+ arm64_translate_pte(pte_val, 0, 0);
+ }
+ } else {
+diff --git a/defs.h b/defs.h
+index bfa07c3f5150..7d8bb8ab3de1 100644
+--- a/defs.h
++++ b/defs.h
+@@ -2619,6 +2619,8 @@ struct vm_table { /* kernel VM-related data */
+ char *name;
+ } *pageflags_data;
+ ulong max_mem_section_nr;
++ ulong zero_paddr;
++ ulong huge_zero_paddr;
+ };
+
+ #define NODES (0x1)
+@@ -3000,6 +3002,9 @@ struct load_module {
+ #define VIRTPAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask)
+ #define PHYSPAGEBASE(X) (((physaddr_t)(X)) & (physaddr_t)machdep->pagemask)
+
++#define IS_ZEROPAGE(paddr) ((paddr) == vt->zero_paddr || \
++ (paddr) == vt->huge_zero_paddr)
++
+ /*
+ * Sparse memory stuff
+ * These must follow the definitions in the kernel mmzone.h
+diff --git a/memory.c b/memory.c
+index 15fa8b2f08f1..ea3005a5c01f 100644
+--- a/memory.c
++++ b/memory.c
+@@ -1209,6 +1209,27 @@ vm_init(void)
+ machdep->memory_size()));
+ vt->paddr_prlen = strlen(buf);
+
++ vt->zero_paddr = ~0UL;
++ if (kernel_symbol_exists("zero_pfn")) {
++ ulong zero_pfn;
++
++ if (readmem(symbol_value("zero_pfn"), KVADDR,
++ &zero_pfn, sizeof(zero_pfn),
++ "read zero_pfn", QUIET|RETURN_ON_ERROR))
++ vt->zero_paddr = zero_pfn << PAGESHIFT();
++ }
++
++ vt->huge_zero_paddr = ~0UL;
++ if (kernel_symbol_exists("huge_zero_pfn")) {
++ ulong huge_zero_pfn;
++
++ if (readmem(symbol_value("huge_zero_pfn"), KVADDR,
++ &huge_zero_pfn, sizeof(huge_zero_pfn),
++ "read huge_zero_pfn", QUIET|RETURN_ON_ERROR) &&
++ huge_zero_pfn != ~0UL)
++ vt->huge_zero_paddr = huge_zero_pfn << PAGESHIFT();
++ }
++
+ if (vt->flags & PERCPU_KMALLOC_V1)
+ vt->dump_kmem_cache = dump_kmem_cache_percpu_v1;
+ else if (vt->flags & PERCPU_KMALLOC_V2)
+@@ -14065,6 +14086,8 @@ dump_vm_table(int verbose)
+ } else {
+ fprintf(fp, " node_online_map: (unused)\n");
+ }
++ fprintf(fp, " zero_paddr: %lx\n", vt->zero_paddr);
++ fprintf(fp, " huge_zero_paddr: %lx\n", vt->huge_zero_paddr);
+ fprintf(fp, " nr_vm_stat_items: %d\n", vt->nr_vm_stat_items);
+ fprintf(fp, " vm_stat_items: %s", (vt->flags & VM_STAT) ?
+ "\n" : "(not used)\n");
+diff --git a/x86_64.c b/x86_64.c
+index 5019c69e452e..693a08bea758 100644
+--- a/x86_64.c
++++ b/x86_64.c
+@@ -2114,8 +2114,9 @@ x86_64_uvtop_level4(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, in
+ goto no_upage;
+ if (pmd_pte & _PAGE_PSE) {
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx (2MB)\n\n",
+- PAGEBASE(pmd_pte) & PHYSICAL_PAGE_MASK);
++ fprintf(fp, " PAGE: %lx (2MB%s)\n\n",
++ PAGEBASE(pmd_pte) & PHYSICAL_PAGE_MASK,
++ IS_ZEROPAGE(PAGEBASE(pmd_pte) & PHYSICAL_PAGE_MASK) ? ", ZERO PAGE" : "");
+ x86_64_translate_pte(pmd_pte, 0, 0);
+ }
+
+@@ -2143,8 +2144,8 @@ x86_64_uvtop_level4(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, in
+ *paddr = (PAGEBASE(pte) & PHYSICAL_PAGE_MASK) + PAGEOFFSET(uvaddr);
+
+ if (verbose) {
+- fprintf(fp, " PAGE: %lx\n\n",
+- PAGEBASE(*paddr) & PHYSICAL_PAGE_MASK);
++ fprintf(fp, " PAGE: %lx %s\n\n", PAGEBASE(*paddr) & PHYSICAL_PAGE_MASK,
++ IS_ZEROPAGE(PAGEBASE(*paddr) & PHYSICAL_PAGE_MASK) ? "(ZERO PAGE)" : "");
+ x86_64_translate_pte(pte, 0, 0);
+ }
+
+--
+2.37.1
+
diff --git a/0005-diskdump-netdump-fix-segmentation-fault-caused-by-fa.patch b/0005-diskdump-netdump-fix-segmentation-fault-caused-by-fa.patch
new file mode 100644
index 0000000..e9e9dd0
--- /dev/null
+++ b/0005-diskdump-netdump-fix-segmentation-fault-caused-by-fa.patch
@@ -0,0 +1,165 @@
+From db8c030857b4e318728c51c20da687906c109d0d Mon Sep 17 00:00:00 2001
+From: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Date: Tue, 30 May 2023 19:38:34 +0900
+Subject: [PATCH 05/13] diskdump/netdump: fix segmentation fault caused by
+ failure of stopping CPUs
+
+There's no NMI on ARM. Hence, stopping the non-panicking CPUs from the
+panicking CPU via IPI can fail easily if interrupts are being masked
+in those moment. Moreover, crash_notes are not initialized for such
+unstopped CPUs and the corresponding NT_PRSTATUS notes are not
+attached to vmcore. However, crash utility never takes it
+consideration such uninitialized crash_notes and then ends with
+mapping different NT_PRSTATUS to actually unstopped CPUs. This corrupt
+mapping can result crash utility into segmentation fault in the
+operations where register values in NT_PRSTATUS notes are used.
+
+For example:
+
+ crash> bt 1408
+ PID: 1408 TASK: ffff000003e22200 CPU: 2 COMMAND: "repro"
+ Segmentation fault (core dumped)
+
+ crash> help -D
+ diskdump_data:
+ filename: 127.0.0.1-2023-05-26-02:21:27/vmcore-ld1
+ flags: 46 (KDUMP_CMPRS_LOCAL|ERROR_EXCLUDED|LZO_SUPPORTED)
+ ...snip...
+ notes_buf: 1815df0
+ num_vmcoredd_notes: 0
+ num_prstatus_notes: 5
+ notes[0]: 1815df0 (NT_PRSTATUS)
+ si.signo: 0 si.code: 0 si.errno: 0
+ ...snip...
+ PSTATE: 80400005 FPVALID: 00000000
+ notes[4]: 1808f10 (NT_PRSTATUS)
+ Segmentation fault (core dumped)
+
+To fix this issue, let's map NT_PRSTATUS to some CPU only if the
+corresponding crash_notes is checked to be initialized.
+
+[ kh: moved existence check for crash_notes out of the loop ]
+
+Signed-off-by: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 1 +
+ diskdump.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
+ netdump.c | 7 ++++++-
+ 3 files changed, 51 insertions(+), 2 deletions(-)
+
+diff --git a/defs.h b/defs.h
+index 7d8bb8ab3de1..6520d2f13f48 100644
+--- a/defs.h
++++ b/defs.h
+@@ -7118,6 +7118,7 @@ int dumpfile_is_split(void);
+ void show_split_dumpfiles(void);
+ void x86_process_elf_notes(void *, unsigned long);
+ void *diskdump_get_prstatus_percpu(int);
++int have_crash_notes(int cpu);
+ void map_cpus_to_prstatus_kdump_cmprs(void);
+ void diskdump_display_regs(int, FILE *);
+ void process_elf32_notes(void *, ulong);
+diff --git a/diskdump.c b/diskdump.c
+index 94bca4ded572..2c284ff3f97f 100644
+--- a/diskdump.c
++++ b/diskdump.c
+@@ -101,12 +101,54 @@ int dumpfile_is_split(void)
+ return KDUMP_SPLIT();
+ }
+
++int have_crash_notes(int cpu)
++{
++ ulong crash_notes, notes_ptr;
++ char *buf, *p;
++ Elf64_Nhdr *note = NULL;
++
++ if (!readmem(symbol_value("crash_notes"), KVADDR, &crash_notes,
++ sizeof(crash_notes), "crash_notes", RETURN_ON_ERROR)) {
++ error(WARNING, "cannot read \"crash_notes\"\n");
++ return FALSE;
++ }
++
++ if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF))
++ notes_ptr = crash_notes + kt->__per_cpu_offset[cpu];
++ else
++ notes_ptr = crash_notes;
++
++ buf = GETBUF(SIZE(note_buf));
++
++ if (!readmem(notes_ptr, KVADDR, buf,
++ SIZE(note_buf), "note_buf_t", RETURN_ON_ERROR)) {
++ error(WARNING, "cpu %d: cannot read NT_PRSTATUS note\n", cpu);
++ return FALSE;
++ }
++
++ note = (Elf64_Nhdr *)buf;
++ p = buf + sizeof(Elf64_Nhdr);
++
++ if (note->n_type != NT_PRSTATUS) {
++ error(WARNING, "cpu %d: invalid NT_PRSTATUS note (n_type != NT_PRSTATUS)\n", cpu);
++ return FALSE;
++ }
++
++ if (!STRNEQ(p, "CORE")) {
++ error(WARNING, "cpu %d: invalid NT_PRSTATUS note (name != \"CORE\")\n", cpu);
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
+ void
+ map_cpus_to_prstatus_kdump_cmprs(void)
+ {
+ void **nt_ptr;
+ int online, i, j, nrcpus;
+ size_t size;
++ int crash_notes_exists;
+
+ if (pc->flags2 & QEMU_MEM_DUMP_COMPRESSED) /* notes exist for all cpus */
+ goto resize_note_pointers;
+@@ -129,9 +171,10 @@ map_cpus_to_prstatus_kdump_cmprs(void)
+ * Re-populate the array with the notes mapping to online cpus
+ */
+ nrcpus = (kt->kernel_NR_CPUS ? kt->kernel_NR_CPUS : NR_CPUS);
++ crash_notes_exists = kernel_symbol_exists("crash_notes");
+
+ for (i = 0, j = 0; i < nrcpus; i++) {
+- if (in_cpu_map(ONLINE_MAP, i)) {
++ if (in_cpu_map(ONLINE_MAP, i) && (!crash_notes_exists || have_crash_notes(i))) {
+ dd->nt_prstatus_percpu[i] = nt_ptr[j++];
+ dd->num_prstatus_notes =
+ MAX(dd->num_prstatus_notes, i+1);
+diff --git a/netdump.c b/netdump.c
+index 4eba66cecb55..61ddeaa08831 100644
+--- a/netdump.c
++++ b/netdump.c
+@@ -75,6 +75,7 @@ map_cpus_to_prstatus(void)
+ void **nt_ptr;
+ int online, i, j, nrcpus;
+ size_t size;
++ int crash_notes_exists;
+
+ if (pc->flags2 & QEMU_MEM_DUMP_ELF) /* notes exist for all cpus */
+ return;
+@@ -97,10 +98,14 @@ map_cpus_to_prstatus(void)
+ * Re-populate the array with the notes mapping to online cpus
+ */
+ nrcpus = (kt->kernel_NR_CPUS ? kt->kernel_NR_CPUS : NR_CPUS);
++ crash_notes_exists = kernel_symbol_exists("crash_notes");
+
+ for (i = 0, j = 0; i < nrcpus; i++) {
+- if (in_cpu_map(ONLINE_MAP, i))
++ if (in_cpu_map(ONLINE_MAP, i) && (!crash_notes_exists || have_crash_notes(i))) {
+ nd->nt_prstatus_percpu[i] = nt_ptr[j++];
++ nd->num_prstatus_notes =
++ MAX(nd->num_prstatus_notes, i+1);
++ }
+ }
+
+ FREEBUF(nt_ptr);
+--
+2.37.1
+
diff --git a/0005-x86_64-Fix-for-move-of-per-cpu-variables-into-struct.patch b/0005-x86_64-Fix-for-move-of-per-cpu-variables-into-struct.patch
deleted file mode 100644
index cd1fdd5..0000000
--- a/0005-x86_64-Fix-for-move-of-per-cpu-variables-into-struct.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From df1f0cba729fa0e0d8a63220769c42cc9033acc1 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Date: Wed, 7 Dec 2022 09:46:56 +0900
-Subject: [PATCH 05/28] x86_64: Fix for move of per-cpu variables into struct
- pcpu_hot
-
-The following kernel commits, which are contained in Linux 6.2-rc1 and
-later kernels, introduced struct pcpu_hot and moved several per-cpu
-variables into it.
-
- d7b6d709a76a x86/percpu: Move irq_stack variables next to current_task
- 7443b296e699 x86/percpu: Move cpu_number next to current_task
- e57ef2ed97c1 x86: Put hot per CPU variables into a struct
-
-Without the patch, crash fails to start session with the following
-error:
-
- $ crash vmlinux vmcore
- ...
- bt: invalid size request: 0 type: "stack contents"
- bt: read of stack at 0 failed
- <segmentation violation in gdb>
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- x86_64.c | 44 +++++++++++++++++++++++++++++++++-----------
- 1 file changed, 33 insertions(+), 11 deletions(-)
-
-diff --git a/x86_64.c b/x86_64.c
-index 74bd1bbde41c..7a5d6f050c89 100644
---- a/x86_64.c
-+++ b/x86_64.c
-@@ -1290,12 +1290,15 @@ x86_64_per_cpu_init(void)
- {
- int i, cpus, cpunumber;
- struct machine_specific *ms;
-- struct syment *irq_sp, *curr_sp, *cpu_sp, *hardirq_stack_ptr_sp;
-+ struct syment *irq_sp, *curr_sp, *cpu_sp, *hardirq_stack_ptr_sp, *pcpu_sp;
- ulong hardirq_stack_ptr;
- ulong __per_cpu_load = 0;
-+ long hardirq_addr = 0, cpu_addr = 0, curr_addr = 0;
-
- ms = machdep->machspec;
-
-+ pcpu_sp = per_cpu_symbol_search("pcpu_hot");
-+
- hardirq_stack_ptr_sp = per_cpu_symbol_search("hardirq_stack_ptr");
- irq_sp = per_cpu_symbol_search("per_cpu__irq_stack_union");
- cpu_sp = per_cpu_symbol_search("per_cpu__cpu_number");
-@@ -1324,7 +1327,7 @@ x86_64_per_cpu_init(void)
- return;
- }
-
-- if (!cpu_sp || (!irq_sp && !hardirq_stack_ptr_sp))
-+ if (!pcpu_sp && (!cpu_sp || (!irq_sp && !hardirq_stack_ptr_sp)))
- return;
-
- if (MEMBER_EXISTS("irq_stack_union", "irq_stack"))
-@@ -1337,10 +1340,21 @@ x86_64_per_cpu_init(void)
- if (kernel_symbol_exists("__per_cpu_load"))
- __per_cpu_load = symbol_value("__per_cpu_load");
-
-+ if (pcpu_sp) {
-+ hardirq_addr = pcpu_sp->value + MEMBER_OFFSET("pcpu_hot", "hardirq_stack_ptr");
-+ cpu_addr = pcpu_sp->value + MEMBER_OFFSET("pcpu_hot", "cpu_number");
-+ curr_addr = pcpu_sp->value + MEMBER_OFFSET("pcpu_hot", "current_task");
-+ } else {
-+ if (hardirq_stack_ptr_sp)
-+ hardirq_addr = hardirq_stack_ptr_sp->value;
-+ cpu_addr = cpu_sp->value;
-+ curr_addr = curr_sp->value;
-+ }
-+
- for (i = cpus = 0; i < NR_CPUS; i++) {
- if (__per_cpu_load && kt->__per_cpu_offset[i] == __per_cpu_load)
- break;
-- if (!readmem(cpu_sp->value + kt->__per_cpu_offset[i],
-+ if (!readmem(cpu_addr + kt->__per_cpu_offset[i],
- KVADDR, &cpunumber, sizeof(int),
- "cpu number (per_cpu)", QUIET|RETURN_ON_ERROR))
- break;
-@@ -1349,8 +1363,8 @@ x86_64_per_cpu_init(void)
- break;
- cpus++;
-
-- if (hardirq_stack_ptr_sp) {
-- if (!readmem(hardirq_stack_ptr_sp->value + kt->__per_cpu_offset[i],
-+ if (pcpu_sp || hardirq_stack_ptr_sp) {
-+ if (!readmem(hardirq_addr + kt->__per_cpu_offset[i],
- KVADDR, &hardirq_stack_ptr, sizeof(void *),
- "hardirq_stack_ptr (per_cpu)", QUIET|RETURN_ON_ERROR))
- continue;
-@@ -1373,13 +1387,13 @@ x86_64_per_cpu_init(void)
- else
- kt->cpus = cpus;
-
-- if (DUMPFILE() && curr_sp) {
-+ if (DUMPFILE() && (pcpu_sp || curr_sp)) {
- if ((ms->current = calloc(kt->cpus, sizeof(ulong))) == NULL)
- error(FATAL,
- "cannot calloc %d x86_64 current pointers!\n",
- kt->cpus);
- for (i = 0; i < kt->cpus; i++)
-- if (!readmem(curr_sp->value + kt->__per_cpu_offset[i],
-+ if (!readmem(curr_addr + kt->__per_cpu_offset[i],
- KVADDR, &ms->current[i], sizeof(ulong),
- "current_task (per_cpu)", RETURN_ON_ERROR))
- continue;
-@@ -5625,11 +5639,19 @@ x86_64_get_smp_cpus(void)
- char *cpu_pda_buf;
- ulong level4_pgt, cpu_pda_addr;
- struct syment *sp;
-- ulong __per_cpu_load = 0;
-+ ulong __per_cpu_load = 0, cpu_addr;
-
- if (!VALID_STRUCT(x8664_pda)) {
-- if (!(sp = per_cpu_symbol_search("per_cpu__cpu_number")) ||
-- !(kt->flags & PER_CPU_OFF))
-+
-+ if (!(kt->flags & PER_CPU_OFF))
-+ return 1;
-+
-+ if ((sp = per_cpu_symbol_search("pcpu_hot")) &&
-+ (cpu_addr = MEMBER_OFFSET("pcpu_hot", "cpu_number")) != INVALID_OFFSET)
-+ cpu_addr += sp->value;
-+ else if ((sp = per_cpu_symbol_search("per_cpu__cpu_number")))
-+ cpu_addr = sp->value;
-+ else
- return 1;
-
- if (kernel_symbol_exists("__per_cpu_load"))
-@@ -5638,7 +5660,7 @@ x86_64_get_smp_cpus(void)
- for (i = cpus = 0; i < NR_CPUS; i++) {
- if (__per_cpu_load && kt->__per_cpu_offset[i] == __per_cpu_load)
- break;
-- if (!readmem(sp->value + kt->__per_cpu_offset[i],
-+ if (!readmem(cpu_addr + kt->__per_cpu_offset[i],
- KVADDR, &cpunumber, sizeof(int),
- "cpu number (per_cpu)", QUIET|RETURN_ON_ERROR))
- break;
---
-2.37.1
-
diff --git a/0006-Fix-for-mm_struct.rss_stat-conversion-into-percpu_co.patch b/0006-Fix-for-mm_struct.rss_stat-conversion-into-percpu_co.patch
deleted file mode 100644
index b35160f..0000000
--- a/0006-Fix-for-mm_struct.rss_stat-conversion-into-percpu_co.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-From f182d08bab202dddf20b742fef6cc2bda0a56d6c Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Date: Thu, 15 Dec 2022 11:31:38 +0900
-Subject: [PATCH 06/28] Fix for mm_struct.rss_stat conversion into
- percpu_counter
-
-Kernel commit f1a7941243c1 ("mm: convert mm's rss stats into
-percpu_counter"), which is contained in Linux 6.2-rc1 and later
-kernels, changed mm_struct.rss_stat from struct mm_rss_stat into an
-array of struct percpu_counter.
-
-Without the patch, "ps" and several commands fail with the following
-error message:
-
- ps: invalid structure member offset: mm_rss_stat_count
- FILE: memory.c LINE: 4724 FUNCTION: get_task_mem_usage()
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 3 +++
- kernel.c | 2 ++
- memory.c | 14 +++++++++++++-
- symbols.c | 6 ++++--
- tools.c | 28 ++++++++++++++++++++++++++++
- 5 files changed, 50 insertions(+), 3 deletions(-)
-
-diff --git a/defs.h b/defs.h
-index 67c9df2130a6..04476b3ff62e 100644
---- a/defs.h
-+++ b/defs.h
-@@ -2181,6 +2181,7 @@ struct offset_table { /* stash of commonly-used offsets */
- long blk_mq_tags_nr_reserved_tags;
- long blk_mq_tags_rqs;
- long request_queue_hctx_table;
-+ long percpu_counter_counters;
- };
-
- struct size_table { /* stash of commonly-used sizes */
-@@ -2351,6 +2352,7 @@ struct size_table { /* stash of commonly-used sizes */
- long sbitmap_queue;
- long sbq_wait_state;
- long blk_mq_tags;
-+ long percpu_counter;
- };
-
- struct array_table {
-@@ -5325,6 +5327,7 @@ struct rb_node *rb_right(struct rb_node *, struct rb_node *);
- struct rb_node *rb_left(struct rb_node *, struct rb_node *);
- struct rb_node *rb_next(struct rb_node *);
- struct rb_node *rb_last(struct rb_root *);
-+long percpu_counter_sum_positive(ulong fbc);
-
- /*
- * symbols.c
-diff --git a/kernel.c b/kernel.c
-index aa030e8097ea..a42e6ad7d78c 100644
---- a/kernel.c
-+++ b/kernel.c
-@@ -316,6 +316,8 @@ kernel_init()
- }
-
- MEMBER_OFFSET_INIT(percpu_counter_count, "percpu_counter", "count");
-+ MEMBER_OFFSET_INIT(percpu_counter_counters, "percpu_counter", "counters");
-+ STRUCT_SIZE_INIT(percpu_counter, "percpu_counter");
-
- if (STRUCT_EXISTS("runqueue")) {
- rqstruct = "runqueue";
-diff --git a/memory.c b/memory.c
-index 9c15c1b745ef..9d003713534b 100644
---- a/memory.c
-+++ b/memory.c
-@@ -4713,7 +4713,7 @@ get_task_mem_usage(ulong task, struct task_mem_usage *tm)
- /*
- * Latest kernels have mm_struct.mm_rss_stat[].
- */
-- if (VALID_MEMBER(mm_struct_rss_stat)) {
-+ if (VALID_MEMBER(mm_struct_rss_stat) && VALID_MEMBER(mm_rss_stat_count)) {
- long anonpages, filepages, count;
-
- anonpages = tt->anonpages;
-@@ -4737,6 +4737,18 @@ get_task_mem_usage(ulong task, struct task_mem_usage *tm)
- (anonpages * sizeof(long)));
- if (count > 0)
- rss += count;
-+
-+ } else if (VALID_MEMBER(mm_struct_rss_stat)) {
-+ /* 6.2: struct percpu_counter rss_stat[NR_MM_COUNTERS] */
-+ ulong fbc;
-+
-+ fbc = tc->mm_struct + OFFSET(mm_struct_rss_stat) +
-+ (tt->filepages * SIZE(percpu_counter));
-+ rss += percpu_counter_sum_positive(fbc);
-+
-+ fbc = tc->mm_struct + OFFSET(mm_struct_rss_stat) +
-+ (tt->anonpages * SIZE(percpu_counter));
-+ rss += percpu_counter_sum_positive(fbc);
- }
-
- /* Check whether SPLIT_RSS_COUNTING is enabled */
-diff --git a/symbols.c b/symbols.c
-index 42c4eb400044..e279cfa68490 100644
---- a/symbols.c
-+++ b/symbols.c
-@@ -10633,8 +10633,8 @@ dump_offset_table(char *spec, ulong makestruct)
- OFFSET(ktime_t_nsec));
- fprintf(fp, " atomic_t_counter: %ld\n",
- OFFSET(atomic_t_counter));
-- fprintf(fp, " percpu_counter_count: %ld\n",
-- OFFSET(percpu_counter_count));
-+ fprintf(fp, " percpu_counter_count: %ld\n", OFFSET(percpu_counter_count));
-+ fprintf(fp, " percpu_counter_counters: %ld\n", OFFSET(percpu_counter_counters));
- fprintf(fp, " sk_buff_head_next: %ld\n",
- OFFSET(sk_buff_head_next));
- fprintf(fp, " sk_buff_head_qlen: %ld\n",
-@@ -11028,6 +11028,8 @@ dump_offset_table(char *spec, ulong makestruct)
- fprintf(fp, " sbq_wait_state: %ld\n", SIZE(sbq_wait_state));
- fprintf(fp, " blk_mq_tags: %ld\n", SIZE(blk_mq_tags));
-
-+ fprintf(fp, " percpu_counter: %ld\n", SIZE(percpu_counter));
-+
- fprintf(fp, "\n array_table:\n");
- /*
- * Use get_array_length() for those fields not set up at init-time;
-diff --git a/tools.c b/tools.c
-index 39306c18c98f..5f86771f5327 100644
---- a/tools.c
-+++ b/tools.c
-@@ -6902,3 +6902,31 @@ rb_last(struct rb_root *root)
-
- return node;
- }
-+
-+long
-+percpu_counter_sum_positive(ulong fbc)
-+{
-+ int i, count;
-+ ulong addr;
-+ long ret;
-+
-+ if (INVALID_MEMBER(percpu_counter_count))
-+ return 0;
-+
-+ readmem(fbc + OFFSET(percpu_counter_count), KVADDR, &ret,
-+ sizeof(long long), "percpu_counter.count", FAULT_ON_ERROR);
-+
-+ if (INVALID_MEMBER(percpu_counter_counters)) /* !CONFIG_SMP */
-+ return (ret < 0) ? 0 : ret;
-+
-+ readmem(fbc + OFFSET(percpu_counter_counters), KVADDR, &addr,
-+ sizeof(void *), "percpu_counter.counters", FAULT_ON_ERROR);
-+
-+ for (i = 0; i < kt->cpus; i++) {
-+ readmem(addr + kt->__per_cpu_offset[i], KVADDR, &count,
-+ sizeof(int), "percpu_counter.counters count", FAULT_ON_ERROR);
-+ ret += count;
-+ }
-+
-+ return (ret < 0) ? 0 : ret;
-+}
---
-2.37.1
-
diff --git a/0006-Fix-segfault-in-arm64_is_kernel_exception_frame-when.patch b/0006-Fix-segfault-in-arm64_is_kernel_exception_frame-when.patch
new file mode 100644
index 0000000..2f62c6b
--- /dev/null
+++ b/0006-Fix-segfault-in-arm64_is_kernel_exception_frame-when.patch
@@ -0,0 +1,62 @@
+From 9868ebc8e648e5791764a51567a23efae7170d9b Mon Sep 17 00:00:00 2001
+From: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Date: Tue, 30 May 2023 19:38:35 +0900
+Subject: [PATCH 06/13] Fix segfault in arm64_is_kernel_exception_frame() when
+ corrupt stack pointer address is given
+
+Due to the corrupted mapping fixed by the previous commit,
+arm64_is_kernel_exception_frame() can receive invalid stack pointer
+address via the 2nd argument; different NT_PRSTATUS contains different
+task's stack pointer address. However, macro STACK_OFFSET_TYPE() never
+checks if a given address is within the range of the kernel stack of
+the corresponding task and hence can result in referring to outside of
+bt->stackbuf.
+
+ static int
+ arm64_is_kernel_exception_frame(struct bt_info *bt, ulong stkptr)
+ {
+ struct arm64_pt_regs *regs;
+ struct machine_specific *ms = machdep->machspec;
+
+ regs = (struct arm64_pt_regs *)&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(stkptr))];
+
+ => if (INSTACK(regs->sp, bt) && INSTACK(regs->regs[29], bt) &&
+ !(regs->pstate & (0xffffffff00000000ULL | PSR_MODE32_BIT)) &&
+ is_kernel_text(regs->pc) &&
+ is_kernel_text(regs->regs[30] | ms->CONFIG_ARM64_KERNELPACMASK)) {
+
+To fix this issue, check if the given stack pointer address points to
+the range of the kernel stack of the corresponding task, and abort if
+it turns out to be invalid.
+
+Although the corrupted mapping has already been fixed, this fix is
+still needed because corrupt stack pointer address can still be passed
+here from different reasons. Consider, for example, that data on the
+kernel stack can be modified abnormally due to any kernel bugs or
+hardware issues.
+
+Signed-off-by: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/defs.h b/defs.h
+index 6520d2f13f48..11fdc17e60d0 100644
+--- a/defs.h
++++ b/defs.h
+@@ -976,7 +976,10 @@ struct bt_info {
+
+ #define STACK_OFFSET_TYPE(OFF) \
+ (((ulong)(OFF) > STACKSIZE()) ? \
+- (ulong)((ulong)(OFF) - (ulong)(bt->stackbase)) : (ulong)(OFF))
++ (((ulong)(OFF) < (ulong)(bt->stackbase) || (ulong)(OFF) >= (ulong)(bt->stackbase) + STACKSIZE()) ? \
++ error(FATAL, "invalid stack pointer is given\n") : \
++ (ulong)((ulong)(OFF) - (ulong)(bt->stackbase))) : \
++ (ulong)(OFF))
+
+ #define GET_STACK_ULONG(OFF) \
+ *((ulong *)((char *)(&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(OFF))])))
+--
+2.37.1
+
diff --git a/0007-Fix-mount-command-to-appropriately-display-the-mount.patch b/0007-Fix-mount-command-to-appropriately-display-the-mount.patch
deleted file mode 100644
index 0988428..0000000
--- a/0007-Fix-mount-command-to-appropriately-display-the-mount.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 88a4910d95d43a01151ad1d570035b96893bc7f1 Mon Sep 17 00:00:00 2001
-From: Lianbo Jiang <lijiang(a)redhat.com>
-Date: Wed, 21 Dec 2022 17:09:08 +0800
-Subject: [PATCH 07/28] Fix "mount" command to appropriately display the mount
- dumps
-
-Recently the following failure has been observed on some vmcores when
-using the mount command:
-
- crash> mount
- MOUNT SUPERBLK TYPE DEVNAME DIRNAME
- ffff97a4818a3480 ffff979500013800 rootfs none /
- ffff97e4846ca700 ffff97e484653000 sysfs sysfs /sys
- ...
- ffff97b484753420 0 mount: invalid kernel virtual address: 0 type: "super_block buffer"
-
-The kernel virtual address of the super_block is zero when the mount
-command fails with the vfsmnt address 0xffff97b484753420. And the
-remaining mount information will be discarded. That is not expected.
-
-Check the address and skip it with a warning, if this is an invalid
-kernel virtual address, that can avoid truncating the remaining mount
-dumps.
-
-Reported-by: Dave Wysochanski <dwysocha(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- filesys.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/filesys.c b/filesys.c
-index c2ea78de821d..d64b54a9b822 100644
---- a/filesys.c
-+++ b/filesys.c
-@@ -1491,6 +1491,10 @@ show_mounts(ulong one_vfsmount, int flags, struct task_context *namespace_contex
- }
-
- sbp = ULONG(vfsmount_buf + OFFSET(vfsmount_mnt_sb));
-+ if (!IS_KVADDR(sbp)) {
-+ error(WARNING, "cannot get super_block from vfsmnt: 0x%lx\n", *vfsmnt);
-+ continue;
-+ }
-
- if (flags)
- fprintf(fp, "%s", mount_hdr);
---
-2.37.1
-
diff --git a/0007-Output-prompt-when-stdin-is-not-a-TTY.patch b/0007-Output-prompt-when-stdin-is-not-a-TTY.patch
new file mode 100644
index 0000000..7590e7f
--- /dev/null
+++ b/0007-Output-prompt-when-stdin-is-not-a-TTY.patch
@@ -0,0 +1,71 @@
+From 8527bbff71cbdfd90a67d5cec4a1d94156e6bf13 Mon Sep 17 00:00:00 2001
+From: Hsin-Yi Wang <hsinyi(a)chromium.org>
+Date: Wed, 31 May 2023 14:01:36 +0800
+Subject: [PATCH 07/13] Output prompt when stdin is not a TTY
+
+When stdin is not a TTY, prompt ("crash> ") won't be displayed. If
+another process interact with crash with piped stdin/stdout, it will not
+get the prompt as a delimiter.
+
+Compared to other debugger like gdb, crash seems intended to give a
+prompt in this case in the beginning of process_command_line(). It
+checks if pc->flags does NOT have any of
+READLINE|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE, a
+prompt should be printed. The check will never be true since READLINE is
+set in setup_environment() unconditionally.
+
+It makes more sense to change the READLINE flag in the check to TTY
+instead. Besides this change, the prompt in process_command_line() should
+only be print when it's not in the middle of processing the input file
+recovering from a previous FATAL command, because the prompt will be
+displayed by the exec_input_file().
+
+Additionally, when stdin is not TTY, repeat the command line from user
+after prompt, which can give more context.
+
+The prompt and command line can be opt out by using the silent (-s) flag.
+
+Signed-off-by: Hsin-Yi Wang <hsinyi(a)chromium.org>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ cmdline.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/cmdline.c b/cmdline.c
+index ded6551c2597..b7f919ae2279 100644
+--- a/cmdline.c
++++ b/cmdline.c
+@@ -64,8 +64,8 @@ process_command_line(void)
+ fp = stdout;
+ BZERO(pc->command_line, BUFSIZE);
+
+- if (!(pc->flags &
+- (READLINE|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE)))
++ if (!pc->ifile_in_progress && !(pc->flags &
++ (TTY|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE)))
+ fprintf(fp, "%s", pc->prompt);
+ fflush(fp);
+
+@@ -136,12 +136,16 @@ process_command_line(void)
+ add_history(pc->command_line);
+
+ check_special_handling(pc->command_line);
+- } else {
+- if (fgets(pc->command_line, BUFSIZE-1, stdin) == NULL)
++ } else {
++ if (fgets(pc->command_line, BUFSIZE-1, stdin) == NULL)
+ clean_exit(1);
++ if (!(pc->flags & SILENT)) {
++ fprintf(fp, "%s", pc->command_line);
++ fflush(fp);
++ }
+ clean_line(pc->command_line);
+ strcpy(pc->orig_line, pc->command_line);
+- }
++ }
+
+ /*
+ * First clean out all linefeeds and leading/trailing spaces.
+--
+2.37.1
+
diff --git a/0008-Add-RISCV64-framework-code-support.patch b/0008-Add-RISCV64-framework-code-support.patch
deleted file mode 100644
index 71e427f..0000000
--- a/0008-Add-RISCV64-framework-code-support.patch
+++ /dev/null
@@ -1,692 +0,0 @@
-From 12c31560000adaaf3539f2bcdffff51ec05df447 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:06 +0800
-Subject: [PATCH 08/28] Add RISCV64 framework code support
-
-This patch mainly added some environment configurations, macro definitions,
-specific architecture structures and some function declarations supported
-by the RISCV64 architecture.
-
-We can use the build command to get the simplest version crash tool:
- make target=RISCV64 -j2
-
-Co-developed-by: Lifang Xia <lifang_xia(a)linux.alibaba.com>
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- Makefile | 7 +-
- README | 6 +-
- configure.c | 43 ++++++++++++-
- defs.h | 154 +++++++++++++++++++++++++++++++++++++++++++-
- diskdump.c | 11 +++-
- help.c | 6 +-
- lkcd_vmdump_v1.h | 8 +--
- lkcd_vmdump_v2_v3.h | 8 +--
- netdump.c | 9 ++-
- ramdump.c | 2 +
- riscv64.c | 54 ++++++++++++++++
- symbols.c | 10 +++
- 12 files changed, 294 insertions(+), 24 deletions(-)
- create mode 100644 riscv64.c
-
-diff --git a/Makefile b/Makefile
-index 79aef1769444..1506dd426bc7 100644
---- a/Makefile
-+++ b/Makefile
-@@ -64,7 +64,7 @@ CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \
- kernel.c test.c gdb_interface.c configure.c net.c dev.c bpf.c \
- printk.c \
- alpha.c x86.c ppc.c ia64.c s390.c s390x.c s390dbf.c ppc64.c x86_64.c \
-- arm.c arm64.c mips.c mips64.c sparc64.c \
-+ arm.c arm64.c mips.c mips64.c riscv64.c sparc64.c \
- extensions.c remote.c va_server.c va_server_v1.c symbols.c cmdline.c \
- lkcd_common.c lkcd_v1.c lkcd_v2_v3.c lkcd_v5.c lkcd_v7.c lkcd_v8.c\
- lkcd_fix_mem.c s390_dump.c lkcd_x86_trace.c \
-@@ -84,7 +84,7 @@ OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \
- build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
- printk.o \
- alpha.o x86.o ppc.o ia64.o s390.o s390x.o s390dbf.o ppc64.o x86_64.o \
-- arm.o arm64.o mips.o mips64.o sparc64.o \
-+ arm.o arm64.o mips.o mips64.o riscv64.o sparc64.o \
- extensions.o remote.o va_server.o va_server_v1.o symbols.o cmdline.o \
- lkcd_common.o lkcd_v1.o lkcd_v2_v3.o lkcd_v5.o lkcd_v7.o lkcd_v8.o \
- lkcd_fix_mem.o s390_dump.o netdump.o diskdump.o makedumpfile.o xendump.o \
-@@ -438,6 +438,9 @@ mips.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips.c
- mips64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} mips64.c
- ${CC} -c ${CRASH_CFLAGS} mips64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-
-+riscv64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} riscv64.c
-+ ${CC} -c ${CRASH_CFLAGS} riscv64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-+
- sparc64.o: ${GENERIC_HFILES} ${REDHAT_HFILES} sparc64.c
- ${CC} -c ${CRASH_CFLAGS} sparc64.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-
-diff --git a/README b/README
-index 1f98fbf71df0..9850a29714b2 100644
---- a/README
-+++ b/README
-@@ -37,8 +37,8 @@
- These are the current prerequisites:
-
- o At this point, x86, ia64, x86_64, ppc64, ppc, arm, arm64, alpha, mips,
-- mips64, s390 and s390x-based kernels are supported. Other architectures
-- may be addressed in the future.
-+ mips64, riscv64, s390 and s390x-based kernels are supported. Other
-+ architectures may be addressed in the future.
-
- o One size fits all -- the utility can be run on any Linux kernel version
- version dating back to 2.2.5-15. A primary design goal is to always
-@@ -98,6 +98,8 @@
- arm64 dumpfiles may be built by typing "make target=ARM64".
- o On an x86_64 host, an x86_64 binary that can be used to analyze
- ppc64le dumpfiles may be built by typing "make target=PPC64".
-+ o On an x86_64 host, an x86_64 binary that can be used to analyze
-+ riscv64 dumpfiles may be built by typing "make target=RISCV64".
-
- Traditionally when vmcores are compressed via the makedumpfile(8) facility
- the libz compression library is used, and by default the crash utility
-diff --git a/configure.c b/configure.c
-index 51888519c18c..08b52be85e8d 100644
---- a/configure.c
-+++ b/configure.c
-@@ -107,6 +107,7 @@ void add_extra_lib(char *);
- #undef MIPS
- #undef SPARC64
- #undef MIPS64
-+#undef RISCV64
-
- #define UNKNOWN 0
- #define X86 1
-@@ -122,6 +123,7 @@ void add_extra_lib(char *);
- #define MIPS 11
- #define SPARC64 12
- #define MIPS64 13
-+#define RISCV64 14
-
- #define TARGET_X86 "TARGET=X86"
- #define TARGET_ALPHA "TARGET=ALPHA"
-@@ -136,6 +138,7 @@ void add_extra_lib(char *);
- #define TARGET_MIPS "TARGET=MIPS"
- #define TARGET_MIPS64 "TARGET=MIPS64"
- #define TARGET_SPARC64 "TARGET=SPARC64"
-+#define TARGET_RISCV64 "TARGET=RISCV64"
-
- #define TARGET_CFLAGS_X86 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
- #define TARGET_CFLAGS_ALPHA "TARGET_CFLAGS="
-@@ -158,6 +161,8 @@ void add_extra_lib(char *);
- #define TARGET_CFLAGS_MIPS_ON_X86_64 "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
- #define TARGET_CFLAGS_MIPS64 "TARGET_CFLAGS="
- #define TARGET_CFLAGS_SPARC64 "TARGET_CFLAGS="
-+#define TARGET_CFLAGS_RISCV64 "TARGET_CFLAGS="
-+#define TARGET_CFLAGS_RISCV64_ON_X86_64 "TARGET_CFLAGS="
-
- #define GDB_TARGET_DEFAULT "GDB_CONF_FLAGS="
- #define GDB_TARGET_ARM_ON_X86 "GDB_CONF_FLAGS=--target=arm-elf-linux"
-@@ -168,6 +173,7 @@ void add_extra_lib(char *);
- #define GDB_TARGET_PPC64_ON_X86_64 "GDB_CONF_FLAGS=--target=powerpc64le-unknown-linux-gnu"
- #define GDB_TARGET_MIPS_ON_X86 "GDB_CONF_FLAGS=--target=mipsel-elf-linux"
- #define GDB_TARGET_MIPS_ON_X86_64 "GDB_CONF_FLAGS=--target=mipsel-elf-linux CFLAGS=-m32 CXXFLAGS=-m32"
-+#define GDB_TARGET_RISCV64_ON_X86_64 "GDB_CONF_FLAGS=--target=riscv64-unknown-linux-gnu"
-
- /*
- * The original plan was to allow the use of a particular version
-@@ -404,6 +410,9 @@ get_current_configuration(struct supported_gdb_version *sp)
- #ifdef __sparc_v9__
- target_data.target = SPARC64;
- #endif
-+#if defined(__riscv) && (__riscv_xlen == 64)
-+ target_data.target = RISCV64;
-+#endif
-
- set_initial_target(sp);
-
-@@ -457,6 +466,12 @@ get_current_configuration(struct supported_gdb_version *sp)
- if ((target_data.initial_gdb_target != UNKNOWN) &&
- (target_data.host != target_data.initial_gdb_target))
- arch_mismatch(sp);
-+ } else if ((target_data.target == X86_64) &&
-+ (name_to_target((char *)target_data.target_as_param) == RISCV64)) {
-+ /*
-+ * Build an RISCV64 crash binary on an X86_64 host.
-+ */
-+ target_data.target = RISCV64;
- } else {
- fprintf(stderr,
- "\ntarget=%s is not supported on the %s host architecture\n\n",
-@@ -497,6 +512,14 @@ get_current_configuration(struct supported_gdb_version *sp)
- (target_data.target != MIPS64))
- arch_mismatch(sp);
-
-+ if ((target_data.initial_gdb_target == RISCV64) &&
-+ (target_data.target != RISCV64)) {
-+ if (target_data.target == X86_64)
-+ target_data.target = RISCV64;
-+ else
-+ arch_mismatch(sp);
-+ }
-+
- if ((target_data.initial_gdb_target == X86) &&
- (target_data.target != X86)) {
- if (target_data.target == X86_64)
-@@ -660,6 +683,9 @@ show_configuration(void)
- case SPARC64:
- printf("TARGET: SPARC64\n");
- break;
-+ case RISCV64:
-+ printf("TARGET: RISCV64\n");
-+ break;
- }
-
- if (strlen(target_data.program)) {
-@@ -777,6 +803,14 @@ build_configure(struct supported_gdb_version *sp)
- target = TARGET_SPARC64;
- target_CFLAGS = TARGET_CFLAGS_SPARC64;
- break;
-+ case RISCV64:
-+ target = TARGET_RISCV64;
-+ if (target_data.host == X86_64) {
-+ target_CFLAGS = TARGET_CFLAGS_RISCV64_ON_X86_64;
-+ gdb_conf_flags = GDB_TARGET_RISCV64_ON_X86_64;
-+ } else
-+ target_CFLAGS = TARGET_CFLAGS_RISCV64;
-+ break;
- }
-
- ldflags = get_extra_flags("LDFLAGS.extra", NULL);
-@@ -1374,7 +1408,7 @@ make_spec_file(struct supported_gdb_version *sp)
- printf("Vendor: Red Hat, Inc.\n");
- printf("Packager: Dave Anderson <anderson(a)redhat.com>\n");
- printf("ExclusiveOS: Linux\n");
-- printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel mips64el sparc64\n");
-+ printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel mips64el sparc64 riscv64\n");
- printf("Buildroot: %%{_tmppath}/%%{name}-root\n");
- printf("BuildRequires: ncurses-devel zlib-devel bison\n");
- printf("Requires: binutils\n");
-@@ -1613,6 +1647,8 @@ set_initial_target(struct supported_gdb_version *sp)
- target_data.initial_gdb_target = MIPS;
- else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
- target_data.initial_gdb_target = SPARC64;
-+ else if (strncmp(buf, "RISCV64", strlen("RISCV64")) == 0)
-+ target_data.initial_gdb_target = RISCV64;
- }
-
- char *
-@@ -1633,6 +1669,7 @@ target_to_name(int target)
- case MIPS: return("MIPS");
- case MIPS64: return("MIPS64");
- case SPARC64: return("SPARC64");
-+ case RISCV64: return("RISCV64");
- }
-
- return "UNKNOWN";
-@@ -1697,6 +1734,10 @@ name_to_target(char *name)
- return MIPS64;
- else if (strncmp(name, "sparc64", strlen("sparc64")) == 0)
- return SPARC64;
-+ else if (strncmp(name, "RISCV64", strlen("RISCV64")) == 0)
-+ return RISCV64;
-+ else if (strncmp(name, "riscv64", strlen("riscv64")) == 0)
-+ return RISCV64;
-
- return UNKNOWN;
- }
-diff --git a/defs.h b/defs.h
-index 04476b3ff62e..7702ab050f26 100644
---- a/defs.h
-+++ b/defs.h
-@@ -76,7 +76,7 @@
- #if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \
- !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \
- !defined(ARM) && !defined(ARM64) && !defined(MIPS) && !defined(MIPS64) && \
-- !defined(SPARC64)
-+ !defined(RISCV64) && !defined(SPARC64)
- #ifdef __alpha__
- #define ALPHA
- #endif
-@@ -118,6 +118,9 @@
- #ifdef __sparc_v9__
- #define SPARC64
- #endif
-+#if defined(__riscv) && (__riscv_xlen == 64)
-+#define RISCV64
-+#endif
- #endif
-
- #ifdef X86
-@@ -159,6 +162,9 @@
- #ifdef SPARC64
- #define NR_CPUS (4096)
- #endif
-+#ifdef RISCV64
-+#define NR_CPUS (256)
-+#endif
-
- #define NR_DEVICE_DUMPS (64)
-
-@@ -3486,6 +3492,63 @@ struct arm64_stackframe {
- #define _MAX_PHYSMEM_BITS 48
- #endif /* MIPS64 */
-
-+#ifdef RISCV64
-+#define _64BIT_
-+#define MACHINE_TYPE "RISCV64"
-+
-+/*
-+ * Direct memory mapping
-+ */
-+#define PTOV(X) \
-+ (((unsigned long)(X)+(machdep->kvbase)) - machdep->machspec->phys_base)
-+#define VTOP(X) ({ \
-+ ulong _X = X; \
-+ (THIS_KERNEL_VERSION >= LINUX(5,13,0) && \
-+ (_X) >= machdep->machspec->kernel_link_addr) ? \
-+ (((unsigned long)(_X)-(machdep->machspec->kernel_link_addr)) + \
-+ machdep->machspec->phys_base): \
-+ (((unsigned long)(_X)-(machdep->kvbase)) + \
-+ machdep->machspec->phys_base); \
-+ })
-+#define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask)
-+
-+/*
-+ * Stack size order
-+ */
-+#define THREAD_SIZE_ORDER 2
-+
-+#define PAGE_OFFSET (machdep->machspec->page_offset)
-+#define VMALLOC_START (machdep->machspec->vmalloc_start_addr)
-+#define VMALLOC_END (machdep->machspec->vmalloc_end)
-+#define VMEMMAP_VADDR (machdep->machspec->vmemmap_vaddr)
-+#define VMEMMAP_END (machdep->machspec->vmemmap_end)
-+#define MODULES_VADDR (machdep->machspec->modules_vaddr)
-+#define MODULES_END (machdep->machspec->modules_end)
-+#define IS_VMALLOC_ADDR(X) riscv64_IS_VMALLOC_ADDR((ulong)(X))
-+
-+/* from arch/riscv/include/asm/pgtable.h */
-+#define __SWP_TYPE_SHIFT 6
-+#define __SWP_TYPE_BITS 5
-+#define __SWP_TYPE_MASK ((1UL << __SWP_TYPE_BITS) - 1)
-+#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
-+
-+#define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
-+
-+#define SWP_TYPE(entry) (((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
-+#define SWP_OFFSET(entry) ((entry) >> __SWP_OFFSET_SHIFT)
-+#define __swp_type(entry) SWP_TYPE(entry)
-+#define __swp_offset(entry) SWP_OFFSET(entry)
-+
-+#define TIF_SIGPENDING (THIS_KERNEL_VERSION >= LINUX(2,6,23) ? 1 : 2)
-+
-+/* from arch/riscv/include/asm/sparsemem.h */
-+#define _SECTION_SIZE_BITS 27
-+#define _MAX_PHYSMEM_BITS 56 /* 56-bit physical address supported */
-+#define PHYS_MASK_SHIFT _MAX_PHYSMEM_BITS
-+#define PHYS_MASK (((1UL) << PHYS_MASK_SHIFT) - 1)
-+
-+#endif /* RISCV64 */
-+
- #ifdef X86
- #define _32BIT_
- #define MACHINE_TYPE "X86"
-@@ -4534,6 +4597,10 @@ struct machine_specific {
- #define MAX_HEXADDR_STRLEN (16)
- #define UVADDR_PRLEN (16)
- #endif
-+#ifdef RISCV64
-+#define MAX_HEXADDR_STRLEN (16)
-+#define UVADDR_PRLEN (16)
-+#endif
-
- #define BADADDR ((ulong)(-1))
- #define BADVAL ((ulong)(-1))
-@@ -5149,6 +5216,9 @@ void dump_build_data(void);
- #ifdef MIPS64
- #define machdep_init(X) mips64_init(X)
- #endif
-+#ifdef RISCV64
-+#define machdep_init(X) riscv64_init(X)
-+#endif
- #ifdef SPARC64
- #define machdep_init(X) sparc64_init(X)
- #endif
-@@ -5630,6 +5700,9 @@ void display_help_screen(char *);
- #ifdef SPARC64
- #define dump_machdep_table(X) sparc64_dump_machdep_table(X)
- #endif
-+#ifdef RISCV64
-+#define dump_machdep_table(X) riscv64_dump_machdep_table(X)
-+#endif
- extern char *help_pointer[];
- extern char *help_alias[];
- extern char *help_ascii[];
-@@ -6707,6 +6780,85 @@ struct machine_specific {
-
- #endif /* MIPS64 */
-
-+/*
-+ * riscv64.c
-+ */
-+void riscv64_display_regs_from_elf_notes(int, FILE *);
-+
-+#ifdef RISCV64
-+void riscv64_init(int);
-+void riscv64_dump_machdep_table(ulong);
-+int riscv64_IS_VMALLOC_ADDR(ulong);
-+
-+#define display_idt_table() \
-+ error(FATAL, "-d option is not applicable to RISCV64 architecture\n")
-+
-+/* from arch/riscv/include/asm/ptrace.h */
-+struct riscv64_register {
-+ ulong regs[36];
-+};
-+
-+struct riscv64_pt_regs {
-+ ulong badvaddr;
-+ ulong cause;
-+ ulong epc;
-+};
-+
-+struct riscv64_unwind_frame {
-+ ulong fp;
-+ ulong sp;
-+ ulong pc;
-+};
-+
-+#define KSYMS_START (0x1)
-+
-+struct machine_specific {
-+ ulong phys_base;
-+ ulong page_offset;
-+ ulong vmalloc_start_addr;
-+ ulong vmalloc_end;
-+ ulong vmemmap_vaddr;
-+ ulong vmemmap_end;
-+ ulong modules_vaddr;
-+ ulong modules_end;
-+ ulong kernel_link_addr;
-+
-+ ulong _page_present;
-+ ulong _page_read;
-+ ulong _page_write;
-+ ulong _page_exec;
-+ ulong _page_user;
-+ ulong _page_global;
-+ ulong _page_accessed;
-+ ulong _page_dirty;
-+ ulong _page_soft;
-+
-+ ulong _pfn_shift;
-+
-+ struct riscv64_register *crash_task_regs;
-+};
-+/* from arch/riscv/include/asm/pgtable-bits.h */
-+#define _PAGE_PRESENT (machdep->machspec->_page_present)
-+#define _PAGE_READ (machdep->machspec->_page_read)
-+#define _PAGE_WRITE (machdep->machspec->_page_write)
-+#define _PAGE_EXEC (machdep->machspec->_page_exec)
-+#define _PAGE_USER (machdep->machspec->_page_user)
-+#define _PAGE_GLOBAL (machdep->machspec->_page_global)
-+#define _PAGE_ACCESSED (machdep->machspec->_page_accessed)
-+#define _PAGE_DIRTY (machdep->machspec->_page_dirty)
-+#define _PAGE_SOFT (machdep->machspec->_page_soft)
-+#define _PAGE_SEC (machdep->machspec->_page_sec)
-+#define _PAGE_SHARE (machdep->machspec->_page_share)
-+#define _PAGE_BUF (machdep->machspec->_page_buf)
-+#define _PAGE_CACHE (machdep->machspec->_page_cache)
-+#define _PAGE_SO (machdep->machspec->_page_so)
-+#define _PAGE_SPECIAL _PAGE_SOFT
-+#define _PAGE_TABLE _PAGE_PRESENT
-+#define _PAGE_PROT_NONE _PAGE_READ
-+#define _PAGE_PFN_SHIFT 10
-+
-+#endif /* RISCV64 */
-+
- /*
- * sparc64.c
- */
-diff --git a/diskdump.c b/diskdump.c
-index 2c1f9be55c1f..28503bc286f8 100644
---- a/diskdump.c
-+++ b/diskdump.c
-@@ -622,6 +622,9 @@ restart:
- else if (STRNEQ(header->utsname.machine, "aarch64") &&
- machine_type_mismatch(file, "ARM64", NULL, 0))
- goto err;
-+ else if (STRNEQ(header->utsname.machine, "riscv64") &&
-+ machine_type_mismatch(file, "RISCV64", NULL, 0))
-+ goto err;
-
- if (header->block_size != block_size) {
- block_size = header->block_size;
-@@ -780,6 +783,8 @@ restart:
- dd->machine_type = EM_AARCH64;
- else if (machine_type("SPARC64"))
- dd->machine_type = EM_SPARCV9;
-+ else if (machine_type("RISCV64"))
-+ dd->machine_type = EM_RISCV;
- else {
- error(INFO, "%s: unsupported machine type: %s\n",
- DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
-@@ -1751,7 +1756,8 @@ dump_note_offsets(FILE *fp)
- qemu = FALSE;
- if (machine_type("X86_64") || machine_type("S390X") ||
- machine_type("ARM64") || machine_type("PPC64") ||
-- machine_type("SPARC64") || machine_type("MIPS64")) {
-+ machine_type("SPARC64") || machine_type("MIPS64") ||
-+ machine_type("RISCV64")) {
- note64 = (void *)dd->notes_buf + tot;
- len = sizeof(Elf64_Nhdr);
- if (STRNEQ((char *)note64 + len, "QEMU"))
-@@ -2558,7 +2564,8 @@ dump_registers_for_compressed_kdump(void)
- if (!KDUMP_CMPRS_VALID() || (dd->header->header_version < 4) ||
- !(machine_type("X86") || machine_type("X86_64") ||
- machine_type("ARM64") || machine_type("PPC64") ||
-- machine_type("MIPS") || machine_type("MIPS64")))
-+ machine_type("MIPS") || machine_type("MIPS64") ||
-+ machine_type("RISCV64")))
- error(FATAL, "-r option not supported for this dumpfile\n");
-
- if (machine_type("ARM64") && (kt->cpus != dd->num_prstatus_notes))
-diff --git a/help.c b/help.c
-index 14981cd01d48..367500fc280d 100644
---- a/help.c
-+++ b/help.c
-@@ -9513,8 +9513,8 @@ char *README[] = {
- " These are the current prerequisites: ",
- "",
- " o At this point, x86, ia64, x86_64, ppc64, ppc, arm, arm64, alpha, mips,",
--" mips64, s390 and s390x-based kernels are supported. Other architectures",
--" may be addressed in the future.",
-+" mips64, riscv64, s390 and s390x-based kernels are supported. Other",
-+" architectures may be addressed in the future.",
- "",
- " o One size fits all -- the utility can be run on any Linux kernel version",
- " version dating back to 2.2.5-15. A primary design goal is to always",
-@@ -9573,6 +9573,8 @@ README_ENTER_DIRECTORY,
- " arm64 dumpfiles may be built by typing \"make target=ARM64\".",
- " o On an x86_64 host, an x86_64 binary that can be used to analyze",
- " ppc64le dumpfiles may be built by typing \"make target=PPC64\".",
-+" o On an x86_64 host, an x86_64 binary that can be used to analyze",
-+" riscv64 dumpfiles may be built by typing \"make target=RISCV64\".",
- "",
- " Traditionally when vmcores are compressed via the makedumpfile(8) facility",
- " the libz compression library is used, and by default the crash utility",
-diff --git a/lkcd_vmdump_v1.h b/lkcd_vmdump_v1.h
-index 4933427fc755..98ee09495869 100644
---- a/lkcd_vmdump_v1.h
-+++ b/lkcd_vmdump_v1.h
-@@ -114,14 +114,8 @@ typedef struct _dump_header_s {
- struct new_utsname dh_utsname;
-
- /* the dump registers */
--#ifndef IA64
--#ifndef S390
--#ifndef S390X
--#ifndef ARM64
-+#if !defined(IA64) && !defined(S390) && !defined(S390X) && !defined(ARM64) && !defined(RISCV64)
- struct pt_regs dh_regs;
--#endif
--#endif
--#endif
- #endif
-
- /* the address of the current task */
-diff --git a/lkcd_vmdump_v2_v3.h b/lkcd_vmdump_v2_v3.h
-index 984c2c25e3c6..ef3067f88e1e 100644
---- a/lkcd_vmdump_v2_v3.h
-+++ b/lkcd_vmdump_v2_v3.h
-@@ -37,7 +37,7 @@
-
- #if defined(ARM) || defined(X86) || defined(PPC) || defined(S390) || \
- defined(S390X) || defined(ARM64) || defined(MIPS) || \
-- defined(MIPS64) || defined(SPARC64)
-+ defined(MIPS64) || defined(SPARC64) || defined(RISCV64)
-
- /*
- * Kernel header file for Linux crash dumps.
-@@ -84,13 +84,9 @@ typedef struct _dump_header_asm_s {
- uint32_t dha_eip;
-
- /* the dump registers */
--#ifndef S390
--#ifndef S390X
--#ifndef ARM64
-+#if !defined(S390) && !defined(S390X) && !defined(ARM64) && !defined(RISCV64)
- struct pt_regs dha_regs;
- #endif
--#endif
--#endif
-
- } dump_header_asm_t;
-
-diff --git a/netdump.c b/netdump.c
-index ff273b4fdfab..4ec12a073af6 100644
---- a/netdump.c
-+++ b/netdump.c
-@@ -300,6 +300,12 @@ is_netdump(char *file, ulong source_query)
- goto bailout;
- break;
-
-+ case EM_RISCV:
-+ if (machine_type_mismatch(file, "RISCV64", NULL,
-+ source_query))
-+ goto bailout;
-+ break;
-+
- default:
- if (machine_type_mismatch(file, "(unknown)", NULL,
- source_query))
-@@ -2935,7 +2941,8 @@ dump_registers_for_elf_dumpfiles(void)
-
- if (!(machine_type("X86") || machine_type("X86_64") ||
- machine_type("ARM64") || machine_type("PPC64") ||
-- machine_type("MIPS") || machine_type("MIPS64")))
-+ machine_type("MIPS") || machine_type("MIPS64") ||
-+ machine_type("RISCV64")))
- error(FATAL, "-r option not supported for this dumpfile\n");
-
- if (NETDUMP_DUMPFILE()) {
-diff --git a/ramdump.c b/ramdump.c
-index a206fcbbab3c..d2bd7ffb0b4b 100644
---- a/ramdump.c
-+++ b/ramdump.c
-@@ -188,6 +188,8 @@ char *ramdump_to_elf(void)
- e_machine = EM_MIPS;
- else if (machine_type("X86_64"))
- e_machine = EM_X86_64;
-+ else if (machine_type("RISCV64"))
-+ e_machine = EM_RISCV;
- else
- error(FATAL, "ramdump: unsupported machine type: %s\n",
- MACHINE_TYPE);
-diff --git a/riscv64.c b/riscv64.c
-new file mode 100644
-index 000000000000..4f858a418a8c
---- /dev/null
-+++ b/riscv64.c
-@@ -0,0 +1,54 @@
-+/* riscv64.c - core analysis suite
-+ *
-+ * Copyright (C) 2022 Alibaba Group Holding Limited.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ */
-+#include "defs.h"
-+#ifdef RISCV64
-+
-+#include <elf.h>
-+
-+void
-+riscv64_dump_machdep_table(ulong arg)
-+{
-+}
-+
-+/*
-+ * Include both vmalloc'd and module address space as VMALLOC space.
-+ */
-+int
-+riscv64_IS_VMALLOC_ADDR(ulong vaddr)
-+{
-+ return ((vaddr >= VMALLOC_START && vaddr <= VMALLOC_END) ||
-+ (vaddr >= VMEMMAP_VADDR && vaddr <= VMEMMAP_END) ||
-+ (vaddr >= MODULES_VADDR && vaddr <= MODULES_END));
-+}
-+
-+void
-+riscv64_init(int when)
-+{
-+}
-+
-+void
-+riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
-+{
-+}
-+
-+#else /* !RISCV64 */
-+
-+void
-+riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
-+{
-+ return;
-+}
-+
-+#endif /* !RISCV64 */
-diff --git a/symbols.c b/symbols.c
-index e279cfa68490..cb5b508dcc50 100644
---- a/symbols.c
-+++ b/symbols.c
-@@ -3743,6 +3743,11 @@ is_kernel(char *file)
- goto bailout;
- break;
-
-+ case EM_RISCV:
-+ if (machine_type_mismatch(file, "RISCV64", NULL, 0))
-+ goto bailout;
-+ break;
-+
- default:
- if (machine_type_mismatch(file, "(unknown)", NULL, 0))
- goto bailout;
-@@ -4002,6 +4007,11 @@ is_shared_object(char *file)
- if (machine_type("MIPS64"))
- return TRUE;
- break;
-+
-+ case EM_RISCV:
-+ if (machine_type("RISCV64"))
-+ return TRUE;
-+ break;
- }
-
- if (CRASHDEBUG(1))
---
-2.37.1
-
diff --git a/0008-x86_64-Fix-bt-command-printing-stale-entries-on-Linu.patch b/0008-x86_64-Fix-bt-command-printing-stale-entries-on-Linu.patch
new file mode 100644
index 0000000..27440d1
--- /dev/null
+++ b/0008-x86_64-Fix-bt-command-printing-stale-entries-on-Linu.patch
@@ -0,0 +1,345 @@
+From 77d8621876c1c6a3a25b91e464ba588a542485fb Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Date: Thu, 18 May 2023 16:53:54 +0900
+Subject: [PATCH 08/13] x86_64: Fix "bt" command printing stale entries on
+ Linux 6.4 and later
+
+Kernel commit fb799447ae29 ("x86,objtool: Split UNWIND_HINT_EMPTY in
+two"), which is contained in Linux 6.4 and later kernels, changed
+ORC_TYPE_CALL macro from 0 to 2. As a result, the "bt" command cannot
+use ORC entries, and can display stale entries in a call trace.
+
+ crash> bt 1
+ PID: 1 TASK: ffff93cd06294180 CPU: 51 COMMAND: "systemd"
+ #0 [ffffb72bc00cbc98] __schedule at ffffffff86e52aae
+ #1 [ffffb72bc00cbd00] schedule at ffffffff86e52f6a
+ #2 [ffffb72bc00cbd18] schedule_hrtimeout_range_clock at ffffffff86e58ef5
+ #3 [ffffb72bc00cbd88] ep_poll at ffffffff8669624d
+ #4 [ffffb72bc00cbe28] do_epoll_wait at ffffffff86696371
+ #5 [ffffb72bc00cbe30] do_timerfd_settime at ffffffff8669902b <<
+ #6 [ffffb72bc00cbe60] __x64_sys_epoll_wait at ffffffff86696bf0
+ #7 [ffffb72bc00cbeb0] do_syscall_64 at ffffffff86e3feb9
+ #8 [ffffb72bc00cbee0] __task_pid_nr_ns at ffffffff863330d7 <<
+ #9 [ffffb72bc00cbf08] syscall_exit_to_user_mode at ffffffff86e466b2 << stale entries
+ #10 [ffffb72bc00cbf18] do_syscall_64 at ffffffff86e3fec9 <<
+ #11 [ffffb72bc00cbf50] entry_SYSCALL_64_after_hwframe at ffffffff870000aa
+
+Also, kernel commit ffb1b4a41016 added a member to struct orc_entry.
+Although this does not affect the crash's unwinder, its debugging
+information can be displayed incorrectly.
+
+To fix these,
+(1) introduce "kernel_orc_entry_6_4" structure corresponding to 6.4 and
+ abstruction layer "orc_entry" structure in crash,
+(2) switch ORC_TYPE_CALL to 2 or 0 with kernel's orc_entry structure.
+
+Related orc_entry history:
+ v4.14 39358a033b2e introduced struct orc_entry
+ v4.19 d31a580266ee added orc_entry.end member
+ v6.3 ffb1b4a41016 added orc_entry.signal member
+ v6.4 fb799447ae29 removed end member and changed type member to 3 bits
+
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 28 ++++++++++++-
+ x86_64.c | 119 +++++++++++++++++++++++++++++++++++++++++++------------
+ 2 files changed, 119 insertions(+), 28 deletions(-)
+
+diff --git a/defs.h b/defs.h
+index 11fdc17e60d0..bfda0c48d37b 100644
+--- a/defs.h
++++ b/defs.h
+@@ -6363,9 +6363,29 @@ typedef struct __attribute__((__packed__)) {
+ unsigned int sp_reg:4;
+ unsigned int bp_reg:4;
+ unsigned int type:2;
++ unsigned int signal:1;
+ unsigned int end:1;
+ } kernel_orc_entry;
+
++typedef struct __attribute__((__packed__)) {
++ signed short sp_offset;
++ signed short bp_offset;
++ unsigned int sp_reg:4;
++ unsigned int bp_reg:4;
++ unsigned int type:3;
++ unsigned int signal:1;
++} kernel_orc_entry_6_4;
++
++typedef struct orc_entry {
++ signed short sp_offset;
++ signed short bp_offset;
++ unsigned int sp_reg;
++ unsigned int bp_reg;
++ unsigned int type;
++ unsigned int signal;
++ unsigned int end;
++} orc_entry;
++
+ struct ORC_data {
+ int module_ORC;
+ uint lookup_num_blocks;
+@@ -6376,10 +6396,13 @@ struct ORC_data {
+ ulong orc_lookup;
+ ulong ip_entry;
+ ulong orc_entry;
+- kernel_orc_entry kernel_orc_entry;
++ orc_entry orc_entry_data;
++ int has_signal;
++ int has_end;
+ };
+
+-#define ORC_TYPE_CALL 0
++#define ORC_TYPE_CALL ((machdep->flags & ORC_6_4) ? 2 : 0)
++/* The below entries are not used and must be updated if we use them. */
+ #define ORC_TYPE_REGS 1
+ #define ORC_TYPE_REGS_IRET 2
+ #define UNWIND_HINT_TYPE_SAVE 3
+@@ -6456,6 +6479,7 @@ struct machine_specific {
+ #define ORC (0x4000)
+ #define KPTI (0x8000)
+ #define L1TF (0x10000)
++#define ORC_6_4 (0x20000)
+
+ #define VM_FLAGS (VM_ORIG|VM_2_6_11|VM_XEN|VM_XEN_RHEL4|VM_5LEVEL)
+
+diff --git a/x86_64.c b/x86_64.c
+index 693a08bea758..87e87ae6e1e8 100644
+--- a/x86_64.c
++++ b/x86_64.c
+@@ -132,9 +132,9 @@ static void GART_init(void);
+ static void x86_64_exception_stacks_init(void);
+ static int in_START_KERNEL_map(ulong);
+ static ulong orc_ip(ulong);
+-static kernel_orc_entry *__orc_find(ulong, ulong, uint, ulong);
+-static kernel_orc_entry *orc_find(ulong);
+-static kernel_orc_entry *orc_module_find(ulong);
++static orc_entry *__orc_find(ulong, ulong, uint, ulong);
++static orc_entry *orc_find(ulong);
++static orc_entry *orc_module_find(ulong);
+ static ulong ip_table_to_vaddr(ulong);
+ static void orc_dump(ulong);
+
+@@ -806,6 +806,8 @@ x86_64_dump_machdep_table(ulong arg)
+ fprintf(fp, "%sFRAMESIZE_DEBUG", others++ ? "|" : "");
+ if (machdep->flags & ORC)
+ fprintf(fp, "%sORC", others++ ? "|" : "");
++ if (machdep->flags & ORC_6_4)
++ fprintf(fp, "%sORC_6_4", others++ ? "|" : "");
+ if (machdep->flags & FRAMEPOINTER)
+ fprintf(fp, "%sFRAMEPOINTER", others++ ? "|" : "");
+ if (machdep->flags & GART_REGION)
+@@ -980,6 +982,8 @@ x86_64_dump_machdep_table(ulong arg)
+ fprintf(fp, " ORC_data: %s", machdep->flags & ORC ? "\n" : "(unused)\n");
+ if (machdep->flags & ORC) {
+ fprintf(fp, " module_ORC: %s\n", ms->orc.module_ORC ? "TRUE" : "FALSE");
++ fprintf(fp, " has_signal: %s\n", ms->orc.has_signal ? "TRUE" : "FALSE");
++ fprintf(fp, " has_end: %s\n", ms->orc.has_end ? "TRUE" : "FALSE");
+ fprintf(fp, " lookup_num_blocks: %d\n", ms->orc.lookup_num_blocks);
+ fprintf(fp, " __start_orc_unwind_ip: %lx\n", ms->orc.__start_orc_unwind_ip);
+ fprintf(fp, " __stop_orc_unwind_ip: %lx\n", ms->orc.__stop_orc_unwind_ip);
+@@ -988,14 +992,18 @@ x86_64_dump_machdep_table(ulong arg)
+ fprintf(fp, " orc_lookup: %lx\n", ms->orc.orc_lookup);
+ fprintf(fp, " ip_entry: %lx\n", ms->orc.ip_entry);
+ fprintf(fp, " orc_entry: %lx\n", ms->orc.orc_entry);
+- fprintf(fp, " kernel_orc_entry:\n");
+- fprintf(fp, " sp_offset: %d\n", ms->orc.kernel_orc_entry.sp_offset);
+- fprintf(fp, " bp_offset: %d\n", ms->orc.kernel_orc_entry.bp_offset);
+- fprintf(fp, " sp_reg: %d\n", ms->orc.kernel_orc_entry.sp_reg);
+- fprintf(fp, " bp_reg: %d\n", ms->orc.kernel_orc_entry.bp_reg);
+- fprintf(fp, " type: %d\n", ms->orc.kernel_orc_entry.type);
+- if (MEMBER_EXISTS("orc_entry", "end"))
+- fprintf(fp, " end: %d\n", ms->orc.kernel_orc_entry.end);
++ fprintf(fp, " orc_entry_data:\n");
++ fprintf(fp, " sp_offset: %d\n", ms->orc.orc_entry_data.sp_offset);
++ fprintf(fp, " bp_offset: %d\n", ms->orc.orc_entry_data.bp_offset);
++ fprintf(fp, " sp_reg: %d\n", ms->orc.orc_entry_data.sp_reg);
++ fprintf(fp, " bp_reg: %d\n", ms->orc.orc_entry_data.bp_reg);
++ fprintf(fp, " type: %d\n", ms->orc.orc_entry_data.type);
++ if (ms->orc.has_signal)
++ fprintf(fp, " signal: %d\n", ms->orc.orc_entry_data.signal);
++ else
++ fprintf(fp, " signal: (n/a)\n");
++ if (ms->orc.has_end)
++ fprintf(fp, " end: %d\n", ms->orc.orc_entry_data.end);
+ else
+ fprintf(fp, " end: (n/a)\n");
+ }
+@@ -6440,6 +6448,12 @@ x86_64_ORC_init(void)
+ MEMBER_OFFSET_INIT(inactive_task_frame_bp, "inactive_task_frame", "bp");
+ MEMBER_OFFSET_INIT(inactive_task_frame_ret_addr, "inactive_task_frame", "ret_addr");
+
++ orc->has_signal = MEMBER_EXISTS("orc_entry", "signal"); /* added at 6.3 */
++ orc->has_end = MEMBER_EXISTS("orc_entry", "end"); /* removed at 6.4 */
++
++ if (orc->has_signal && !orc->has_end)
++ machdep->flags |= ORC_6_4;
++
+ machdep->flags |= ORC;
+ }
+
+@@ -8522,7 +8536,7 @@ x86_64_get_framesize(struct bt_info *bt, ulong textaddr, ulong rsp, char *stack_
+ int reterror;
+ int arg_exists;
+ int exception;
+- kernel_orc_entry *korc;
++ orc_entry *korc;
+
+ if (!(bt->flags & BT_FRAMESIZE_DEBUG)) {
+ if ((bt->flags & BT_FRAMESIZE_IGNORE_MASK) ||
+@@ -8608,11 +8622,14 @@ x86_64_get_framesize(struct bt_info *bt, ulong textaddr, ulong rsp, char *stack_
+
+ if ((machdep->flags & ORC) && (korc = orc_find(textaddr))) {
+ if (CRASHDEBUG(1)) {
++ struct ORC_data *orc = &machdep->machspec->orc;
+ fprintf(fp,
+ "rsp: %lx textaddr: %lx -> spo: %d bpo: %d spr: %d bpr: %d type: %d",
+ rsp, textaddr, korc->sp_offset, korc->bp_offset,
+ korc->sp_reg, korc->bp_reg, korc->type);
+- if (MEMBER_EXISTS("orc_entry", "end"))
++ if (orc->has_signal)
++ fprintf(fp, " signal: %d", korc->signal);
++ if (orc->has_end)
+ fprintf(fp, " end: %d", korc->end);
+ fprintf(fp, "\n");
+ }
+@@ -9118,7 +9135,53 @@ orc_ip(ulong ip)
+ return (ip + ip_entry);
+ }
+
+-static kernel_orc_entry *
++static orc_entry *
++orc_get_entry(struct ORC_data *orc)
++{
++ struct orc_entry *entry = &orc->orc_entry_data;
++
++ if (machdep->flags & ORC_6_4) {
++ kernel_orc_entry_6_4 korc;
++
++ if (!readmem(orc->orc_entry, KVADDR, &korc, sizeof(kernel_orc_entry_6_4),
++ "kernel orc_entry", RETURN_ON_ERROR|QUIET))
++ return NULL;
++
++ entry->sp_offset = korc.sp_offset;
++ entry->bp_offset = korc.bp_offset;
++ entry->sp_reg = korc.sp_reg;
++ entry->bp_reg = korc.bp_reg;
++ entry->type = korc.type;
++ entry->signal = korc.signal;
++ } else {
++ kernel_orc_entry korc;
++
++ if (!readmem(orc->orc_entry, KVADDR, &korc, sizeof(kernel_orc_entry),
++ "kernel orc_entry", RETURN_ON_ERROR|QUIET))
++ return NULL;
++
++ entry->sp_offset = korc.sp_offset;
++ entry->bp_offset = korc.bp_offset;
++ entry->sp_reg = korc.sp_reg;
++ entry->bp_reg = korc.bp_reg;
++ entry->type = korc.type;
++ if (orc->has_end) {
++ /*
++ * orc_entry.signal was inserted before orc_entry.end.
++ * see ffb1b4a41016.
++ */
++ if (orc->has_signal) {
++ entry->signal = korc.signal;
++ entry->end = korc.end;
++ } else
++ entry->end = korc.signal; /* on purpose */
++ }
++ }
++
++ return entry;
++}
++
++static orc_entry *
+ __orc_find(ulong ip_table_ptr, ulong u_table_ptr, uint num_entries, ulong ip)
+ {
+ int index;
+@@ -9128,7 +9191,7 @@ __orc_find(ulong ip_table_ptr, ulong u_table_ptr, uint num_entries, ulong ip)
+ int *ip_table = (int *)ip_table_ptr;
+ struct ORC_data *orc = &machdep->machspec->orc;
+ ulong vaddr;
+- kernel_orc_entry *korc;
++ orc_entry *korc;
+
+ if (CRASHDEBUG(2)) {
+ int i, ip_entry;
+@@ -9172,18 +9235,20 @@ __orc_find(ulong ip_table_ptr, ulong u_table_ptr, uint num_entries, ulong ip)
+
+ orc->ip_entry = (ulong)found;
+ orc->orc_entry = u_table_ptr + (index * SIZE(orc_entry));
+- if (!readmem(orc->orc_entry, KVADDR, &orc->kernel_orc_entry,
+- sizeof(kernel_orc_entry), "kernel orc_entry", RETURN_ON_ERROR|QUIET))
++
++ if (!orc_get_entry(orc))
+ return NULL;
+
+- korc = &orc->kernel_orc_entry;
++ korc = &orc->orc_entry_data;
+
+ if (CRASHDEBUG(2)) {
+ fprintf(fp, " found: %lx index: %d\n", (ulong)found, index);
+ fprintf(fp,
+ " orc_entry: %lx sp_offset: %d bp_offset: %d sp_reg: %d bp_reg: %d type: %d",
+ orc->orc_entry, korc->sp_offset, korc->bp_offset, korc->sp_reg, korc->bp_reg, korc->type);
+- if (MEMBER_EXISTS("orc_entry", "end"))
++ if (orc->has_signal)
++ fprintf(fp, " signal: %d", korc->signal);
++ if (orc->has_end)
+ fprintf(fp, " end: %d", korc->end);
+ fprintf(fp, "\n");
+ }
+@@ -9196,7 +9261,7 @@ __orc_find(ulong ip_table_ptr, ulong u_table_ptr, uint num_entries, ulong ip)
+ #define LOOKUP_START_IP (unsigned long)kt->stext
+ #define LOOKUP_STOP_IP (unsigned long)kt->etext
+
+-static kernel_orc_entry *
++static orc_entry *
+ orc_find(ulong ip)
+ {
+ unsigned int idx, start, stop;
+@@ -9266,7 +9331,7 @@ orc_find(ulong ip)
+ orc->__start_orc_unwind + (start * SIZE(orc_entry)), stop - start, ip);
+ }
+
+-static kernel_orc_entry *
++static orc_entry *
+ orc_module_find(ulong ip)
+ {
+ struct load_module *lm;
+@@ -9313,7 +9378,7 @@ static void
+ orc_dump(ulong ip)
+ {
+ struct ORC_data *orc = &machdep->machspec->orc;
+- kernel_orc_entry *korc;
++ orc_entry *korc;
+ ulong vaddr, offset;
+ struct syment *sp, *orig;
+
+@@ -9336,13 +9401,15 @@ next_in_func:
+ fprintf(fp, "%s+%ld -> ", sp->name, offset);
+ else
+ fprintf(fp, "(unresolved) -> ");
+- if (!readmem(orc->orc_entry, KVADDR, &orc->kernel_orc_entry, sizeof(kernel_orc_entry),
+- "kernel orc_entry", RETURN_ON_ERROR))
++
++ if (!orc_get_entry(orc))
+ error(FATAL, "cannot read orc_entry\n");
+- korc = &orc->kernel_orc_entry;
++ korc = &orc->orc_entry_data;
+ fprintf(fp, "orc: %lx spo: %d bpo: %d spr: %d bpr: %d type: %d",
+ orc->orc_entry, korc->sp_offset, korc->bp_offset, korc->sp_reg, korc->bp_reg, korc->type);
+- if (MEMBER_EXISTS("orc_entry", "end"))
++ if (orc->has_signal)
++ fprintf(fp, " signal: %d", korc->signal);
++ if (orc->has_end)
+ fprintf(fp, " end: %d", korc->end);
+ fprintf(fp, "\n");
+
+--
+2.37.1
+
diff --git a/0009-Fix-invalid-structure-size-error-during-crash-startu.patch b/0009-Fix-invalid-structure-size-error-during-crash-startu.patch
new file mode 100644
index 0000000..91c8fc9
--- /dev/null
+++ b/0009-Fix-invalid-structure-size-error-during-crash-startu.patch
@@ -0,0 +1,48 @@
+From ec1e61b33a705b8be8d116a541c7b076b0429deb Mon Sep 17 00:00:00 2001
+From: Lianbo Jiang <lijiang(a)redhat.com>
+Date: Mon, 12 Jun 2023 18:50:05 +0800
+Subject: [PATCH 09/13] Fix invalid structure size error during crash startup
+ on ppc64
+
+The crash utility will fail to start session on ppc64 with the following
+error:
+
+ # crash vmlinux vmcore -s
+
+ crash: invalid structure size: note_buf
+ FILE: diskdump.c LINE: 121 FUNCTION: have_crash_notes()
+
+ [./crash] error trace: 101859ac => 10291798 => 10291450 => 10266038
+
+ 10266038: SIZE_verify+156
+ 10291450: have_crash_notes+308
+ 10291798: map_cpus_to_prstatus_kdump_cmprs+448
+ 101859ac: task_init+11980
+
+The reason is that the size of note_buf is not initialized before using
+SIZE(note_buf) in the have_crash_notes() on some architectures including
+ppc64. Let's initialize it in task_init() to fix this issue.
+
+Fixes: db8c030857b4 ("diskdump/netdump: fix segmentation fault caused by failure of stopping CPUs")
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ task.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/task.c b/task.c
+index 88941c7b0e4d..2b7467b4193d 100644
+--- a/task.c
++++ b/task.c
+@@ -675,6 +675,9 @@ task_init(void)
+ tt->this_task = pid_to_task(active_pid);
+ }
+ else {
++ if (INVALID_SIZE(note_buf))
++ STRUCT_SIZE_INIT(note_buf, "note_buf_t");
++
+ if (KDUMP_DUMPFILE())
+ map_cpus_to_prstatus();
+ else if (ELF_NOTES_VALID() && DISKDUMP_DUMPFILE())
+--
+2.37.1
+
diff --git a/0009-RISCV64-Make-crash-tool-enter-command-line-and-suppo.patch b/0009-RISCV64-Make-crash-tool-enter-command-line-and-suppo.patch
deleted file mode 100644
index cda9ec7..0000000
--- a/0009-RISCV64-Make-crash-tool-enter-command-line-and-suppo.patch
+++ /dev/null
@@ -1,1287 +0,0 @@
-From e7119d2225e1db3c460285880ea39b69d362178e Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:07 +0800
-Subject: [PATCH 09/28] RISCV64: Make crash tool enter command line and support
- some commands
-
-1. Add riscv64_init() implementation, do all necessary machine-specific setup,
- which will be called multiple times during initialization.
-2. Add riscv64 sv39/48/57 pagetable macro definitions, the function of converting
- virtual address to a physical address via 4K page table.
- For 2M and 1G pagesize, they will be implemented in the future(currently not supported).
-3. Add the implementation of the vtop command, which is used to convert a
- virtual address to a physical address(call the functions defined in 2).
-4. Add the implementation to get virtual memory layout, va_bits, phys_ram_base
- from vmcoreinfo. As these configurations changes from time to time, we sent
- a Linux kernel patch to export these configurations, which can simplify the
- development of crash tool.
- The kernel commit: 649d6b1019a2 ("RISC-V: Add arch_crash_save_vmcoreinfo")
-5. Add riscv64_get_smp_cpus() implementation, get the number of cpus.
-6. Add riscv64_get_page_size() implementation, get page size.
-And so on.
-
-With this patch, we can enter crash command line, and run "vtop", "mod", "rd",
-"*", "p", "kmem" ...
-
-Tested on QEMU RISCV64 end and SoC platform of T-head Xuantie 910 CPU.
-
- KERNEL: vmlinux
- DUMPFILE: vmcore
- CPUS: 1
- DATE: Fri Jul 15 10:24:25 CST 2022
- UPTIME: 00:00:33
-LOAD AVERAGE: 0.05, 0.01, 0.00
- TASKS: 41
- NODENAME: buildroot
- RELEASE: 5.18.9
- VERSION: #30 SMP Fri Jul 15 09:47:03 CST 2022
- MACHINE: riscv64 (unknown Mhz)
- MEMORY: 1 GB
- PANIC: "Kernel panic - not syncing: sysrq triggered crash"
- PID: 113
- COMMAND: "sh"
- TASK: ff60000002269600 [THREAD_INFO: ff60000002269600]
- CPU: 0
- STATE: TASK_RUNNING (PANIC)
-
-crash> p mem_map
-mem_map = $1 = (struct page *) 0xff6000003effbf00
-
-crash> p /x *(struct page *) 0xff6000003effbf00
-$5 = {
- flags = 0x1000,
- {
- {
- {
- lru = {
- next = 0xff6000003effbf08,
- prev = 0xff6000003effbf08
- },
- {
- __filler = 0xff6000003effbf08,
- mlock_count = 0x3effbf08
- }
- },
- mapping = 0x0,
- index = 0x0,
- private = 0x0
- },
-
-crash> mod
- MODULE NAME BASE SIZE OBJECT FILE
-ffffffff0113e740 nvme_core ffffffff01133000 98304 (not loaded) [CONFIG_KALLSYMS]
-ffffffff011542c0 nvme ffffffff0114c000 61440 (not loaded) [CONFIG_KALLSYMS]
-
-crash> rd ffffffff0113e740 8
-ffffffff0113e740: 0000000000000000 ffffffff810874f8 .........t......
-ffffffff0113e750: ffffffff011542c8 726f635f656d766e .B......nvme_cor
-ffffffff0113e760: 0000000000000065 0000000000000000 e...............
-ffffffff0113e770: 0000000000000000 0000000000000000 ................
-
-crash> vtop ffffffff0113e740
-VIRTUAL PHYSICAL
-ffffffff0113e740 8254d740
-
- PGD: ffffffff810e9ff8 => 2ffff001
- P4D: 0000000000000000 => 000000002fffec01
- PUD: 00005605c2957470 => 0000000020949801
- PMD: 00007fff7f1750c0 => 0000000020947401
- PTE: 0 => 209534e7
- PAGE: 000000008254d000
-
- PTE PHYSICAL FLAGS
-209534e7 8254d000 (PRESENT|READ|WRITE|GLOBAL|ACCESSED|DIRTY)
-
- PAGE PHYSICAL MAPPING INDEX CNT FLAGS
-ff6000003f0777d8 8254d000 0 0 1 0
-
-Tested-by: Yixun Lan <yixun.lan(a)gmail.com>
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 97 ++++++
- diskdump.c | 10 +
- riscv64.c | 994 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 1101 insertions(+)
-
-diff --git a/defs.h b/defs.h
-index 7702ab050f26..0cff47e30ae9 100644
---- a/defs.h
-+++ b/defs.h
-@@ -3496,6 +3496,85 @@ struct arm64_stackframe {
- #define _64BIT_
- #define MACHINE_TYPE "RISCV64"
-
-+typedef struct { ulong pgd; } pgd_t;
-+typedef struct { ulong p4d; } p4d_t;
-+typedef struct { ulong pud; } pud_t;
-+typedef struct { ulong pmd; } pmd_t;
-+typedef struct { ulong pte; } pte_t;
-+typedef signed int s32;
-+
-+/* arch/riscv/include/asm/pgtable-64.h */
-+#define PGD_SHIFT_L3 (30)
-+#define PGD_SHIFT_L4 (39)
-+#define PGD_SHIFT_L5 (48)
-+
-+#define P4D_SHIFT (39)
-+#define PUD_SHIFT (30)
-+#define PMD_SHIFT (21)
-+
-+#define PTRS_PER_PGD (512)
-+#define PTRS_PER_P4D (512)
-+#define PTRS_PER_PUD (512)
-+#define PTRS_PER_PMD (512)
-+#define PTRS_PER_PTE (512)
-+
-+/*
-+ * Mask for bit 0~53(PROT and PPN) of PTE
-+ * 63 6261 60 54 53 10 9 8 7 6 5 4 3 2 1 0
-+ * N PBMT Reserved P P N RSW D A G U X W R V
-+ */
-+#define PTE_PFN_PROT_MASK 0x3FFFFFFFFFFFFF
-+
-+/*
-+ * 3-levels / 4K pages
-+ *
-+ * sv39
-+ * PGD | PMD | PTE | OFFSET |
-+ * 9 | 9 | 9 | 12 |
-+ */
-+#define pgd_index_l3_4k(addr) (((addr) >> PGD_SHIFT_L3) & (PTRS_PER_PGD - 1))
-+#define pmd_index_l3_4k(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
-+#define pte_index_l3_4k(addr) (((addr) >> PAGESHIFT()) & (PTRS_PER_PTE - 1))
-+
-+/*
-+ * 4-levels / 4K pages
-+ *
-+ * sv48
-+ * PGD | PUD | PMD | PTE | OFFSET |
-+ * 9 | 9 | 9 | 9 | 12 |
-+ */
-+#define pgd_index_l4_4k(addr) (((addr) >> PGD_SHIFT_L4) & (PTRS_PER_PGD - 1))
-+#define pud_index_l4_4k(addr) (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
-+#define pmd_index_l4_4k(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
-+#define pte_index_l4_4k(addr) (((addr) >> PAGESHIFT()) & (PTRS_PER_PTE - 1))
-+
-+/*
-+ * 5-levels / 4K pages
-+ *
-+ * sv57
-+ * PGD | P4D | PUD | PMD | PTE | OFFSET |
-+ * 9 | 9 | 9 | 9 | 9 | 12 |
-+ */
-+#define pgd_index_l5_4k(addr) (((addr) >> PGD_SHIFT_L5) & (PTRS_PER_PGD - 1))
-+#define p4d_index_l5_4k(addr) (((addr) >> P4D_SHIFT) & (PTRS_PER_P4D - 1))
-+#define pud_index_l5_4k(addr) (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))
-+#define pmd_index_l5_4k(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
-+#define pte_index_l5_4k(addr) (((addr) >> PAGESHIFT()) & (PTRS_PER_PTE - 1))
-+
-+#define VM_L3_4K (0x2)
-+#define VM_L3_2M (0x4)
-+#define VM_L3_1G (0x8)
-+#define VM_L4_4K (0x10)
-+#define VM_L4_2M (0x20)
-+#define VM_L4_1G (0x40)
-+#define VM_L5_4K (0x80)
-+#define VM_L5_2M (0x100)
-+#define VM_L5_1G (0x200)
-+
-+#define VM_FLAGS (VM_L3_4K | VM_L3_2M | VM_L3_1G | \
-+ VM_L4_4K | VM_L4_2M | VM_L4_1G | \
-+ VM_L5_4K | VM_L5_2M | VM_L5_1G)
-+
- /*
- * Direct memory mapping
- */
-@@ -3547,6 +3626,14 @@ struct arm64_stackframe {
- #define PHYS_MASK_SHIFT _MAX_PHYSMEM_BITS
- #define PHYS_MASK (((1UL) << PHYS_MASK_SHIFT) - 1)
-
-+#define IS_LAST_P4D_READ(p4d) ((ulong)(p4d) == machdep->machspec->last_p4d_read)
-+#define FILL_P4D(P4D, TYPE, SIZE) \
-+ if (!IS_LAST_P4D_READ(P4D)) { \
-+ readmem((ulonglong)((ulong)(P4D)), TYPE, machdep->machspec->p4d, \
-+ SIZE, "p4d page", FAULT_ON_ERROR); \
-+ machdep->machspec->last_p4d_read = (ulong)(P4D); \
-+ }
-+
- #endif /* RISCV64 */
-
- #ifdef X86
-@@ -6834,6 +6921,10 @@ struct machine_specific {
- ulong _page_soft;
-
- ulong _pfn_shift;
-+ ulong va_bits;
-+ char *p4d;
-+ ulong last_p4d_read;
-+ ulong struct_page_size;
-
- struct riscv64_register *crash_task_regs;
- };
-@@ -6857,6 +6948,12 @@ struct machine_specific {
- #define _PAGE_PROT_NONE _PAGE_READ
- #define _PAGE_PFN_SHIFT 10
-
-+/* from 'struct pt_regs' definitions of RISC-V arch */
-+#define RISCV64_REGS_EPC 0
-+#define RISCV64_REGS_RA 1
-+#define RISCV64_REGS_SP 2
-+#define RISCV64_REGS_FP 8
-+
- #endif /* RISCV64 */
-
- /*
-diff --git a/diskdump.c b/diskdump.c
-index 28503bc286f8..cf5f5d9ec59b 100644
---- a/diskdump.c
-+++ b/diskdump.c
-@@ -1531,6 +1531,12 @@ get_diskdump_regs_mips(struct bt_info *bt, ulong *eip, ulong *esp)
- machdep->get_stack_frame(bt, eip, esp);
- }
-
-+static void
-+get_diskdump_regs_riscv64(struct bt_info *bt, ulong *eip, ulong *esp)
-+{
-+ machdep->get_stack_frame(bt, eip, esp);
-+}
-+
- static void
- get_diskdump_regs_sparc64(struct bt_info *bt, ulong *eip, ulong *esp)
- {
-@@ -1610,6 +1616,10 @@ get_diskdump_regs(struct bt_info *bt, ulong *eip, ulong *esp)
- get_diskdump_regs_sparc64(bt, eip, esp);
- break;
-
-+ case EM_RISCV:
-+ get_diskdump_regs_riscv64(bt, eip, esp);
-+ break;
-+
- default:
- error(FATAL, "%s: unsupported machine type: %s\n",
- DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
-diff --git a/riscv64.c b/riscv64.c
-index 4f858a418a8c..d8de3d56e1b7 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -16,10 +16,314 @@
- #ifdef RISCV64
-
- #include <elf.h>
-+#include <math.h>
-+
-+static ulong riscv64_get_page_size(void);
-+static int riscv64_vtop_3level_4k(ulong *pgd, ulong vaddr,
-+ physaddr_t *paddr, int verbose);
-+static int riscv64_vtop_4level_4k(ulong *pgd, ulong vaddr,
-+ physaddr_t *paddr, int verbose);
-+static int riscv64_vtop_5level_4k(ulong *pgd, ulong vaddr,
-+ physaddr_t *paddr, int verbose);
-+static void riscv64_page_type_init(void);
-+static int riscv64_is_kvaddr(ulong vaddr);
-+static int riscv64_is_uvaddr(ulong vaddr, struct task_context *tc);
-+static int riscv64_uvtop(struct task_context *tc, ulong vaddr,
-+ physaddr_t *paddr, int verbose);
-+static int riscv64_kvtop(struct task_context *tc, ulong kvaddr,
-+ physaddr_t *paddr, int verbose);
-+static void riscv64_cmd_mach(void);
-+static int riscv64_translate_pte(ulong, void *, ulonglong);
-+static int riscv64_init_active_task_regs(void);
-+static int riscv64_get_crash_notes(void);
-+static int riscv64_get_elf_notes(void);
-+static void riscv64_get_va_range(struct machine_specific *ms);
-+static void riscv64_get_va_bits(struct machine_specific *ms);
-+static void riscv64_get_struct_page_size(struct machine_specific *ms);
-+
-+#define REG_FMT "%016lx"
-+#define SZ_2G 0x80000000
-+
-+/*
-+ * Holds registers during the crash.
-+ */
-+static struct riscv64_register *panic_task_regs;
-+
-+/* from arch/riscv/include/asm/stacktrace.h */
-+struct stackframe {
-+ ulong fp;
-+ ulong ra;
-+};
-+
-+static struct machine_specific riscv64_machine_specific = {
-+ ._page_present = (1 << 0),
-+ ._page_read = (1 << 1),
-+ ._page_write = (1 << 2),
-+ ._page_exec = (1 << 3),
-+ ._page_user = (1 << 4),
-+ ._page_global = (1 << 5),
-+ ._page_accessed = (1 << 6),
-+ ._page_dirty = (1 << 7),
-+ ._page_soft = (1 << 8),
-+
-+ .va_bits = 0,
-+ .struct_page_size = 0,
-+};
-+
-+static void
-+pt_level_alloc(char **lvl, char *name)
-+{
-+ size_t sz = PAGESIZE();
-+ void *pointer = malloc(sz);
-+
-+ if (!pointer)
-+ error(FATAL, name);
-+ *lvl = pointer;
-+}
-+
-+static ulong
-+riscv64_get_page_size(void)
-+{
-+ return memory_page_size();
-+}
-+
-+static ulong
-+riscv64_vmalloc_start(void)
-+{
-+ return ((ulong)VMALLOC_START);
-+}
-+
-+/* Get the size of struct page {} */
-+static void riscv64_get_struct_page_size(struct machine_specific *ms)
-+{
-+ char *string;
-+
-+ string = pc->read_vmcoreinfo("SIZE(page)");
-+ if (string) {
-+ ms->struct_page_size = atol(string);
-+ free(string);
-+ }
-+}
-+
-+static void
-+riscv64_cmd_mach(void)
-+{
-+ /* TODO: */
-+}
-+
-+static int
-+riscv64_verify_symbol(const char *name, ulong value, char type)
-+{
-+ /* TODO: */
-+ return TRUE;
-+}
-
- void
- riscv64_dump_machdep_table(ulong arg)
- {
-+ /* TODO: */
-+}
-+
-+static ulong
-+riscv64_processor_speed(void)
-+{
-+ /* TODO: */
-+ return 0;
-+}
-+
-+static unsigned long riscv64_get_kernel_version(void)
-+{
-+ char *string;
-+ char buf[BUFSIZE];
-+ char *p1, *p2;
-+
-+ if (THIS_KERNEL_VERSION)
-+ return THIS_KERNEL_VERSION;
-+
-+ string = pc->read_vmcoreinfo("OSRELEASE");
-+ if (string) {
-+ strcpy(buf, string);
-+
-+ p1 = p2 = buf;
-+ while (*p2 != '.')
-+ p2++;
-+ *p2 = NULLCHAR;
-+ kt->kernel_version[0] = atoi(p1);
-+
-+ p1 = ++p2;
-+ while (*p2 != '.')
-+ p2++;
-+ *p2 = NULLCHAR;
-+ kt->kernel_version[1] = atoi(p1);
-+
-+ p1 = ++p2;
-+ while ((*p2 >= '0') && (*p2 <= '9'))
-+ p2++;
-+ *p2 = NULLCHAR;
-+ kt->kernel_version[2] = atoi(p1);
-+ free(string);
-+ }
-+ return THIS_KERNEL_VERSION;
-+}
-+
-+static void
-+riscv64_get_phys_ram_base(struct machine_specific *ms)
-+{
-+ unsigned long kernel_version = riscv64_get_kernel_version();
-+
-+ /*
-+ * phys_ram_base is defined in Linux kernel since 5.14.
-+ */
-+ if (kernel_version >= LINUX(5,14,0)) {
-+ char *string;
-+ if ((string = pc->read_vmcoreinfo("NUMBER(phys_ram_base)"))) {
-+ ms->phys_base = atol(string);
-+ free(string);
-+ } else
-+ error(FATAL, "cannot read phys_ram_base\n");
-+ } else
-+ /*
-+ * For qemu rv64 env and hardware platform, default phys base
-+ * may different, eg,
-+ * hardware platform: 0x200000
-+ * qemu rv64 env: 0x80200000
-+ *
-+ * But we only can set one default value, in this case, qemu
-+ * rv64 env may can't work.
-+ */
-+ ms->phys_base = 0x200000;
-+}
-+
-+static void riscv64_get_va_bits(struct machine_specific *ms)
-+{
-+ unsigned long kernel_version = riscv64_get_kernel_version();
-+
-+ /*
-+ * VA_BITS is defined in Linux kernel since 5.17. So we use the
-+ * default va bits 39 when Linux version < 5.17.
-+ */
-+ if (kernel_version >= LINUX(5,17,0)) {
-+ char *string;
-+ if ((string = pc->read_vmcoreinfo("NUMBER(VA_BITS)"))) {
-+ ms->va_bits = atol(string);
-+ free(string);
-+ }
-+ } else
-+ ms->va_bits = 39;
-+}
-+
-+static void riscv64_get_va_range(struct machine_specific *ms)
-+{
-+ unsigned long kernel_version = riscv64_get_kernel_version();
-+ char *string;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(PAGE_OFFSET)"))) {
-+ ms->page_offset = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(VMALLOC_START)"))) {
-+ ms->vmalloc_start_addr = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(VMALLOC_END)"))) {
-+ ms->vmalloc_end = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(VMEMMAP_START)"))) {
-+ ms->vmemmap_vaddr = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(VMEMMAP_END)"))) {
-+ ms->vmemmap_end = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(KERNEL_LINK_ADDR)"))) {
-+ ms->kernel_link_addr = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ /*
-+ * From Linux 5.13, the kernel mapping is moved to the last 2GB
-+ * of the address space, modules use the 2GB memory range right
-+ * before the kernel. Before Linux 5.13, modules area is embedded
-+ * in vmalloc area.
-+ *
-+ */
-+ if (kernel_version >= LINUX(5,13,0)) {
-+ if ((string = pc->read_vmcoreinfo("NUMBER(MODULES_VADDR)"))) {
-+ ms->modules_vaddr = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+
-+ if ((string = pc->read_vmcoreinfo("NUMBER(MODULES_END)"))) {
-+ ms->modules_end = htol(string, QUIET, NULL);
-+ free(string);
-+ } else
-+ goto error;
-+ } else {
-+ ms->modules_vaddr = ms->vmalloc_start_addr;
-+ ms->modules_end = ms->vmalloc_end;
-+ }
-+
-+ if (CRASHDEBUG(1)) {
-+ fprintf(fp, "vmemmap : 0x%lx - 0x%lx\n",
-+ ms->vmemmap_vaddr, ms->vmemmap_end);
-+ fprintf(fp, "vmalloc : 0x%lx - 0x%lx\n",
-+ ms->vmalloc_start_addr, ms->vmalloc_end);
-+ fprintf(fp, "mudules : 0x%lx - 0x%lx\n",
-+ ms->modules_vaddr, ms->modules_end);
-+ fprintf(fp, "lowmem : 0x%lx -\n", ms->page_offset);
-+ fprintf(fp, "kernel link addr : 0x%lx\n",
-+ ms->kernel_link_addr);
-+ }
-+ return;
-+error:
-+ error(FATAL, "cannot get vm layout\n");
-+}
-+
-+static int
-+riscv64_is_kvaddr(ulong vaddr)
-+{
-+ if (IS_VMALLOC_ADDR(vaddr))
-+ return TRUE;
-+
-+ return (vaddr >= machdep->kvbase);
-+}
-+
-+static int
-+riscv64_is_uvaddr(ulong vaddr, struct task_context *unused)
-+{
-+ if (IS_VMALLOC_ADDR(vaddr))
-+ return FALSE;
-+
-+ return (vaddr < machdep->kvbase);
-+}
-+
-+static int
-+riscv64_is_task_addr(ulong task)
-+{
-+ if (tt->flags & THREAD_INFO)
-+ return IS_KVADDR(task);
-+
-+ return (IS_KVADDR(task) && ALIGNED_STACK_OFFSET(task) == 0);
-+}
-+
-+static int
-+riscv64_get_smp_cpus(void)
-+{
-+ return (get_cpus_present() > 0) ? get_cpus_present() : kt->cpus;
- }
-
- /*
-@@ -33,11 +337,701 @@ riscv64_IS_VMALLOC_ADDR(ulong vaddr)
- (vaddr >= MODULES_VADDR && vaddr <= MODULES_END));
- }
-
-+/*
-+ * Translate a PTE, returning TRUE if the page is present.
-+ * If a physaddr pointer is passed in, don't print anything.
-+ */
-+static int
-+riscv64_translate_pte(ulong pte, void *physaddr, ulonglong unused)
-+{
-+ char ptebuf[BUFSIZE];
-+ char physbuf[BUFSIZE];
-+ char buf[BUFSIZE];
-+ int page_present;
-+ int len1, len2, others;
-+ ulong paddr;
-+
-+ paddr = PTOB(pte >> _PAGE_PFN_SHIFT);
-+ page_present = !!(pte & _PAGE_PRESENT);
-+
-+ if (physaddr) {
-+ *(ulong *)physaddr = paddr;
-+ return page_present;
-+ }
-+
-+ sprintf(ptebuf, "%lx", pte);
-+ len1 = MAX(strlen(ptebuf), strlen("PTE"));
-+ fprintf(fp, "%s ", mkstring(buf, len1, CENTER | LJUST, "PTE"));
-+
-+ if (!page_present)
-+ return page_present;
-+
-+ sprintf(physbuf, "%lx", paddr);
-+ len2 = MAX(strlen(physbuf), strlen("PHYSICAL"));
-+ fprintf(fp, "%s ", mkstring(buf, len2, CENTER | LJUST, "PHYSICAL"));
-+
-+ fprintf(fp, "FLAGS\n");
-+ fprintf(fp, "%s %s ",
-+ mkstring(ptebuf, len1, CENTER | RJUST, NULL),
-+ mkstring(physbuf, len2, CENTER | RJUST, NULL));
-+
-+ fprintf(fp, "(");
-+ others = 0;
-+
-+#define CHECK_PAGE_FLAG(flag) \
-+ if ((_PAGE_##flag) && (pte & _PAGE_##flag)) \
-+ fprintf(fp, "%s" #flag, others++ ? "|" : "")
-+ if (pte) {
-+ CHECK_PAGE_FLAG(PRESENT);
-+ CHECK_PAGE_FLAG(READ);
-+ CHECK_PAGE_FLAG(WRITE);
-+ CHECK_PAGE_FLAG(EXEC);
-+ CHECK_PAGE_FLAG(USER);
-+ CHECK_PAGE_FLAG(GLOBAL);
-+ CHECK_PAGE_FLAG(ACCESSED);
-+ CHECK_PAGE_FLAG(DIRTY);
-+ CHECK_PAGE_FLAG(SOFT);
-+ } else {
-+ fprintf(fp, "no mapping");
-+ }
-+
-+ fprintf(fp, ")\n");
-+
-+ return page_present;
-+}
-+
-+static void
-+riscv64_page_type_init(void)
-+{
-+ ulong va_bits = machdep->machspec->va_bits;
-+
-+ /*
-+ * For RISCV64 arch, any level of PTE may be a leaf PTE,
-+ * so in addition to 4KiB pages,
-+ * Sv39 supports 2 MiB megapages, 1 GiB gigapages;
-+ * Sv48 supports 2 MiB megapages, 1 GiB gigapages, 512 GiB terapages;
-+ * Sv57 supports 2 MiB megapages, 1 GiB gigapages, 512 GiB terapages, and 256 TiB petapages.
-+ *
-+ * refs to riscv-privileged spec.
-+ *
-+ * We just support 4KiB, 2MiB, 1GiB now.
-+ */
-+ switch (machdep->pagesize)
-+ {
-+ case 0x1000: // 4 KiB
-+ machdep->flags |= (va_bits == 57 ? VM_L5_4K :
-+ (va_bits == 48 ? VM_L4_4K : VM_L3_4K));
-+ break;
-+ case 0x200000: // 2 MiB
-+ /* TODO: */
-+ case 0x40000000: // 1 GiB
-+ /* TODO: */
-+ default:
-+ if (machdep->pagesize)
-+ error(FATAL, "invalid/unsupported page size: %d\n",
-+ machdep->pagesize);
-+ else
-+ error(FATAL, "cannot determine page size\n");
-+ }
-+}
-+
-+static int
-+riscv64_vtop_3level_4k(ulong *pgd, ulong vaddr, physaddr_t *paddr, int verbose)
-+{
-+ ulong *pgd_ptr, pgd_val;
-+ ulong pmd_val;
-+ ulong pte_val, pte_pfn;
-+ ulong pt_phys;
-+
-+ /* PGD */
-+ pgd_ptr = pgd + pgd_index_l3_4k(vaddr);
-+ FILL_PGD(pgd, KVADDR, PAGESIZE());
-+ pgd_val = ULONG(machdep->pgd + PAGEOFFSET(pgd_ptr));
-+ if (verbose)
-+ fprintf(fp, " PGD: %lx => %lx\n", (ulong)pgd_ptr, pgd_val);
-+ if (!pgd_val)
-+ goto no_page;
-+ pgd_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pgd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PMD */
-+ FILL_PMD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pmd_val = ULONG(machdep->pmd + PAGEOFFSET(sizeof(pmd_t) *
-+ pmd_index_l3_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PMD: %016lx => %016lx\n", pt_phys, pmd_val);
-+ if (!pmd_val)
-+ goto no_page;
-+ pmd_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pmd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PTE */
-+ FILL_PTBL(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pte_val = ULONG(machdep->ptbl + PAGEOFFSET(sizeof(pte_t) *
-+ pte_index_l3_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PTE: %lx => %lx\n", pt_phys, pte_val);
-+ if (!pte_val)
-+ goto no_page;
-+ pte_val &= PTE_PFN_PROT_MASK;
-+ pte_pfn = pte_val >> _PAGE_PFN_SHIFT;
-+
-+ if (!(pte_val & _PAGE_PRESENT)) {
-+ if (verbose) {
-+ fprintf(fp, "\n");
-+ riscv64_translate_pte((ulong)pte_val, 0, 0);
-+ }
-+ fprintf(fp, " PAGE: %016lx not present\n\n", PAGEBASE(*paddr));
-+ return FALSE;
-+ }
-+
-+ *paddr = PTOB(pte_pfn) + PAGEOFFSET(vaddr);
-+
-+ if (verbose) {
-+ fprintf(fp, " PAGE: %016lx\n\n", PAGEBASE(*paddr));
-+ riscv64_translate_pte(pte_val, 0, 0);
-+ }
-+
-+ return TRUE;
-+no_page:
-+ fprintf(fp, "invalid\n");
-+ return FALSE;
-+}
-+
-+static int
-+riscv64_vtop_4level_4k(ulong *pgd, ulong vaddr, physaddr_t *paddr, int verbose)
-+{
-+ ulong *pgd_ptr, pgd_val;
-+ ulong pud_val;
-+ ulong pmd_val;
-+ ulong pte_val, pte_pfn;
-+ ulong pt_phys;
-+
-+ /* PGD */
-+ pgd_ptr = pgd + pgd_index_l4_4k(vaddr);
-+ FILL_PGD(pgd, KVADDR, PAGESIZE());
-+ pgd_val = ULONG(machdep->pgd + PAGEOFFSET(pgd_ptr));
-+ if (verbose)
-+ fprintf(fp, " PGD: %lx => %lx\n", (ulong)pgd_ptr, pgd_val);
-+ if (!pgd_val)
-+ goto no_page;
-+ pgd_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pgd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PUD */
-+ FILL_PUD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pud_val = ULONG(machdep->pud + PAGEOFFSET(sizeof(pud_t) *
-+ pud_index_l4_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PUD: %016lx => %016lx\n", pt_phys, pud_val);
-+ if (!pud_val)
-+ goto no_page;
-+ pud_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pud_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PMD */
-+ FILL_PMD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pmd_val = ULONG(machdep->pmd + PAGEOFFSET(sizeof(pmd_t) *
-+ pmd_index_l4_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PMD: %016lx => %016lx\n", pt_phys, pmd_val);
-+ if (!pmd_val)
-+ goto no_page;
-+ pmd_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pmd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PTE */
-+ FILL_PTBL(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pte_val = ULONG(machdep->ptbl + PAGEOFFSET(sizeof(pte_t) *
-+ pte_index_l4_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PTE: %lx => %lx\n", pt_phys, pte_val);
-+ if (!pte_val)
-+ goto no_page;
-+ pte_val &= PTE_PFN_PROT_MASK;
-+ pte_pfn = pte_val >> _PAGE_PFN_SHIFT;
-+
-+ if (!(pte_val & _PAGE_PRESENT)) {
-+ if (verbose) {
-+ fprintf(fp, "\n");
-+ riscv64_translate_pte((ulong)pte_val, 0, 0);
-+ }
-+ fprintf(fp, " PAGE: %016lx not present\n\n", PAGEBASE(*paddr));
-+ return FALSE;
-+ }
-+
-+ *paddr = PTOB(pte_pfn) + PAGEOFFSET(vaddr);
-+
-+ if (verbose) {
-+ fprintf(fp, " PAGE: %016lx\n\n", PAGEBASE(*paddr));
-+ riscv64_translate_pte(pte_val, 0, 0);
-+ }
-+
-+ return TRUE;
-+no_page:
-+ fprintf(fp, "invalid\n");
-+ return FALSE;
-+}
-+
-+static int
-+riscv64_vtop_5level_4k(ulong *pgd, ulong vaddr, physaddr_t *paddr, int verbose)
-+{
-+ ulong *pgd_ptr, pgd_val;
-+ ulong p4d_val;
-+ ulong pud_val;
-+ ulong pmd_val;
-+ ulong pte_val, pte_pfn;
-+ ulong pt_phys;
-+
-+ /* PGD */
-+ pgd_ptr = pgd + pgd_index_l5_4k(vaddr);
-+ FILL_PGD(pgd, KVADDR, PAGESIZE());
-+ pgd_val = ULONG(machdep->pgd + PAGEOFFSET(pgd_ptr));
-+ if (verbose)
-+ fprintf(fp, " PGD: %lx => %lx\n", (ulong)pgd_ptr, pgd_val);
-+ if (!pgd_val)
-+ goto no_page;
-+ pgd_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pgd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* P4D */
-+ FILL_P4D(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ p4d_val = ULONG(machdep->machspec->p4d + PAGEOFFSET(sizeof(p4d_t) *
-+ p4d_index_l5_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " P4D: %016lx => %016lx\n", pt_phys, p4d_val);
-+ if (!p4d_val)
-+ goto no_page;
-+ p4d_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (p4d_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PUD */
-+ FILL_PUD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pud_val = ULONG(machdep->pud + PAGEOFFSET(sizeof(pud_t) *
-+ pud_index_l5_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PUD: %016lx => %016lx\n", pt_phys, pud_val);
-+ if (!pud_val)
-+ goto no_page;
-+ pud_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pud_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PMD */
-+ FILL_PMD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pmd_val = ULONG(machdep->pmd + PAGEOFFSET(sizeof(pmd_t) *
-+ pmd_index_l4_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PMD: %016lx => %016lx\n", pt_phys, pmd_val);
-+ if (!pmd_val)
-+ goto no_page;
-+ pmd_val &= PTE_PFN_PROT_MASK;
-+ pt_phys = (pmd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
-+
-+ /* PTE */
-+ FILL_PTBL(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-+ pte_val = ULONG(machdep->ptbl + PAGEOFFSET(sizeof(pte_t) *
-+ pte_index_l4_4k(vaddr)));
-+ if (verbose)
-+ fprintf(fp, " PTE: %lx => %lx\n", pt_phys, pte_val);
-+ if (!pte_val)
-+ goto no_page;
-+ pte_val &= PTE_PFN_PROT_MASK;
-+ pte_pfn = pte_val >> _PAGE_PFN_SHIFT;
-+
-+ if (!(pte_val & _PAGE_PRESENT)) {
-+ if (verbose) {
-+ fprintf(fp, "\n");
-+ riscv64_translate_pte((ulong)pte_val, 0, 0);
-+ }
-+ printf("!_PAGE_PRESENT\n");
-+ return FALSE;
-+ }
-+
-+ *paddr = PTOB(pte_pfn) + PAGEOFFSET(vaddr);
-+
-+ if (verbose) {
-+ fprintf(fp, " PAGE: %016lx\n\n", PAGEBASE(*paddr));
-+ riscv64_translate_pte(pte_val, 0, 0);
-+ }
-+
-+ return TRUE;
-+no_page:
-+ fprintf(fp, "invalid\n");
-+ return FALSE;
-+}
-+
-+static int
-+riscv64_init_active_task_regs(void)
-+{
-+ int retval;
-+
-+ retval = riscv64_get_crash_notes();
-+ if (retval == TRUE)
-+ return retval;
-+
-+ return riscv64_get_elf_notes();
-+}
-+
-+/*
-+ * Retrieve task registers for the time of the crash.
-+ */
-+static int
-+riscv64_get_crash_notes(void)
-+{
-+ struct machine_specific *ms = machdep->machspec;
-+ ulong crash_notes;
-+ Elf64_Nhdr *note;
-+ ulong offset;
-+ char *buf, *p;
-+ ulong *notes_ptrs;
-+ ulong i;
-+
-+ /*
-+ * crash_notes contains per cpu memory for storing cpu states
-+ * in case of system crash.
-+ */
-+ if (!symbol_exists("crash_notes"))
-+ return FALSE;
-+
-+ crash_notes = symbol_value("crash_notes");
-+
-+ notes_ptrs = (ulong *)GETBUF(kt->cpus*sizeof(notes_ptrs[0]));
-+
-+ /*
-+ * Read crash_notes for the first CPU. crash_notes are in standard ELF
-+ * note format.
-+ */
-+ if (!readmem(crash_notes, KVADDR, ¬es_ptrs[kt->cpus-1],
-+ sizeof(notes_ptrs[kt->cpus-1]), "crash_notes",
-+ RETURN_ON_ERROR)) {
-+ error(WARNING, "cannot read crash_notes\n");
-+ FREEBUF(notes_ptrs);
-+ return FALSE;
-+ }
-+
-+ if (symbol_exists("__per_cpu_offset")) {
-+
-+ /*
-+ * Add __per_cpu_offset for each cpu to form the pointer to the notes
-+ */
-+ for (i = 0; i < kt->cpus; i++)
-+ notes_ptrs[i] = notes_ptrs[kt->cpus-1] + kt->__per_cpu_offset[i];
-+ }
-+
-+ buf = GETBUF(SIZE(note_buf));
-+
-+ if (!(panic_task_regs = calloc((size_t)kt->cpus, sizeof(*panic_task_regs))))
-+ error(FATAL, "cannot calloc panic_task_regs space\n");
-+
-+ for (i = 0; i < kt->cpus; i++) {
-+
-+ if (!readmem(notes_ptrs[i], KVADDR, buf, SIZE(note_buf), "note_buf_t",
-+ RETURN_ON_ERROR)) {
-+ error(WARNING,
-+ "cannot find NT_PRSTATUS note for cpu: %d\n", i);
-+ goto fail;
-+ }
-+
-+ /*
-+ * Do some sanity checks for this note before reading registers from it.
-+ */
-+ note = (Elf64_Nhdr *)buf;
-+ p = buf + sizeof(Elf64_Nhdr);
-+
-+ /*
-+ * dumpfiles created with qemu won't have crash_notes, but there will
-+ * be elf notes; dumpfiles created by kdump do not create notes for
-+ * offline cpus.
-+ */
-+ if (note->n_namesz == 0 && (DISKDUMP_DUMPFILE() || KDUMP_DUMPFILE())) {
-+ if (DISKDUMP_DUMPFILE())
-+ note = diskdump_get_prstatus_percpu(i);
-+ else if (KDUMP_DUMPFILE())
-+ note = netdump_get_prstatus_percpu(i);
-+ if (note) {
-+ /*
-+ * SIZE(note_buf) accounts for a "final note", which is a
-+ * trailing empty elf note header.
-+ */
-+ long notesz = SIZE(note_buf) - sizeof(Elf64_Nhdr);
-+
-+ if (sizeof(Elf64_Nhdr) + roundup(note->n_namesz, 4) +
-+ note->n_descsz == notesz)
-+ BCOPY((char *)note, buf, notesz);
-+ } else {
-+ error(WARNING,
-+ "cannot find NT_PRSTATUS note for cpu: %d\n", i);
-+ continue;
-+ }
-+ }
-+
-+ /*
-+ * Check the sanity of NT_PRSTATUS note only for each online cpu.
-+ */
-+ if (note->n_type != NT_PRSTATUS) {
-+ error(WARNING, "invalid NT_PRSTATUS note (n_type != NT_PRSTATUS)\n");
-+ goto fail;
-+ }
-+ if (!STRNEQ(p, "CORE")) {
-+ error(WARNING, "invalid NT_PRSTATUS note (name != \"CORE\"\n");
-+ goto fail;
-+ }
-+
-+ /*
-+ * Find correct location of note data. This contains elf_prstatus
-+ * structure which has registers etc. for the crashed task.
-+ */
-+ offset = sizeof(Elf64_Nhdr);
-+ offset = roundup(offset + note->n_namesz, 4);
-+ p = buf + offset; /* start of elf_prstatus */
-+
-+ BCOPY(p + OFFSET(elf_prstatus_pr_reg), &panic_task_regs[i],
-+ sizeof(panic_task_regs[i]));
-+ }
-+
-+ /*
-+ * And finally we have the registers for the crashed task. This is
-+ * used later on when dumping backtrace.
-+ */
-+ ms->crash_task_regs = panic_task_regs;
-+
-+ FREEBUF(buf);
-+ FREEBUF(notes_ptrs);
-+ return TRUE;
-+
-+fail:
-+ FREEBUF(buf);
-+ FREEBUF(notes_ptrs);
-+ free(panic_task_regs);
-+ return FALSE;
-+}
-+
-+static int
-+riscv64_get_elf_notes(void)
-+{
-+ struct machine_specific *ms = machdep->machspec;
-+ int i;
-+
-+ if (!DISKDUMP_DUMPFILE() && !KDUMP_DUMPFILE())
-+ return FALSE;
-+
-+ panic_task_regs = calloc(kt->cpus, sizeof(*panic_task_regs));
-+ if (!panic_task_regs)
-+ error(FATAL, "cannot calloc panic_task_regs space\n");
-+
-+ for (i = 0; i < kt->cpus; i++) {
-+ Elf64_Nhdr *note = NULL;
-+ size_t len;
-+
-+ if (DISKDUMP_DUMPFILE())
-+ note = diskdump_get_prstatus_percpu(i);
-+ else if (KDUMP_DUMPFILE())
-+ note = netdump_get_prstatus_percpu(i);
-+
-+ if (!note) {
-+ error(WARNING,
-+ "cannot find NT_PRSTATUS note for cpu: %d\n", i);
-+ continue;
-+ }
-+
-+ len = sizeof(Elf64_Nhdr);
-+ len = roundup(len + note->n_namesz, 4);
-+
-+ BCOPY((char *)note + len + OFFSET(elf_prstatus_pr_reg),
-+ &panic_task_regs[i], sizeof(panic_task_regs[i]));
-+ }
-+
-+ ms->crash_task_regs = panic_task_regs;
-+
-+ return TRUE;
-+}
-+
-+/*
-+ * Translates a user virtual address to its physical address.
-+ */
-+static int
-+riscv64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose)
-+{
-+ ulong mm, active_mm;
-+ ulong *pgd;
-+
-+ if (!tc)
-+ error(FATAL, "current context invalid\n");
-+
-+ *paddr = 0;
-+
-+ if (is_kernel_thread(tc->task) && IS_KVADDR(uvaddr)) {
-+ readmem(tc->task + OFFSET(task_struct_active_mm),
-+ KVADDR, &active_mm, sizeof(void *),
-+ "task active_mm contents", FAULT_ON_ERROR);
-+
-+ if (!active_mm)
-+ error(FATAL,
-+ "no active_mm for this kernel thread\n");
-+
-+ readmem(active_mm + OFFSET(mm_struct_pgd),
-+ KVADDR, &pgd, sizeof(long),
-+ "mm_struct pgd", FAULT_ON_ERROR);
-+ } else {
-+ if ((mm = task_mm(tc->task, TRUE)))
-+ pgd = ULONG_PTR(tt->mm_struct + OFFSET(mm_struct_pgd));
-+ else
-+ readmem(tc->mm_struct + OFFSET(mm_struct_pgd),
-+ KVADDR, &pgd, sizeof(long), "mm_struct pgd",
-+ FAULT_ON_ERROR);
-+ }
-+
-+ switch (machdep->flags & VM_FLAGS)
-+ {
-+ case VM_L3_4K:
-+ return riscv64_vtop_3level_4k(pgd, uvaddr, paddr, verbose);
-+ case VM_L4_4K:
-+ return riscv64_vtop_4level_4k(pgd, uvaddr, paddr, verbose);
-+ case VM_L5_4K:
-+ return riscv64_vtop_5level_4k(pgd, uvaddr, paddr, verbose);
-+ default:
-+ return FALSE;
-+ }
-+}
-+
-+static int
-+riscv64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose)
-+{
-+ ulong kernel_pgd;
-+
-+ if (!IS_KVADDR(kvaddr))
-+ return FALSE;
-+
-+ if (!vt->vmalloc_start) {
-+ *paddr = VTOP(kvaddr);
-+ return TRUE;
-+ }
-+
-+ if (!IS_VMALLOC_ADDR(kvaddr)) {
-+ *paddr = VTOP(kvaddr);
-+ if (!verbose)
-+ return TRUE;
-+ }
-+
-+ kernel_pgd = vt->kernel_pgd[0];
-+ *paddr = 0;
-+
-+ switch (machdep->flags & VM_FLAGS)
-+ {
-+ case VM_L3_4K:
-+ return riscv64_vtop_3level_4k((ulong *)kernel_pgd, kvaddr, paddr, verbose);
-+ case VM_L4_4K:
-+ return riscv64_vtop_4level_4k((ulong *)kernel_pgd, kvaddr, paddr, verbose);
-+ case VM_L5_4K:
-+ return riscv64_vtop_5level_4k((ulong *)kernel_pgd, kvaddr, paddr, verbose);
-+ default:
-+ return FALSE;
-+ }
-+}
-+
- void
- riscv64_init(int when)
- {
-+ switch (when) {
-+ case SETUP_ENV:
-+ machdep->process_elf_notes = process_elf64_notes;
-+ break;
-+
-+ case PRE_SYMTAB:
-+ machdep->verify_symbol = riscv64_verify_symbol;
-+ machdep->machspec = &riscv64_machine_specific;
-+ if (pc->flags & KERNEL_DEBUG_QUERY)
-+ return;
-+
-+ machdep->verify_paddr = generic_verify_paddr;
-+ machdep->ptrs_per_pgd = PTRS_PER_PGD;
-+ break;
-+
-+ case PRE_GDB:
-+ machdep->pagesize = riscv64_get_page_size();
-+ machdep->pageshift = ffs(machdep->pagesize) - 1;
-+ machdep->pageoffset = machdep->pagesize - 1;
-+ machdep->pagemask = ~((ulonglong)machdep->pageoffset);
-+ machdep->stacksize = machdep->pagesize << THREAD_SIZE_ORDER;
-+
-+ riscv64_get_phys_ram_base(machdep->machspec);
-+ riscv64_get_struct_page_size(machdep->machspec);
-+ riscv64_get_va_bits(machdep->machspec);
-+ riscv64_get_va_range(machdep->machspec);
-+
-+ pt_level_alloc(&machdep->pgd, "cannot malloc pgd space.");
-+ pt_level_alloc(&machdep->machspec->p4d, "cannot malloc p4d space.");
-+ pt_level_alloc(&machdep->pud, "cannot malloc pud space.");
-+ pt_level_alloc(&machdep->pmd, "cannot malloc pmd space.");
-+ pt_level_alloc(&machdep->ptbl, "cannot malloc ptbl space.");
-+
-+ machdep->last_pgd_read = 0;
-+ machdep->machspec->last_p4d_read = 0;
-+ machdep->last_pud_read = 0;
-+ machdep->last_pmd_read = 0;
-+ machdep->last_ptbl_read = 0;
-+
-+ machdep->kvbase = machdep->machspec->page_offset;
-+ machdep->identity_map_base = machdep->kvbase;
-+ machdep->is_kvaddr = riscv64_is_kvaddr;
-+ machdep->is_uvaddr = riscv64_is_uvaddr;
-+ machdep->uvtop = riscv64_uvtop;
-+ machdep->kvtop = riscv64_kvtop;
-+ machdep->cmd_mach = riscv64_cmd_mach;
-+
-+ machdep->vmalloc_start = riscv64_vmalloc_start;
-+ machdep->processor_speed = riscv64_processor_speed;
-+ machdep->get_stackbase = generic_get_stackbase;
-+ machdep->get_stacktop = generic_get_stacktop;
-+ machdep->translate_pte = riscv64_translate_pte;
-+ machdep->memory_size = generic_memory_size;
-+ machdep->is_task_addr = riscv64_is_task_addr;
-+ machdep->get_smp_cpus = riscv64_get_smp_cpus;
-+ machdep->value_to_symbol = generic_machdep_value_to_symbol;
-+ machdep->show_interrupts = generic_show_interrupts;
-+ machdep->get_irq_affinity = generic_get_irq_affinity;
-+ machdep->init_kernel_pgd = NULL; /* pgd set by symbol_value("swapper_pg_dir") */
-+ break;
-+
-+ case POST_GDB:
-+ machdep->section_size_bits = _SECTION_SIZE_BITS;
-+ machdep->max_physmem_bits = _MAX_PHYSMEM_BITS;
-+ riscv64_page_type_init();
-+
-+ if (!machdep->hz)
-+ machdep->hz = 250;
-+
-+ if (symbol_exists("irq_desc"))
-+ ARRAY_LENGTH_INIT(machdep->nr_irqs, irq_desc,
-+ "irq_desc", NULL, 0);
-+ else if (kernel_symbol_exists("nr_irqs"))
-+ get_symbol_data("nr_irqs", sizeof(unsigned int),
-+ &machdep->nr_irqs);
-+
-+ MEMBER_OFFSET_INIT(elf_prstatus_pr_reg, "elf_prstatus",
-+ "pr_reg");
-+
-+ STRUCT_SIZE_INIT(note_buf, "note_buf_t");
-+ break;
-+
-+ case POST_VM:
-+ /*
-+ * crash_notes contains machine specific information about the
-+ * crash. In particular, it contains CPU registers at the time
-+ * of the crash. We need this information to extract correct
-+ * backtraces from the panic task.
-+ */
-+ if (!ACTIVE() && !riscv64_init_active_task_regs())
-+ error(WARNING,
-+ "cannot retrieve registers for active task%s\n\n",
-+ kt->cpus > 1 ? "s" : "");
-+ break;
-+ }
- }
-
-+/*
-+ * 'help -r' command output
-+ */
- void
- riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
- {
---
-2.37.1
-
diff --git a/0010-RISCV64-Add-dis-command-support.patch b/0010-RISCV64-Add-dis-command-support.patch
deleted file mode 100644
index 8bfe368..0000000
--- a/0010-RISCV64-Add-dis-command-support.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From b410e14f7865e8c0e28cf2fb7a0092e3a8735645 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:08 +0800
-Subject: [PATCH 10/28] RISCV64: Add 'dis' command support
-
-Use generic_dis_filter() function to support dis command implementation.
-
-With this patch, we can get the disassembled code,
-crash> dis __crash_kexec
-0xffffffff80088580 <__crash_kexec>: addi sp,sp,-352
-0xffffffff80088582 <__crash_kexec+2>: sd s0,336(sp)
-0xffffffff80088584 <__crash_kexec+4>: sd s1,328(sp)
-0xffffffff80088586 <__crash_kexec+6>: sd s2,320(sp)
-0xffffffff80088588 <__crash_kexec+8>: addi s0,sp,352
-0xffffffff8008858a <__crash_kexec+10>: sd ra,344(sp)
-0xffffffff8008858c <__crash_kexec+12>: sd s3,312(sp)
-0xffffffff8008858e <__crash_kexec+14>: sd s4,304(sp)
-0xffffffff80088590 <__crash_kexec+16>: auipc s2,0x1057
-0xffffffff80088594 <__crash_kexec+20>: addi s2,s2,-1256
-0xffffffff80088598 <__crash_kexec+24>: ld a5,0(s2)
-0xffffffff8008859c <__crash_kexec+28>: mv s1,a0
-0xffffffff8008859e <__crash_kexec+30>: auipc a0,0xfff
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- riscv64.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/riscv64.c b/riscv64.c
-index d8de3d56e1b7..1e20a09a81ae 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -988,6 +988,7 @@ riscv64_init(int when)
- machdep->is_task_addr = riscv64_is_task_addr;
- machdep->get_smp_cpus = riscv64_get_smp_cpus;
- machdep->value_to_symbol = generic_machdep_value_to_symbol;
-+ machdep->dis_filter = generic_dis_filter;
- machdep->show_interrupts = generic_show_interrupts;
- machdep->get_irq_affinity = generic_get_irq_affinity;
- machdep->init_kernel_pgd = NULL; /* pgd set by symbol_value("swapper_pg_dir") */
---
-2.37.1
-
diff --git a/0010-Revert-Fix-segfault-in-arm64_is_kernel_exception_fra.patch b/0010-Revert-Fix-segfault-in-arm64_is_kernel_exception_fra.patch
new file mode 100644
index 0000000..a6a46bb
--- /dev/null
+++ b/0010-Revert-Fix-segfault-in-arm64_is_kernel_exception_fra.patch
@@ -0,0 +1,69 @@
+From 91a76958e4a8a9fb67ac61166ff36e8dc961b3b9 Mon Sep 17 00:00:00 2001
+From: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Date: Wed, 7 Jun 2023 18:37:33 +0900
+Subject: [PATCH 10/13] Revert "Fix segfault in
+ arm64_is_kernel_exception_frame() when corrupt stack pointer address is
+ given"
+
+This reverts commit 9868ebc8e648e5791764a51567a23efae7170d9b.
+
+The commit 9868ebc8e648e5791764a51567a23efae7170d9b causes the issue
+that bt command fails to show backtraces for the tasks that is running
+in the user mode at the moment of the kernel panic as follows:
+
+ crash> bt 1734
+ PID: 1734 TASK: ffff000000392200 CPU: 4 COMMAND: "insmod"
+ bt: invalid stack pointer is given
+
+The root cause is that while the commit added a sanity check into
+STACK_OFFSET_TYPE() to validate if a given candidate address of any
+interrupt or exception frame is contained within the range of the
+corresponding kernel stack, the premise that the STACK_OFFSET_TYPE()
+should not return out-of-the-buffer address, is wrong.
+
+Reexamining the relevant surrounding part of the backtracing code, it
+looks to me now that the STACK_OFFSET_TYPE() is originally expected to
+return an out-of-the-buffer address, like the address of the top of
+the corresponding kernel stack, e.g. at here:
+
+ static int
+ arm64_in_kdump_text(struct bt_info *bt, struct arm64_stackframe *frame)
+ {
+ ...
+ if (bt->flags & BT_USER_SPACE)
+ start = (ulong *)&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(bt->stacktop))];
+ else {
+
+Note that the above bt 1734 aborts here.
+
+Hence, the current implementation policy around STACK_OFFSET_TYPE()
+looks that the caller side is responsible for understanding the fact
+in advance and for avoiding making buffer overrun carefully.
+
+To fix this issue, revert the commit.
+
+Signed-off-by: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/defs.h b/defs.h
+index bfda0c48d37b..3e7d6cfbc6a8 100644
+--- a/defs.h
++++ b/defs.h
+@@ -976,10 +976,7 @@ struct bt_info {
+
+ #define STACK_OFFSET_TYPE(OFF) \
+ (((ulong)(OFF) > STACKSIZE()) ? \
+- (((ulong)(OFF) < (ulong)(bt->stackbase) || (ulong)(OFF) >= (ulong)(bt->stackbase) + STACKSIZE()) ? \
+- error(FATAL, "invalid stack pointer is given\n") : \
+- (ulong)((ulong)(OFF) - (ulong)(bt->stackbase))) : \
+- (ulong)(OFF))
++ (ulong)((ulong)(OFF) - (ulong)(bt->stackbase)) : (ulong)(OFF))
+
+ #define GET_STACK_ULONG(OFF) \
+ *((ulong *)((char *)(&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(OFF))])))
+--
+2.37.1
+
diff --git a/0011-RISCV64-Add-irq-command-support.patch b/0011-RISCV64-Add-irq-command-support.patch
deleted file mode 100644
index 769355a..0000000
--- a/0011-RISCV64-Add-irq-command-support.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 67216c741c4ebe8494f74f1ceabff9cdafb67883 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:09 +0800
-Subject: [PATCH 11/28] RISCV64: Add irq command support
-
-With the patch, we can get the irq info,
-crash> irq
- IRQ IRQ_DESC/_DATA IRQACTION NAME
- 0 (unused) (unused)
- 1 ff60000001329600 ff60000001d17180 "101000.rtc"
- 2 ff60000001329800 ff60000001d17680 "ttyS0"
- 3 ff60000001329a00 ff60000001c33c00 "virtio0"
- 4 ff60000001329c00 ff60000001c33f80 "virtio1"
- 5 ff6000000120f400 ff60000001216000 "riscv-timer"
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- riscv64.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/riscv64.c b/riscv64.c
-index 1e20a09a81ae..2355daca7aac 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -989,6 +989,7 @@ riscv64_init(int when)
- machdep->get_smp_cpus = riscv64_get_smp_cpus;
- machdep->value_to_symbol = generic_machdep_value_to_symbol;
- machdep->dis_filter = generic_dis_filter;
-+ machdep->dump_irq = generic_dump_irq;
- machdep->show_interrupts = generic_show_interrupts;
- machdep->get_irq_affinity = generic_get_irq_affinity;
- machdep->init_kernel_pgd = NULL; /* pgd set by symbol_value("swapper_pg_dir") */
---
-2.37.1
-
diff --git a/0011-arm64-Fix-again-segfault-in-arm64_is_kernel_exceptio.patch b/0011-arm64-Fix-again-segfault-in-arm64_is_kernel_exceptio.patch
new file mode 100644
index 0000000..f6a53cc
--- /dev/null
+++ b/0011-arm64-Fix-again-segfault-in-arm64_is_kernel_exceptio.patch
@@ -0,0 +1,45 @@
+From 6c8cd9b5dcf48221e5f75fc5850bb4719d77acce Mon Sep 17 00:00:00 2001
+From: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Date: Wed, 7 Jun 2023 18:37:34 +0900
+Subject: [PATCH 11/13] arm64: Fix again segfault in
+ arm64_is_kernel_exception_frame() when corrupt stack pointer address is given
+
+This is the second trial from the commit
+9868ebc8e648e5791764a51567a23efae7170d9b that was reverted at the
+previous commit.
+
+As described in the previous commit, result of STACK_OFFSET_TYPE() can
+be an address out of bt->stackbuf and hence the address needs to be
+checked prior to being referred to as an pt_regs object.
+
+So, to fix the issue, let's check if stkptr points to within the range
+of the kernel stack first.
+
+[ kh: added a warning at Lianbo's suggestion ]
+
+Signed-off-by: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ arm64.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/arm64.c b/arm64.c
+index efbdccbec9d3..67b1a2244810 100644
+--- a/arm64.c
++++ b/arm64.c
+@@ -2381,6 +2381,12 @@ arm64_is_kernel_exception_frame(struct bt_info *bt, ulong stkptr)
+ struct arm64_pt_regs *regs;
+ struct machine_specific *ms = machdep->machspec;
+
++ if (stkptr > STACKSIZE() && !INSTACK(stkptr, bt)) {
++ if (CRASHDEBUG(1))
++ error(WARNING, "stkptr: %lx is outside the kernel stack range\n", stkptr);
++ return FALSE;
++ }
++
+ regs = (struct arm64_pt_regs *)&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(stkptr))];
+
+ if (INSTACK(regs->sp, bt) && INSTACK(regs->regs[29], bt) &&
+--
+2.37.1
+
diff --git a/0012-RISCV64-Add-bt-command-support.patch b/0012-RISCV64-Add-bt-command-support.patch
deleted file mode 100644
index e005aa3..0000000
--- a/0012-RISCV64-Add-bt-command-support.patch
+++ /dev/null
@@ -1,413 +0,0 @@
-From 0d9fcbe3803c684fbfee893837a94d3c8f377805 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:10 +0800
-Subject: [PATCH 12/28] RISCV64: Add 'bt' command support
-
-1, Add the implementation to get stack frame from active & inactive
- task's stack.
-2, Add 'bt -l' command support get a line number associated with a
- current pc address.
-3, Add 'bt -f' command support to display all stack data contained
- in a frame
-
-With the patch, we can get the backtrace,
-crash> bt
-PID: 113 TASK: ff6000000226c200 CPU: 0 COMMAND: "sh"
- #0 [ff20000010333b90] riscv_crash_save_regs at ffffffff800078f8
- #1 [ff20000010333cf0] panic at ffffffff806578c6
- #2 [ff20000010333d50] sysrq_reset_seq_param_set at ffffffff8038c03c
- #3 [ff20000010333da0] __handle_sysrq at ffffffff8038c604
- #4 [ff20000010333e00] write_sysrq_trigger at ffffffff8038cae4
- #5 [ff20000010333e20] proc_reg_write at ffffffff801b7ee8
- #6 [ff20000010333e40] vfs_write at ffffffff80152bb2
- #7 [ff20000010333e80] ksys_write at ffffffff80152eda
- #8 [ff20000010333ed0] sys_write at ffffffff80152f52
-
-crash> bt -l
-PID: 113 TASK: ff6000000226c200 CPU: 0 COMMAND: "sh"
- #0 [ff20000010333b90] riscv_crash_save_regs at ffffffff800078f8
- /buildroot/qemu_riscv64_virt_defconfig/build/linux-custom/arch/riscv/kernel/crash_save_regs.S: 47
- #1 [ff20000010333cf0] panic at ffffffff806578c6
- /buildroot/qemu_riscv64_virt_defconfig/build/linux-custom/kernel/panic.c: 276
- ... ...
-
-crash> bt -f
-PID: 113 TASK: ff6000000226c200 CPU: 0 COMMAND: "sh"
- #0 [ff20000010333b90] riscv_crash_save_regs at ffffffff800078f8
- [PC: ffffffff800078f8 RA: ffffffff806578c6 SP: ff20000010333b90 SIZE: 352]
- ff20000010333b90: ff20000010333bb0 ffffffff800078f8
- ff20000010333ba0: ffffffff8008862c ff20000010333b90
- ff20000010333bb0: ffffffff810dde38 ff6000000226c200
- ff20000010333bc0: ffffffff8032be68 0720072007200720
- ... ...
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- netdump.c | 13 +++
- riscv64.c | 283 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 296 insertions(+)
-
-diff --git a/netdump.c b/netdump.c
-index 4ec12a073af6..01af1458d6e8 100644
---- a/netdump.c
-+++ b/netdump.c
-@@ -42,6 +42,7 @@ static void get_netdump_regs_ppc64(struct bt_info *, ulong *, ulong *);
- static void get_netdump_regs_arm(struct bt_info *, ulong *, ulong *);
- static void get_netdump_regs_arm64(struct bt_info *, ulong *, ulong *);
- static void get_netdump_regs_mips(struct bt_info *, ulong *, ulong *);
-+static void get_netdump_regs_riscv(struct bt_info *, ulong *, ulong *);
- static void check_dumpfile_size(char *);
- static int proc_kcore_init_32(FILE *, int);
- static int proc_kcore_init_64(FILE *, int);
-@@ -2675,6 +2676,10 @@ get_netdump_regs(struct bt_info *bt, ulong *eip, ulong *esp)
- return get_netdump_regs_mips(bt, eip, esp);
- break;
-
-+ case EM_RISCV:
-+ get_netdump_regs_riscv(bt, eip, esp);
-+ break;
-+
- default:
- error(FATAL,
- "support for ELF machine type %d not available\n",
-@@ -2931,6 +2936,8 @@ display_regs_from_elf_notes(int cpu, FILE *ofp)
- mips_display_regs_from_elf_notes(cpu, ofp);
- } else if (machine_type("MIPS64")) {
- mips64_display_regs_from_elf_notes(cpu, ofp);
-+ } else if (machine_type("RISCV64")) {
-+ riscv64_display_regs_from_elf_notes(cpu, ofp);
- }
- }
-
-@@ -3877,6 +3884,12 @@ get_netdump_regs_mips(struct bt_info *bt, ulong *eip, ulong *esp)
- machdep->get_stack_frame(bt, eip, esp);
- }
-
-+static void
-+get_netdump_regs_riscv(struct bt_info *bt, ulong *eip, ulong *esp)
-+{
-+ machdep->get_stack_frame(bt, eip, esp);
-+}
-+
- int
- is_partial_netdump(void)
- {
-diff --git a/riscv64.c b/riscv64.c
-index 2355daca7aac..4c9b35bb93f2 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -33,6 +33,17 @@ static int riscv64_uvtop(struct task_context *tc, ulong vaddr,
- static int riscv64_kvtop(struct task_context *tc, ulong kvaddr,
- physaddr_t *paddr, int verbose);
- static void riscv64_cmd_mach(void);
-+static void riscv64_stackframe_init(void);
-+static void riscv64_back_trace_cmd(struct bt_info *bt);
-+static int riscv64_get_dumpfile_stack_frame(struct bt_info *bt,
-+ ulong *nip, ulong *ksp);
-+static void riscv64_get_stack_frame(struct bt_info *bt, ulong *pcp,
-+ ulong *spp);
-+static int riscv64_get_frame(struct bt_info *bt, ulong *pcp,
-+ ulong *spp);
-+static void riscv64_display_full_frame(struct bt_info *bt,
-+ struct riscv64_unwind_frame *current,
-+ struct riscv64_unwind_frame *previous);
- static int riscv64_translate_pte(ulong, void *, ulonglong);
- static int riscv64_init_active_task_regs(void);
- static int riscv64_get_crash_notes(void);
-@@ -498,6 +509,275 @@ no_page:
- return FALSE;
- }
-
-+/*
-+ * 'bt -f' command output
-+ * Display all stack data contained in a frame
-+ */
-+static void
-+riscv64_display_full_frame(struct bt_info *bt, struct riscv64_unwind_frame *current,
-+ struct riscv64_unwind_frame *previous)
-+{
-+ int i, u_idx;
-+ ulong *up;
-+ ulong words, addr;
-+ char buf[BUFSIZE];
-+
-+ if (previous->sp < current->sp)
-+ return;
-+
-+ if (!(INSTACK(previous->sp, bt) && INSTACK(current->sp, bt)))
-+ return;
-+
-+ words = (previous->sp - current->sp) / sizeof(ulong) + 1;
-+ addr = current->sp;
-+ u_idx = (current->sp - bt->stackbase) / sizeof(ulong);
-+
-+ for (i = 0; i < words; i++, u_idx++) {
-+ if (!(i & 1))
-+ fprintf(fp, "%s %lx: ", i ? "\n" : "", addr);
-+
-+ up = (ulong *)(&bt->stackbuf[u_idx*sizeof(ulong)]);
-+ fprintf(fp, "%s ", format_stack_entry(bt, buf, *up, 0));
-+ addr += sizeof(ulong);
-+ }
-+ fprintf(fp, "\n");
-+}
-+
-+static void
-+riscv64_stackframe_init(void)
-+{
-+ long task_struct_thread = MEMBER_OFFSET("task_struct", "thread");
-+
-+ /* from arch/riscv/include/asm/processor.h */
-+ long thread_reg_ra = MEMBER_OFFSET("thread_struct", "ra");
-+ long thread_reg_sp = MEMBER_OFFSET("thread_struct", "sp");
-+ long thread_reg_fp = MEMBER_OFFSET("thread_struct", "s");
-+
-+ if ((task_struct_thread == INVALID_OFFSET) ||
-+ (thread_reg_ra == INVALID_OFFSET) ||
-+ (thread_reg_sp == INVALID_OFFSET) ||
-+ (thread_reg_fp == INVALID_OFFSET) )
-+ error(FATAL,
-+ "cannot determine thread_struct offsets\n");
-+
-+ ASSIGN_OFFSET(task_struct_thread_context_pc) =
-+ task_struct_thread + thread_reg_ra;
-+ ASSIGN_OFFSET(task_struct_thread_context_sp) =
-+ task_struct_thread + thread_reg_sp;
-+ ASSIGN_OFFSET(task_struct_thread_context_fp) =
-+ task_struct_thread + thread_reg_fp;
-+}
-+
-+static void
-+riscv64_dump_backtrace_entry(struct bt_info *bt, struct syment *sym,
-+ struct riscv64_unwind_frame *current,
-+ struct riscv64_unwind_frame *previous, int level)
-+{
-+ const char *name = sym ? sym->name : "(invalid)";
-+ struct load_module *lm;
-+ char *name_plus_offset = NULL;
-+ struct syment *symp;
-+ ulong symbol_offset;
-+ char buf[BUFSIZE];
-+
-+ if (bt->flags & BT_SYMBOL_OFFSET) {
-+ symp = value_search(current->pc, &symbol_offset);
-+
-+ if (symp && symbol_offset)
-+ name_plus_offset =
-+ value_to_symstr(current->pc, buf, bt->radix);
-+ }
-+
-+ fprintf(fp, "%s#%d [%016lx] %s at %016lx",
-+ level < 10 ? " " : "",
-+ level,
-+ current->sp,
-+ name_plus_offset ? name_plus_offset : name,
-+ current->pc);
-+
-+ if (module_symbol(current->pc, NULL, &lm, NULL, 0))
-+ fprintf(fp, " [%s]", lm->mod_name);
-+
-+ fprintf(fp, "\n");
-+
-+ /*
-+ * 'bt -l', get a line number associated with a current pc address.
-+ */
-+ if (bt->flags & BT_LINE_NUMBERS) {
-+ get_line_number(current->pc, buf, FALSE);
-+ if (strlen(buf))
-+ fprintf(fp, " %s\n", buf);
-+ }
-+
-+ /* bt -f */
-+ if (bt->flags & BT_FULL) {
-+ fprintf(fp, " "
-+ "[PC: %016lx RA: %016lx SP: %016lx SIZE: %ld]\n",
-+ current->pc,
-+ previous->pc,
-+ current->sp,
-+ previous->sp - current->sp);
-+ riscv64_display_full_frame(bt, current, previous);
-+ }
-+}
-+
-+/*
-+ * Unroll a kernel stack.
-+ */
-+static void
-+riscv64_back_trace_cmd(struct bt_info *bt)
-+{
-+ struct riscv64_unwind_frame current, previous;
-+ struct stackframe curr_frame;
-+ int level = 0;
-+
-+ if (bt->flags & BT_REGS_NOT_FOUND)
-+ return;
-+
-+ current.pc = bt->instptr;
-+ current.sp = bt->stkptr;
-+ current.fp = bt->frameptr;
-+
-+ if (!INSTACK(current.sp, bt))
-+ return;
-+
-+ for (;;) {
-+ struct syment *symbol = NULL;
-+ struct stackframe *frameptr;
-+ ulong low, high;
-+ ulong offset;
-+
-+ if (CRASHDEBUG(8))
-+ fprintf(fp, "level %d pc %#lx sp %lx fp 0x%lx\n",
-+ level, current.pc, current.sp, current.fp);
-+
-+ /* Validate frame pointer */
-+ low = current.sp + sizeof(struct stackframe);
-+ high = bt->stacktop;
-+ if (current.fp < low || current.fp > high || current.fp & 0x7) {
-+ if (CRASHDEBUG(8))
-+ fprintf(fp, "fp 0x%lx sp 0x%lx low 0x%lx high 0x%lx\n",
-+ current.fp, current.sp, low, high);
-+ return;
-+ }
-+
-+ symbol = value_search(current.pc, &offset);
-+ if (!symbol)
-+ return;
-+
-+ frameptr = (struct stackframe *)current.fp - 1;
-+ if (!readmem((ulong)frameptr, KVADDR, &curr_frame,
-+ sizeof(curr_frame), "get stack frame", RETURN_ON_ERROR))
-+ return;
-+
-+ previous.pc = curr_frame.ra;
-+ previous.fp = curr_frame.fp;
-+ previous.sp = current.fp;
-+
-+ riscv64_dump_backtrace_entry(bt, symbol, ¤t, &previous, level++);
-+
-+ current.pc = previous.pc;
-+ current.fp = previous.fp;
-+ current.sp = previous.sp;
-+
-+ if (CRASHDEBUG(8))
-+ fprintf(fp, "next %d pc %#lx sp %#lx fp %lx\n",
-+ level, current.pc, current.sp, current.fp);
-+ }
-+}
-+
-+/*
-+ * Get a stack frame combination of pc and ra from the most relevant spot.
-+ */
-+static void
-+riscv64_get_stack_frame(struct bt_info *bt, ulong *pcp, ulong *spp)
-+{
-+ ulong ksp = 0, nip = 0;
-+ int ret = 0;
-+
-+ if (DUMPFILE() && is_task_active(bt->task))
-+ ret = riscv64_get_dumpfile_stack_frame(bt, &nip, &ksp);
-+ else
-+ ret = riscv64_get_frame(bt, &nip, &ksp);
-+
-+ if (!ret)
-+ error(WARNING, "cannot determine starting stack frame for task %lx\n",
-+ bt->task);
-+
-+ if (pcp)
-+ *pcp = nip;
-+ if (spp)
-+ *spp = ksp;
-+}
-+
-+/*
-+ * Get the starting point for the active cpu in a diskdump.
-+ */
-+static int
-+riscv64_get_dumpfile_stack_frame(struct bt_info *bt, ulong *nip, ulong *ksp)
-+{
-+ const struct machine_specific *ms = machdep->machspec;
-+ struct riscv64_register *regs;
-+ ulong epc, sp;
-+
-+ if (!ms->crash_task_regs) {
-+ bt->flags |= BT_REGS_NOT_FOUND;
-+ return FALSE;
-+ }
-+
-+ /*
-+ * We got registers for panic task from crash_notes. Just return them.
-+ */
-+ regs = &ms->crash_task_regs[bt->tc->processor];
-+ epc = regs->regs[RISCV64_REGS_EPC];
-+ sp = regs->regs[RISCV64_REGS_SP];
-+
-+ /*
-+ * Set stack frame ptr.
-+ */
-+ bt->frameptr = regs->regs[RISCV64_REGS_FP];
-+
-+ if (nip)
-+ *nip = epc;
-+ if (ksp)
-+ *ksp = sp;
-+
-+ bt->machdep = regs;
-+
-+ return TRUE;
-+}
-+
-+/*
-+ * Do the work for riscv64_get_stack_frame() for non-active tasks.
-+ * Get SP and PC values for idle tasks.
-+ */
-+static int
-+riscv64_get_frame(struct bt_info *bt, ulong *pcp, ulong *spp)
-+{
-+ if (!bt->tc || !(tt->flags & THREAD_INFO))
-+ return FALSE;
-+
-+ if (!readmem(bt->task + OFFSET(task_struct_thread_context_pc),
-+ KVADDR, pcp, sizeof(*pcp),
-+ "thread_struct.ra",
-+ RETURN_ON_ERROR))
-+ return FALSE;
-+
-+ if (!readmem(bt->task + OFFSET(task_struct_thread_context_sp),
-+ KVADDR, spp, sizeof(*spp),
-+ "thread_struct.sp",
-+ RETURN_ON_ERROR))
-+ return FALSE;
-+
-+ if (!readmem(bt->task + OFFSET(task_struct_thread_context_fp),
-+ KVADDR, &bt->frameptr, sizeof(bt->frameptr),
-+ "thread_struct.fp",
-+ RETURN_ON_ERROR))
-+ return FALSE;
-+
-+ return TRUE;
-+}
-+
- static int
- riscv64_vtop_4level_4k(ulong *pgd, ulong vaddr, physaddr_t *paddr, int verbose)
- {
-@@ -978,6 +1258,8 @@ riscv64_init(int when)
- machdep->uvtop = riscv64_uvtop;
- machdep->kvtop = riscv64_kvtop;
- machdep->cmd_mach = riscv64_cmd_mach;
-+ machdep->get_stack_frame = riscv64_get_stack_frame;
-+ machdep->back_trace = riscv64_back_trace_cmd;
-
- machdep->vmalloc_start = riscv64_vmalloc_start;
- machdep->processor_speed = riscv64_processor_speed;
-@@ -998,6 +1280,7 @@ riscv64_init(int when)
- case POST_GDB:
- machdep->section_size_bits = _SECTION_SIZE_BITS;
- machdep->max_physmem_bits = _MAX_PHYSMEM_BITS;
-+ riscv64_stackframe_init();
- riscv64_page_type_init();
-
- if (!machdep->hz)
---
-2.37.1
-
diff --git a/0012-ppc64-Remove-redundant-PTE-checks.patch b/0012-ppc64-Remove-redundant-PTE-checks.patch
new file mode 100644
index 0000000..33d7689
--- /dev/null
+++ b/0012-ppc64-Remove-redundant-PTE-checks.patch
@@ -0,0 +1,53 @@
+From 8b24b2025fb4ae9bd6102bb054bd23987c35387e Mon Sep 17 00:00:00 2001
+From: Likhitha Korrapati <likhitha(a)linux.ibm.com>
+Date: Fri, 16 Jun 2023 17:25:19 +0530
+Subject: [PATCH 12/13] ppc64: Remove redundant PTE checks
+
+Remove redundant checks for PTE (Page Table Entry) because those
+conditions are already covered.
+
+ if (!(pte & _PAGE_PRESENT)) {
+ ...
+ return FALSE;
+ }
+
+ if (!pte)
+ return FALSE;
+
+The second pte check is redundant because it holds true only when pte is
+0. If pte is 0 then (!(pte & _PAGE_PRESENT)) is true and it will return
+false. So there is no need for one more pte check.
+
+Signed-off-by: Likhitha Korrapati <likhitha(a)linux.ibm.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ ppc64.c | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/ppc64.c b/ppc64.c
+index b95a621d8fe4..fc34006f4863 100644
+--- a/ppc64.c
++++ b/ppc64.c
+@@ -968,9 +968,6 @@ ppc64_vtop(ulong vaddr, ulong *pgd, physaddr_t *paddr, int verbose)
+ return FALSE;
+ }
+
+- if (!pte)
+- return FALSE;
+-
+ *paddr = PAGEBASE(PTOB(pte >> PTE_RPN_SHIFT_DEFAULT)) + PAGEOFFSET(vaddr);
+
+ if (verbose) {
+@@ -1077,9 +1074,6 @@ ppc64_vtop_level4(ulong vaddr, ulong *level4, physaddr_t *paddr, int verbose)
+ return FALSE;
+ }
+
+- if (!pte)
+- return FALSE;
+-
+ out:
+ if (hugepage_type) {
+ if (hugepage_type == 2) {
+--
+2.37.1
+
diff --git a/0013-RISCV64-Add-help-r-command-support.patch b/0013-RISCV64-Add-help-r-command-support.patch
deleted file mode 100644
index 6eb5c51..0000000
--- a/0013-RISCV64-Add-help-r-command-support.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 5cfcdb4ebcb159c1c47b7c1805cd9b274ca27ff5 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:11 +0800
-Subject: [PATCH 13/28] RISCV64: Add 'help -r' command support
-
-Add support form printing out the registers from the dump file.
-
-With the patch, we can get the regs,
-crash> help -r
-CPU 0:
-epc : 00ffffffa5537400 ra : ffffffff80088620 sp : ff2000001039bb90
- gp : ffffffff810dde38 tp : ff60000002269600 t0 : ffffffff8032be5c
- t1 : 0720072007200720 t2 : 666666666666663c s0 : ff2000001039bcf0
- s1 : 0000000000000000 a0 : ff2000001039bb98 a1 : 0000000000000001
- a2 : 0000000000000010 a3 : 0000000000000000 a4 : 0000000000000000
- a5 : ff60000001c7d000 a6 : 000000000000003c a7 : ffffffff8035c998
- s2 : ffffffff810df0a8 s3 : ffffffff810df718 s4 : ff2000001039bb98
- s5 : 0000000000000000 s6 : 0000000000000007 s7 : ffffffff80c4a468
- s8 : 00fffffffde45410 s9 : 0000000000000007 s10: 00aaaaaad1640700
- s11: 0000000000000001 t3 : ff60000001218f00 t4 : ff60000001218f00
- t5 : ff60000001218000 t6 : ff2000001039b988
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- riscv64.c | 38 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 38 insertions(+)
-
-diff --git a/riscv64.c b/riscv64.c
-index 4c9b35bb93f2..6d1d3b5f36d1 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -1320,6 +1320,44 @@ riscv64_init(int when)
- void
- riscv64_display_regs_from_elf_notes(int cpu, FILE *ofp)
- {
-+ const struct machine_specific *ms = machdep->machspec;
-+ struct riscv64_register *regs;
-+
-+ if (!ms->crash_task_regs) {
-+ error(INFO, "registers not collected for cpu %d\n", cpu);
-+ return;
-+ }
-+
-+ regs = &ms->crash_task_regs[cpu];
-+ if (!regs->regs[RISCV64_REGS_SP] && !regs->regs[RISCV64_REGS_EPC]) {
-+ error(INFO, "registers not collected for cpu %d\n", cpu);
-+ return;
-+ }
-+
-+ /* Print riscv64 32 regs */
-+ fprintf(ofp,
-+ "epc : " REG_FMT " ra : " REG_FMT " sp : " REG_FMT "\n"
-+ " gp : " REG_FMT " tp : " REG_FMT " t0 : " REG_FMT "\n"
-+ " t1 : " REG_FMT " t2 : " REG_FMT " s0 : " REG_FMT "\n"
-+ " s1 : " REG_FMT " a0 : " REG_FMT " a1 : " REG_FMT "\n"
-+ " a2 : " REG_FMT " a3 : " REG_FMT " a4 : " REG_FMT "\n"
-+ " a5 : " REG_FMT " a6 : " REG_FMT " a7 : " REG_FMT "\n"
-+ " s2 : " REG_FMT " s3 : " REG_FMT " s4 : " REG_FMT "\n"
-+ " s5 : " REG_FMT " s6 : " REG_FMT " s7 : " REG_FMT "\n"
-+ " s8 : " REG_FMT " s9 : " REG_FMT " s10: " REG_FMT "\n"
-+ " s11: " REG_FMT " t3 : " REG_FMT " t4 : " REG_FMT "\n"
-+ " t5 : " REG_FMT " t6 : " REG_FMT "\n",
-+ regs->regs[0], regs->regs[1], regs->regs[2],
-+ regs->regs[3], regs->regs[4], regs->regs[5],
-+ regs->regs[6], regs->regs[7], regs->regs[8],
-+ regs->regs[9], regs->regs[10], regs->regs[11],
-+ regs->regs[12], regs->regs[13], regs->regs[14],
-+ regs->regs[15], regs->regs[16], regs->regs[17],
-+ regs->regs[18], regs->regs[19], regs->regs[20],
-+ regs->regs[21], regs->regs[22], regs->regs[23],
-+ regs->regs[24], regs->regs[25], regs->regs[26],
-+ regs->regs[27], regs->regs[28], regs->regs[29],
-+ regs->regs[30], regs->regs[31]);
- }
-
- #else /* !RISCV64 */
---
-2.37.1
-
diff --git a/0013-Support-module-memory-layout-change-on-Linux-6.4.patch b/0013-Support-module-memory-layout-change-on-Linux-6.4.patch
new file mode 100644
index 0000000..e311fce
--- /dev/null
+++ b/0013-Support-module-memory-layout-change-on-Linux-6.4.patch
@@ -0,0 +1,2443 @@
+From 7750e61fdb2a083f26156a5338aa2ebe26447f3f Mon Sep 17 00:00:00 2001
+From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Date: Thu, 22 Jun 2023 16:09:07 +0900
+Subject: [PATCH 13/13] Support module memory layout change on Linux 6.4
+
+Support module memory layout change on Linux 6.4 by kernel commit
+ac3b43283923 ("module: replace module_layout with module_memory") [1].
+Without the patch, crash cannot even start a session with an error
+message like this:
+
+ crash: invalid structure member offset: module_core_size
+ FILE: kernel.c LINE: 3787 FUNCTION: module_init()
+
+[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit...
+
+Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
+Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
+---
+ defs.h | 46 +-
+ gdb-10.2.patch | 25 +
+ kernel.c | 56 +-
+ memory.c | 38 +-
+ symbols.c | 1609 ++++++++++++++++++++++++++++++++++++++++++++----
+ 5 files changed, 1629 insertions(+), 145 deletions(-)
+
+diff --git a/defs.h b/defs.h
+index 3e7d6cfbc6a8..414853660dc1 100644
+--- a/defs.h
++++ b/defs.h
+@@ -675,6 +675,7 @@ struct new_utsname {
+ #define IRQ_DESC_TREE_RADIX (0x40ULL)
+ #define IRQ_DESC_TREE_XARRAY (0x80ULL)
+ #define KMOD_PAX (0x100ULL)
++#define KMOD_MEMORY (0x200ULL)
+
+ #define XEN() (kt->flags & ARCH_XEN)
+ #define OPENVZ() (kt->flags & ARCH_OPENVZ)
+@@ -682,6 +683,7 @@ struct new_utsname {
+ #define PVOPS_XEN() (kt->flags & ARCH_PVOPS_XEN)
+
+ #define PAX_MODULE_SPLIT() (kt->flags2 & KMOD_PAX)
++#define MODULE_MEMORY() (kt->flags2 & KMOD_MEMORY)
+
+ #define XEN_MACHINE_TO_MFN(m) ((ulonglong)(m) >> PAGESHIFT())
+ #define XEN_PFN_TO_PSEUDO(p) ((ulonglong)(p) << PAGESHIFT())
+@@ -2217,6 +2219,9 @@ struct offset_table { /* stash of commonly-used offsets */
+ long kset_kobj;
+ long subsys_private_subsys;
+ long vmap_area_purge_list;
++ long module_mem;
++ long module_memory_base;
++ long module_memory_size;
+ };
+
+ struct size_table { /* stash of commonly-used sizes */
+@@ -2390,6 +2395,7 @@ struct size_table { /* stash of commonly-used sizes */
+ long percpu_counter;
+ long maple_tree;
+ long maple_node;
++ long module_memory;
+ };
+
+ struct array_table {
+@@ -2922,6 +2928,23 @@ struct mod_section_data {
+ ulong size;
+ int priority;
+ int flags;
++ ulong addr;
++};
++
++/* Emulate enum mod_mem_type in include/linux/module.h */
++#define MOD_TEXT (0)
++#define MOD_DATA (1)
++#define MOD_RODATA (2)
++#define MOD_RO_AFTER_INIT (3)
++#define MOD_INIT_TEXT (4)
++#define MOD_INIT_DATA (5)
++#define MOD_INIT_RODATA (6)
++#define MOD_MEM_NUM_TYPES (7)
++#define MOD_INVALID (-1)
++
++struct module_memory {
++ ulong base;
++ uint size;
+ };
+
+ struct load_module {
+@@ -2957,19 +2980,29 @@ struct load_module {
+ ulong mod_percpu;
+ ulong mod_percpu_size;
+ struct objfile *loaded_objfile;
+-};
+
+-#define IN_MODULE(A,L) \
+- (((ulong)(A) >= (L)->mod_base) && ((ulong)(A) < ((L)->mod_base+(L)->mod_size)))
+-
+-#define IN_MODULE_INIT(A,L) \
+- (((ulong)(A) >= (L)->mod_init_module_ptr) && ((ulong)(A) < ((L)->mod_init_module_ptr+(L)->mod_init_size)))
++ /* For 6.4 module_memory */
++ struct module_memory mem[MOD_MEM_NUM_TYPES];
++ struct syment **symtable;
++ struct syment **symend;
++ struct syment *ext_symtable[MOD_MEM_NUM_TYPES];
++ struct syment *ext_symend[MOD_MEM_NUM_TYPES];
++ struct syment *load_symtable[MOD_MEM_NUM_TYPES];
++ struct syment *load_symend[MOD_MEM_NUM_TYPES];
++};
+
++#define IN_MODULE(A,L) (in_module_range(A, L, MOD_TEXT, MOD_RO_AFTER_INIT) != MOD_INVALID)
++#define IN_MODULE_INIT(A,L) (in_module_range(A, L, MOD_INIT_TEXT, MOD_INIT_RODATA) != MOD_INVALID)
++#define IN_MODULE_TEXT(A,L) (in_module_range(A, L, MOD_TEXT, MOD_TEXT) == MOD_TEXT || \
++ in_module_range(A, L, MOD_INIT_TEXT, MOD_INIT_TEXT) == MOD_INIT_TEXT)
+ #define IN_MODULE_PERCPU(A,L) \
+ (((ulong)(A) >= (L)->mod_percpu) && ((ulong)(A) < ((L)->mod_percpu+(L)->mod_percpu_size)))
+
+ #define MODULE_PERCPU_SYMS_LOADED(L) ((L)->mod_percpu && (L)->mod_percpu_size)
+
++#define for_each_mod_mem_type(type) \
++ for ((type) = MOD_TEXT; (type) < MOD_MEM_NUM_TYPES; (type)++)
++
+ #ifndef GDB_COMMON
+
+ #define KVADDR (0x1)
+@@ -5588,6 +5621,7 @@ void dump_struct_member(char *, ulong, unsigned);
+ void dump_union(char *, ulong, unsigned);
+ void store_module_symbols_v1(ulong, int);
+ void store_module_symbols_v2(ulong, int);
++void store_module_symbols_6_4(ulong, int);
+ int is_datatype_command(void);
+ int is_typedef(char *);
+ int arg_to_datatype(char *, struct datatype_member *, ulong);
+diff --git a/gdb-10.2.patch b/gdb-10.2.patch
+index 835aae9859be..16228b1dbf73 100644
+--- a/gdb-10.2.patch
++++ b/gdb-10.2.patch
+@@ -3120,3 +3120,28 @@ exit 0
+ return result;
+ }
+
++--- gdb-10.2/gdb/symtab.c.orig
+++++ gdb-10.2/gdb/symtab.c
++@@ -7476,7 +7476,7 @@ gdb_add_symbol_file(struct gnu_request *
++ int i;
++ int allsect = 0;
++ char *secname;
++- char buf[80];
+++ char buf[96];
++
++ gdb_current_load_module = lm = (struct load_module *)req->addr;
++
++@@ -7515,8 +7515,11 @@ gdb_add_symbol_file(struct gnu_request *
++ secname = lm->mod_section_data[i].name;
++ if ((lm->mod_section_data[i].flags & SEC_FOUND) &&
++ !STREQ(secname, ".text")) {
++- sprintf(buf, " -s %s 0x%lx", secname,
++- lm->mod_section_data[i].offset + lm->mod_base);
+++ if (lm->mod_section_data[i].addr)
+++ sprintf(buf, " -s %s 0x%lx", secname, lm->mod_section_data[i].addr);
+++ else
+++ sprintf(buf, " -s %s 0x%lx", secname,
+++ lm->mod_section_data[i].offset + lm->mod_base);
++ strcat(req->buf, buf);
++ }
++ }
+diff --git a/kernel.c b/kernel.c
+index 6e98f5f6f6b1..639ed64f306a 100644
+--- a/kernel.c
++++ b/kernel.c
+@@ -3571,7 +3571,21 @@ module_init(void)
+ MEMBER_OFFSET_INIT(module_num_gpl_syms, "module",
+ "num_gpl_syms");
+
+- if (MEMBER_EXISTS("module", "module_core")) {
++ if (MEMBER_EXISTS("module", "mem")) { /* 6.4 and later */
++ kt->flags2 |= KMOD_MEMORY; /* MODULE_MEMORY() can be used. */
++
++ MEMBER_OFFSET_INIT(module_mem, "module", "mem");
++ MEMBER_OFFSET_INIT(module_memory_base, "module_memory", "base");
++ MEMBER_OFFSET_INIT(module_memory_size, "module_memory", "size");
++ STRUCT_SIZE_INIT(module_memory, "module_memory");
++
++ if (CRASHDEBUG(1))
++ error(INFO, "struct module_memory detected.\n");
++
++ if (get_array_length("module.mem", NULL, 0) != MOD_MEM_NUM_TYPES)
++ error(WARNING, "module memory types have changed!\n");
++
++ } else if (MEMBER_EXISTS("module", "module_core")) {
+ MEMBER_OFFSET_INIT(module_core_size, "module",
+ "core_size");
+ MEMBER_OFFSET_INIT(module_init_size, "module",
+@@ -3757,6 +3771,8 @@ module_init(void)
+ total += nsyms;
+ total += 2; /* store the module's start/ending addresses */
+ total += 2; /* and the init start/ending addresses */
++ if (MODULE_MEMORY()) /* 7 regions at most -> 14, so needs +10 */
++ total += 10;
+
+ /*
+ * If the module has kallsyms, set up to grab them as well.
+@@ -3784,7 +3800,11 @@ module_init(void)
+ case KALLSYMS_V2:
+ if (THIS_KERNEL_VERSION >= LINUX(2,6,27)) {
+ numksyms = UINT(modbuf + OFFSET(module_num_symtab));
+- size = UINT(modbuf + MODULE_OFFSET2(module_core_size, rx));
++ if (MODULE_MEMORY())
++ /* check mem[MOD_TEXT].size only */
++ size = UINT(modbuf + OFFSET(module_mem) + OFFSET(module_memory_size));
++ else
++ size = UINT(modbuf + MODULE_OFFSET2(module_core_size, rx));
+ } else {
+ numksyms = ULONG(modbuf + OFFSET(module_num_symtab));
+ size = ULONG(modbuf + MODULE_OFFSET2(module_core_size, rx));
+@@ -3822,7 +3842,10 @@ module_init(void)
+ store_module_symbols_v1(total, kt->mods_installed);
+ break;
+ case KMOD_V2:
+- store_module_symbols_v2(total, kt->mods_installed);
++ if (MODULE_MEMORY())
++ store_module_symbols_6_4(total, kt->mods_installed);
++ else
++ store_module_symbols_v2(total, kt->mods_installed);
+ break;
+ }
+
+@@ -3836,7 +3859,7 @@ module_init(void)
+ static int
+ verify_modules(void)
+ {
+- int i;
++ int i, t;
+ int found, irregularities;
+ ulong mod, mod_next, mod_base;
+ long mod_size;
+@@ -3893,8 +3916,13 @@ verify_modules(void)
+ mod_base = mod;
+ break;
+ case KMOD_V2:
+- mod_base = ULONG(modbuf +
+- MODULE_OFFSET2(module_module_core, rx));
++ if (MODULE_MEMORY())
++ /* mem[MOD_TEXT].base */
++ mod_base = ULONG(modbuf + OFFSET(module_mem) +
++ OFFSET(module_memory_base));
++ else
++ mod_base = ULONG(modbuf +
++ MODULE_OFFSET2(module_module_core, rx));
+ break;
+ }
+
+@@ -3916,7 +3944,17 @@ verify_modules(void)
+ case KMOD_V2:
+ module_name = modbuf +
+ OFFSET(module_name);
+- if (THIS_KERNEL_VERSION >= LINUX(2,6,27))
++ if (MODULE_MEMORY()) {
++ mod_size = 0;
++ for_each_mod_mem_type(t) {
++ if (t == MOD_INIT_TEXT)
++ break;
++
++ mod_size += UINT(modbuf + OFFSET(module_mem) +
++ SIZE(module_memory) * t +
++ OFFSET(module_memory_size));
++ }
++ } else if (THIS_KERNEL_VERSION >= LINUX(2,6,27))
+ mod_size = UINT(modbuf +
+ MODULE_OFFSET2(module_core_size, rx));
+ else
+@@ -4536,7 +4574,7 @@ do_module_cmd(ulong flag, char *modref, ulong address,
+ "MODULE"),
+ mkstring(buf2, maxnamelen, LJUST, "NAME"),
+ mkstring(buf4, VADDR_PRLEN, CENTER|LJUST,
+- "BASE"),
++ MODULE_MEMORY() ? "TEXT_BASE" : "BASE"),
+ mkstring(buf3, maxsizelen, RJUST, "SIZE"));
+ }
+
+@@ -6144,6 +6182,8 @@ dump_kernel_table(int verbose)
+ fprintf(fp, "%sIRQ_DESC_TREE_XARRAY", others++ ? "|" : "");
+ if (kt->flags2 & KMOD_PAX)
+ fprintf(fp, "%sKMOD_PAX", others++ ? "|" : "");
++ if (kt->flags2 & KMOD_MEMORY)
++ fprintf(fp, "%sKMOD_MEMORY", others++ ? "|" : "");
+ fprintf(fp, ")\n");
+
+ fprintf(fp, " stext: %lx\n", kt->stext);
+diff --git a/memory.c b/memory.c
+index ea3005a5c01f..acbee6389472 100644
+--- a/memory.c
++++ b/memory.c
+@@ -15712,10 +15712,44 @@ in_vmlist_segment(ulong vaddr)
+ static int
+ next_module_vaddr(ulong vaddr, ulong *nextvaddr)
+ {
+- int i;
+- ulong start, end;
++ int i, t;
++ ulong start, end, min = (ulong)-1;
+ struct load_module *lm;
+
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ start = lm->mem[t].base;
++ end = start + lm->mem[t].size;
++
++ if (vaddr >= end)
++ continue;
++
++ if (vaddr < start) {
++ if (start < min) /* replace candidate */
++ min = start;
++ continue;
++ }
++
++ *nextvaddr = vaddr;
++ return TRUE;
++ }
++ }
++
++ if (min != (ulong)-1) {
++ *nextvaddr = min;
++ return TRUE;
++ }
++ return FALSE;
++
++old_module:
+ for (i = 0; i < st->mods_installed; i++) {
+ lm = &st->load_modules[i];
+ start = lm->mod_base;
+diff --git a/symbols.c b/symbols.c
+index 7b1d59203b90..f161ee99e90a 100644
+--- a/symbols.c
++++ b/symbols.c
+@@ -48,8 +48,8 @@ static int load_module_index(struct syment *);
+ static void section_header_info(bfd *, asection *, void *);
+ static void store_section_data(struct load_module *, bfd *, asection *);
+ static void calculate_load_order_v1(struct load_module *, bfd *);
+-static void calculate_load_order_v2(struct load_module *, bfd *, int,
+- void *, long, unsigned int);
++static void calculate_load_order_v2(struct load_module *, bfd *, int, void *, long, unsigned int);
++static void calculate_load_order_6_4(struct load_module *, bfd *, int, void *, long, unsigned int);
+ static void check_insmod_builtin(struct load_module *, int, ulong *);
+ static int is_insmod_builtin(struct load_module *, struct syment *);
+ struct load_module;
+@@ -104,6 +104,42 @@ static unsigned char is_right_brace(const char *);
+ static struct struct_elem *find_node(struct struct_elem *, char *);
+ static void dump_node(struct struct_elem *, char *, unsigned char, unsigned char);
+
++static int module_mem_type(ulong, struct load_module *);
++static ulong module_mem_end(ulong, struct load_module *);
++static int in_module_range(ulong, struct load_module *, int, int);
++static struct syment *value_search_module_6_4(ulong, ulong *);
++static struct syment *next_symbol_by_symname(char *);
++static struct syment *prev_symbol_by_symname(char *);
++static struct syment *next_module_symbol_by_value(ulong);
++static struct syment *prev_module_symbol_by_value(ulong);
++static struct syment *next_module_symbol_by_syment(struct syment *);
++static struct syment *prev_module_symbol_by_syment(struct syment *);
++
++struct module_tag {
++ char *start;
++ char *end;
++ char *start_str;
++ char *end_str;
++};
++
++#define MODULE_TAG(type, suffix) ("_MODULE_" #type "_" #suffix "_")
++#define MODULE_STR(type, suffix) ( "MODULE " #type " " #suffix)
++#define MODULE_TAGS(type) { \
++ .start = MODULE_TAG(type, START), \
++ .end = MODULE_TAG(type, END), \
++ .start_str = MODULE_STR(type, START), \
++ .end_str = MODULE_STR(type, END) \
++}
++
++static const struct module_tag module_tag[] = {
++ MODULE_TAGS(TEXT),
++ MODULE_TAGS(DATA),
++ MODULE_TAGS(RODATA),
++ MODULE_TAGS(RO_AFTER_INIT),
++ MODULE_TAGS(INIT_TEXT),
++ MODULE_TAGS(INIT_DATA),
++ MODULE_TAGS(INIT_RODATA),
++};
+
+ /*
+ * structure/union printing stuff
+@@ -1268,10 +1304,7 @@ symname_hash_search(struct syment *table[], char *name)
+ * Output for sym -[lL] command.
+ */
+
+-#define MODULE_PSEUDO_SYMBOL(sp) \
+- ((STRNEQ((sp)->name, "_MODULE_START_") || STRNEQ((sp)->name, "_MODULE_END_")) || \
+- (STRNEQ((sp)->name, "_MODULE_INIT_START_") || STRNEQ((sp)->name, "_MODULE_INIT_END_")) || \
+- (STRNEQ((sp)->name, "_MODULE_SECTION_")))
++#define MODULE_PSEUDO_SYMBOL(sp) (STRNEQ((sp)->name, "_MODULE_"))
+
+ #define MODULE_START(sp) (STRNEQ((sp)->name, "_MODULE_START_"))
+ #define MODULE_END(sp) (STRNEQ((sp)->name, "_MODULE_END_"))
+@@ -1280,6 +1313,76 @@ symname_hash_search(struct syment *table[], char *name)
+ #define MODULE_SECTION_START(sp) (STRNEQ((sp)->name, "_MODULE_SECTION_START"))
+ #define MODULE_SECTION_END(sp) (STRNEQ((sp)->name, "_MODULE_SECTION_END"))
+
++#define MODULE_MEM_START(sp,t) (STRNEQ((sp)->name, module_tag[t].start))
++#define MODULE_MEM_END(sp,t) (STRNEQ((sp)->name, module_tag[t].end))
++
++/* For 6.4 and later */
++static void
++module_symbol_dump(char *module)
++{
++ int i, t;
++ struct syment *sp, *sp_end;
++ struct load_module *lm;
++ const char *p1, *p2;
++
++ for (i = 0; i < st->mods_installed; i++) {
++
++ lm = &st->load_modules[i];
++ if (module && !STREQ(module, lm->mod_name))
++ continue;
++
++ if (received_SIGINT() || output_closed())
++ return;
++
++ /*
++ * module percpu symbols are within the .data..percpu section,
++ * not in any module memory regions.
++ */
++ if (MODULE_PERCPU_SYMS_LOADED(lm)) {
++ p1 = "MODULE PERCPU START";
++ p2 = lm->mod_name;
++ fprintf(fp, "%lx %s: %s\n", lm->mod_percpu, p1, p2);
++
++ dump_percpu_symbols(lm);
++
++ p1 = "MODULE PERCPU END";
++ fprintf(fp, "%lx %s: %s\n", lm->mod_percpu + lm->mod_percpu_size, p1, p2);
++ }
++
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++
++ for ( ; sp <= sp_end; sp++) {
++ if (MODULE_PSEUDO_SYMBOL(sp)) {
++ if (MODULE_MEM_START(sp, t)) {
++ p1 = module_tag[t].start_str;
++ p2 = sp->name + strlen(module_tag[t].start);
++ } else if (MODULE_MEM_END(sp, t)) {
++ p1 = module_tag[t].end_str;
++ p2 = sp->name + strlen(module_tag[t].end);
++ } else if (MODULE_SECTION_START(sp)) {
++ p1 = sp->name + strlen("_MODULE_SECTION_START ");
++ p2 = "section start";
++ } else if (MODULE_SECTION_END(sp)) {
++ p1 = sp->name + strlen("_MODULE_SECTION_END ");
++ p2 = "section end";
++ } else {
++ p1 = "unknown tag";
++ p2 = sp->name;
++ }
++
++ fprintf(fp, "%lx %s: %s\n", sp->value, p1, p2);
++ } else
++ show_symbol(sp, 0, SHOW_RADIX());
++ }
++ }
++ }
++}
++
+ static void
+ symbol_dump(ulong flags, char *module)
+ {
+@@ -1302,6 +1405,11 @@ symbol_dump(ulong flags, char *module)
+ if (!(flags & MODULE_SYMS))
+ return;
+
++ if (MODULE_MEMORY()) {
++ module_symbol_dump(module);
++ return;
++ }
++
+ for (i = 0; i < st->mods_installed; i++) {
+
+ lm = &st->load_modules[i];
+@@ -1389,8 +1497,14 @@ dump_percpu_symbols(struct load_module *lm)
+ struct syment *sp, *sp_end;
+
+ if (MODULE_PERCPU_SYMS_LOADED(lm)) {
+- sp = lm->mod_symtable;
+- sp_end = lm->mod_symend;
++ if (MODULE_MEMORY()) {
++ /* The lm should have mod_load_symtable. */
++ sp = lm->mod_load_symtable;
++ sp_end = lm->mod_load_symend;
++ } else {
++ sp = lm->mod_symtable;
++ sp_end = lm->mod_symend;
++ }
+ for ( ; sp <= sp_end; sp++) {
+ if (IN_MODULE_PERCPU(sp->value, lm))
+ show_symbol(sp, 0, SHOW_RADIX());
+@@ -1425,8 +1539,13 @@ check_for_dups(struct load_module *lm)
+ {
+ struct syment *sp, *sp_end;
+
+- sp = lm->mod_symtable;
+- sp_end = lm->mod_symend;
++ if (MODULE_MEMORY()) {
++ sp = lm->mod_load_symtable;
++ sp_end = lm->mod_load_symend;
++ } else {
++ sp = lm->mod_symtable;
++ sp_end = lm->mod_symend;
++ }
+
+ for ( ; sp <= sp_end; sp++) {
+ if (symbol_name_count(sp->name) > 1)
+@@ -1788,6 +1907,362 @@ modsym_value(ulong syms, union kernel_symbol *modsym, int i)
+ return 0;
+ }
+
++/*
++ * Linux 6.4 introduced module.mem memory layout
++ */
++void
++store_module_symbols_6_4(ulong total, int mods_installed)
++{
++ int i, m, t;
++ ulong mod, mod_next;
++ char *mod_name;
++ uint nsyms, ngplsyms;
++ ulong syms, gpl_syms;
++ ulong nksyms;
++ long strbuflen;
++ ulong size;
++ int mcnt, lm_mcnt;
++ union kernel_symbol *modsym;
++ size_t kernel_symbol_size;
++ struct load_module *lm;
++ char buf1[BUFSIZE];
++ char buf2[BUFSIZE];
++ char *strbuf = NULL, *modbuf, *modsymbuf;
++ struct syment *sp;
++ ulong first, last;
++
++ st->mods_installed = mods_installed;
++
++ if (!st->mods_installed) {
++ st->flags &= ~MODULE_SYMS;
++ return;
++ }
++
++ /*
++ * If we've been here before, free up everything and start over.
++ */
++ if (st->flags & MODULE_SYMS)
++ error(FATAL, "re-initialization of module symbols not implemented yet!\n");
++
++ kernel_symbol_size = kernel_symbol_type_init();
++
++ if ((st->ext_module_symtable = (struct syment *)
++ calloc(total, sizeof(struct syment))) == NULL)
++ error(FATAL, "module syment space malloc (%ld symbols): %s\n",
++ total, strerror(errno));
++
++ if (!namespace_ctl(NAMESPACE_INIT, &st->ext_module_namespace,
++ (void *)total, NULL))
++ error(FATAL, "module namespace malloc: %s\n", strerror(errno));
++
++ if ((st->load_modules = (struct load_module *)calloc
++ (st->mods_installed, sizeof(struct load_module))) == NULL)
++ error(FATAL, "load_module array malloc: %s\n", strerror(errno));
++
++ modbuf = GETBUF(SIZE(module));
++ modsymbuf = NULL;
++ m = mcnt = mod_next = 0;
++
++ for (mod = kt->module_list; mod != kt->kernel_module; mod = mod_next) {
++
++ readmem(mod, KVADDR, modbuf, SIZE(module),
++ "module buffer", FAULT_ON_ERROR);
++
++ syms = ULONG(modbuf + OFFSET(module_syms));
++ gpl_syms = ULONG(modbuf + OFFSET(module_gpl_syms));
++ nsyms = UINT(modbuf + OFFSET(module_num_syms));
++ ngplsyms = UINT(modbuf + OFFSET(module_num_gpl_syms));
++
++ nksyms = UINT(modbuf + OFFSET(module_num_symtab));
++
++ mod_name = modbuf + OFFSET(module_name);
++
++ lm = &st->load_modules[m++];
++ BZERO(lm, sizeof(struct load_module));
++
++ size = 0;
++ for_each_mod_mem_type(t) {
++ lm->mem[t].base = ULONG(modbuf + OFFSET(module_mem) +
++ SIZE(module_memory) * t + OFFSET(module_memory_base));
++ lm->mem[t].size = UINT(modbuf + OFFSET(module_mem) +
++ SIZE(module_memory) * t + OFFSET(module_memory_size));
++ if (t < MOD_INIT_TEXT)
++ size += lm->mem[t].size;
++ }
++ lm->mod_base = lm->mem[MOD_TEXT].base;
++ /* module core size, init not included */
++ lm->mod_size = size;
++ lm->module_struct = mod;
++
++ if (strlen(mod_name) < MAX_MOD_NAME)
++ strcpy(lm->mod_name, mod_name);
++ else {
++ error(INFO, "module name greater than MAX_MOD_NAME: %s\n", mod_name);
++ strncpy(lm->mod_name, mod_name, MAX_MOD_NAME-1);
++ }
++ if (CRASHDEBUG(3))
++ fprintf(fp, "%lx (%lx): %s syms: %d gplsyms: %d ksyms: %ld\n",
++ mod, lm->mod_base, lm->mod_name, nsyms, ngplsyms, nksyms);
++
++ lm->mod_flags = MOD_EXT_SYMS;
++ lm->mod_ext_symcnt = mcnt;
++ lm->mod_text_start = lm->mod_base;
++ lm->mod_init_module_ptr = lm->mem[MOD_INIT_TEXT].base;
++ lm->mod_init_size = lm->mem[MOD_INIT_TEXT].size;
++ lm->mod_init_text_size = lm->mem[MOD_INIT_TEXT].size;
++
++ if (VALID_MEMBER(module_percpu))
++ lm->mod_percpu = ULONG(modbuf + OFFSET(module_percpu));
++
++ lm_mcnt = mcnt;
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ st->ext_module_symtable[mcnt].value = lm->mem[t].base;
++ st->ext_module_symtable[mcnt].type = 'm';
++ st->ext_module_symtable[mcnt].flags |= MODULE_SYMBOL;
++ sprintf(buf2, "%s%s", module_tag[t].start, mod_name);
++ namespace_ctl(NAMESPACE_INSTALL, &st->ext_module_namespace,
++ &st->ext_module_symtable[mcnt], buf2);
++ lm_mcnt = mcnt;
++ mcnt++;
++
++ if (t >= MOD_INIT_TEXT)
++ lm->mod_flags |= MOD_INIT;
++ }
++
++ if (nsyms && !IN_MODULE(syms, lm)) {
++ error(WARNING,
++ "[%s] module.syms outside of module " "address space (%lx)\n\n",
++ lm->mod_name, syms);
++ nsyms = 0;
++ }
++
++ if (nsyms) {
++ modsymbuf = GETBUF(kernel_symbol_size*nsyms);
++ readmem((ulong)syms, KVADDR, modsymbuf,
++ nsyms * kernel_symbol_size,
++ "module symbols", FAULT_ON_ERROR);
++ }
++
++ for (i = first = last = 0; i < nsyms; i++) {
++ modsym = (union kernel_symbol *)
++ (modsymbuf + (i * kernel_symbol_size));
++ if (!first
++ || first > modsym_name(syms, modsym, i))
++ first = modsym_name(syms, modsym, i);
++ if (modsym_name(syms, modsym, i) > last)
++ last = modsym_name(syms, modsym, i);
++ }
++
++ if (last > first) {
++ /* The buffer should not go over the block. */
++ ulong end = module_mem_end(first, lm);
++
++ strbuflen = (last-first) + BUFSIZE;
++ if ((first + strbuflen) >= end) {
++ strbuflen = end - first;
++
++ }
++ strbuf = GETBUF(strbuflen);
++
++ if (!readmem(first, KVADDR, strbuf, strbuflen,
++ "module symbol strings", RETURN_ON_ERROR)) {
++ FREEBUF(strbuf);
++ strbuf = NULL;
++ }
++ }
++
++
++ for (i = 0; i < nsyms; i++) {
++ modsym = (union kernel_symbol *)(modsymbuf + (i * kernel_symbol_size));
++
++ BZERO(buf1, BUFSIZE);
++
++ if (strbuf)
++ strcpy(buf1, &strbuf[modsym_name(syms, modsym, i) - first]);
++ else
++ read_string(modsym_name(syms, modsym, i), buf1, BUFSIZE-1);
++
++ if (strlen(buf1)) {
++ st->ext_module_symtable[mcnt].value =
++ modsym_value(syms, modsym, i);
++ st->ext_module_symtable[mcnt].type = '?';
++ st->ext_module_symtable[mcnt].flags |= MODULE_SYMBOL;
++ strip_module_symbol_end(buf1);
++ strip_symbol_end(buf1, NULL);
++ namespace_ctl(NAMESPACE_INSTALL,
++ &st->ext_module_namespace,
++ &st->ext_module_symtable[mcnt], buf1);
++
++ mcnt++;
++ }
++ }
++
++ if (modsymbuf) {
++ FREEBUF(modsymbuf);
++ modsymbuf = NULL;
++ }
++
++ if (strbuf)
++ FREEBUF(strbuf);
++
++ if (ngplsyms) {
++ modsymbuf = GETBUF(kernel_symbol_size * ngplsyms);
++ readmem((ulong)gpl_syms, KVADDR, modsymbuf,
++ ngplsyms * kernel_symbol_size,
++ "module gpl symbols", FAULT_ON_ERROR);
++ }
++
++ for (i = first = last = 0; i < ngplsyms; i++) {
++ modsym = (union kernel_symbol *)
++ (modsymbuf + (i * kernel_symbol_size));
++ if (!first
++ || first > modsym_name(gpl_syms, modsym, i))
++ first = modsym_name(gpl_syms, modsym, i);
++ if (modsym_name(gpl_syms, modsym, i) > last)
++ last = modsym_name(gpl_syms, modsym, i);
++ }
++
++ if (last > first) {
++ ulong end = module_mem_end(first, lm);
++
++ strbuflen = (last-first) + BUFSIZE;
++ if ((first + strbuflen) >= end) {
++ strbuflen = end - first;
++
++ }
++ strbuf = GETBUF(strbuflen);
++
++ if (!readmem(first, KVADDR, strbuf, strbuflen,
++ "module gpl symbol strings", RETURN_ON_ERROR)) {
++ FREEBUF(strbuf);
++ strbuf = NULL;
++ }
++ } else
++ strbuf = NULL;
++
++ for (i = 0; i < ngplsyms; i++) {
++ modsym = (union kernel_symbol *) (modsymbuf + (i * kernel_symbol_size));
++
++ BZERO(buf1, BUFSIZE);
++
++ if (strbuf)
++ strcpy(buf1, &strbuf[modsym_name(gpl_syms, modsym, i) - first]);
++ else
++ read_string(modsym_name(gpl_syms, modsym, i), buf1, BUFSIZE-1);
++
++ if (strlen(buf1)) {
++ st->ext_module_symtable[mcnt].value =
++ modsym_value(gpl_syms, modsym, i);
++ st->ext_module_symtable[mcnt].type = '?';
++ st->ext_module_symtable[mcnt].flags |= MODULE_SYMBOL;
++ strip_module_symbol_end(buf1);
++ strip_symbol_end(buf1, NULL);
++ namespace_ctl(NAMESPACE_INSTALL,
++ &st->ext_module_namespace,
++ &st->ext_module_symtable[mcnt], buf1);
++
++ mcnt++;
++ }
++ }
++
++ if (modsymbuf) {
++ FREEBUF(modsymbuf);
++ modsymbuf = NULL;
++ }
++
++ if (strbuf)
++ FREEBUF(strbuf);
++
++ /*
++ * If the module was compiled with kallsyms, add them in.
++ */
++ switch (kt->flags & (KALLSYMS_V1|KALLSYMS_V2))
++ {
++ case KALLSYMS_V1: /* impossible, I hope... */
++ mcnt += store_module_kallsyms_v1(lm, lm_mcnt, mcnt, modbuf);
++ break;
++ case KALLSYMS_V2:
++ mcnt += store_module_kallsyms_v2(lm, lm_mcnt, mcnt, modbuf);
++ break;
++ }
++
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ st->ext_module_symtable[mcnt].value = lm->mem[t].base + lm->mem[t].size;
++ st->ext_module_symtable[mcnt].type = 'm';
++ st->ext_module_symtable[mcnt].flags |= MODULE_SYMBOL;
++ sprintf(buf2, "%s%s", module_tag[t].end, mod_name);
++ namespace_ctl(NAMESPACE_INSTALL,
++ &st->ext_module_namespace,
++ &st->ext_module_symtable[mcnt], buf2);
++ mcnt++;
++ }
++
++ lm->mod_ext_symcnt = mcnt - lm->mod_ext_symcnt;
++
++ NEXT_MODULE(mod_next, modbuf);
++ }
++
++ FREEBUF(modbuf);
++
++ st->ext_module_symcnt = mcnt;
++ st->ext_module_symend = &st->ext_module_symtable[mcnt];
++
++ namespace_ctl(NAMESPACE_COMPLETE, &st->ext_module_namespace,
++ st->ext_module_symtable, st->ext_module_symend);
++
++ qsort(st->ext_module_symtable, mcnt, sizeof(struct syment),
++ compare_syms);
++
++ /* sort by text base address */
++ qsort(st->load_modules, m, sizeof(struct load_module), compare_mods);
++
++ for (m = 0; m < st->mods_installed; m++) {
++ lm = &st->load_modules[m];
++
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ sprintf(buf1, "%s%s", module_tag[t].start, lm->mod_name);
++ sprintf(buf2, "%s%s", module_tag[t].end, lm->mod_name);
++
++ for (sp = st->ext_module_symtable; sp < st->ext_module_symend; sp++) {
++ if (STREQ(sp->name, buf1)) {
++ lm->ext_symtable[t] = sp;
++ break;
++ }
++ }
++ for ( ; sp < st->ext_module_symend; sp++) {
++ if (STREQ(sp->name, buf2)) {
++ lm->ext_symend[t] = sp;
++ break;
++ }
++ }
++
++ if (lm->ext_symtable[t] && lm->ext_symend[t])
++ mod_symtable_hash_install_range(lm->ext_symtable[t], lm->ext_symend[t]);
++ }
++ lm->symtable = lm->ext_symtable;
++ lm->symend = lm->ext_symend;
++ }
++
++ st->flags |= MODULE_SYMS;
++
++ if (CRASHDEBUG(2)) {
++ for (sp = st->ext_module_symtable; sp < st->ext_module_symend; sp++)
++ fprintf(fp, "%16lx %s\n", sp->value, sp->name);
++ }
++
++ if (mcnt > total)
++ error(FATAL, "store_module_symbols_6_4: total: %ld mcnt: %d\n", total, mcnt);
++}
++
+ void
+ store_module_symbols_v2(ulong total, int mods_installed)
+ {
+@@ -2384,6 +2859,7 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
+ int mcnt;
+ int mcnt_idx;
+ char *module_buf_init = NULL;
++ ulong base, base_init, size, size_init;
+
+ if (!(kt->flags & KALLSYMS_V2))
+ return 0;
+@@ -2394,9 +2870,22 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
+ ns = &st->ext_module_namespace;
+ ec = &elf_common;
+
+- module_buf = GETBUF(lm->mod_size);
++ /* kallsyms data looks to be in MOD_DATA region. */
++ if (MODULE_MEMORY()) {
++ base = lm->mem[MOD_DATA].base;
++ size = lm->mem[MOD_DATA].size;
++ base_init = lm->mem[MOD_INIT_DATA].base;
++ size_init = lm->mem[MOD_INIT_DATA].size;
++ } else {
++ base = lm->mod_base;
++ size = lm->mod_size;
++ base_init = lm->mod_init_module_ptr;
++ size_init = lm->mod_init_size;
++ }
+
+- if (!readmem(lm->mod_base, KVADDR, module_buf, lm->mod_size,
++ module_buf = GETBUF(size);
++
++ if (!readmem(base, KVADDR, module_buf, size,
+ "module (kallsyms)", RETURN_ON_ERROR|QUIET)) {
+ error(WARNING,"cannot access module kallsyms\n");
+ FREEBUF(module_buf);
+@@ -2404,10 +2893,10 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
+ }
+
+ if (lm->mod_init_size > 0) {
+- module_buf_init = GETBUF(lm->mod_init_size);
++ module_buf_init = GETBUF(size_init);
+
+- if (!readmem(lm->mod_init_module_ptr, KVADDR, module_buf_init, lm->mod_init_size,
+- "module init (kallsyms)", RETURN_ON_ERROR|QUIET)) {
++ if (!readmem(base_init, KVADDR, module_buf_init, size_init,
++ "module init (kallsyms)", RETURN_ON_ERROR|QUIET)) {
+ error(WARNING,"cannot access module init kallsyms\n");
+ FREEBUF(module_buf_init);
+ }
+@@ -2429,9 +2918,9 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
+ return 0;
+ }
+ if (IN_MODULE(ksymtab, lm))
+- locsymtab = module_buf + (ksymtab - lm->mod_base);
++ locsymtab = module_buf + (ksymtab - base);
+ else
+- locsymtab = module_buf_init + (ksymtab - lm->mod_init_module_ptr);
++ locsymtab = module_buf_init + (ksymtab - base_init);
+
+ kstrtab = ULONG(modbuf + OFFSET(module_strtab));
+ if (!IN_MODULE(kstrtab, lm) && !IN_MODULE_INIT(kstrtab, lm)) {
+@@ -2444,9 +2933,9 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
+ return 0;
+ }
+ if (IN_MODULE(kstrtab, lm))
+- locstrtab = module_buf + (kstrtab - lm->mod_base);
++ locstrtab = module_buf + (kstrtab - base);
+ else
+- locstrtab = module_buf_init + (kstrtab - lm->mod_init_module_ptr);
++ locstrtab = module_buf_init + (kstrtab - base_init);
+
+ for (i = 1; i < nksyms; i++) { /* ELF starts real symbols at 1 */
+ switch (BITS())
+@@ -2461,11 +2950,8 @@ store_module_kallsyms_v2(struct load_module *lm, int start, int curr,
+ break;
+ }
+
+- if (((ec->st_value < lm->mod_base) ||
+- (ec->st_value > (lm->mod_base + lm->mod_size))) &&
+- ((ec->st_value < lm->mod_init_module_ptr) ||
+- (ec->st_value > (lm->mod_init_module_ptr + lm->mod_init_size))))
+- continue;
++ if (!IN_MODULE(ec->st_value, lm) && !IN_MODULE_INIT(ec->st_value, lm))
++ continue;
+
+ if (ec->st_shndx == SHN_UNDEF)
+ continue;
+@@ -2572,7 +3058,7 @@ strip_module_symbol_end(char *buf)
+ ulong
+ lowest_module_address(void)
+ {
+- int i;
++ int i, t;
+ struct load_module *lm;
+ ulong low, lowest;
+
+@@ -2582,9 +3068,20 @@ lowest_module_address(void)
+ lowest = (ulong)(-1);
+ for (i = 0; i < st->mods_installed; i++) {
+ lm = &st->load_modules[i];
+- low = lm->mod_base;
+- if (low < lowest)
+- lowest = low;
++ if (MODULE_MEMORY())
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ low = lm->mem[t].base;
++ if (low < lowest)
++ lowest = low;
++ }
++ else {
++ low = lm->mod_base;
++ if (low < lowest)
++ lowest = low;
++ }
+ }
+
+ return lowest;
+@@ -2593,16 +3090,27 @@ lowest_module_address(void)
+ ulong
+ highest_module_address(void)
+ {
+- int i;
++ int i, t;
+ struct load_module *lm;
+ ulong high, highest;
+
+ highest = 0;
+ for (i = 0; i < st->mods_installed; i++) {
+ lm = &st->load_modules[i];
+- high = lm->mod_base + lm->mod_size;
+- if (high > highest)
+- highest = high;
++ if (MODULE_MEMORY()) {
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ high = lm->mem[t].base + lm->mem[t].size;
++ if (high > highest)
++ highest = high;
++ }
++ } else {
++ high = lm->mod_base + lm->mod_size;
++ if (high > highest)
++ highest = high;
++ }
+ }
+
+ return highest;
+@@ -2853,7 +3361,8 @@ compare_syms(const void *v1, const void *v2)
+ return -1;
+ if (STRNEQ(s2->name, "__insmod"))
+ return 1;
+- if (STRNEQ(s2->name, "_MODULE_START_"))
++ if (MODULE_MEM_START(s2, MOD_TEXT) ||
++ STRNEQ(s2->name, "_MODULE_START_"))
+ return 1;
+ /* Get pseudo section name. */
+ if (MODULE_SECTION_START(s1))
+@@ -2986,13 +3495,19 @@ is_kernel_text(ulong value)
+ if (!(lm->mod_section_data[s].flags & SEC_CODE))
+ continue;
+
+- start = lm->mod_base +
+- lm->mod_section_data[s].offset;
++ if (MODULE_MEMORY())
++ start = lm->mod_section_data[s].addr;
++ else
++ start = lm->mod_base + lm->mod_section_data[s].offset;
++
+ end = start + lm->mod_section_data[s].size;
+
+ if ((value >= start) && (value < end))
+ return TRUE;
+ }
++ } else if (MODULE_MEMORY()) {
++ if (IN_MODULE_TEXT(value, lm))
++ return TRUE;
+ } else {
+ switch (kt->flags & (KMOD_V1|KMOD_V2))
+ {
+@@ -3531,22 +4046,42 @@ dump_symbol_table(void)
+ (ulong)lm->mod_section_data,
+ lm->mod_section_data ? "" : "(not allocated)");
+
++ if (MODULE_MEMORY()) {
++ int t;
++ for_each_mod_mem_type(t) {
++ fprintf(fp, " mem[%d]: %lx (%x)\n",
++ t, lm->mem[t].base, lm->mem[t].size);
++ }
++ fprintf(fp, " symtable: %lx\n", (ulong)lm->symtable);
++ fprintf(fp, " ext_symtable: %lx\n", (ulong)lm->ext_symtable);
++ for_each_mod_mem_type(t) {
++ fprintf(fp, " ext_symtable[%d]: %lx - %lx\n",
++ t, (ulong)lm->ext_symtable[t], (ulong)lm->ext_symend[t]);
++ }
++ fprintf(fp, " load_symtable: %lx\n", (ulong)lm->load_symtable);
++ for_each_mod_mem_type(t) {
++ fprintf(fp, " load_symtable[%d]: %lx - %lx\n",
++ t, (ulong)lm->load_symtable[t], (ulong)lm->load_symend[t]);
++ }
++ }
+
+ for (s = 0; s < lm->mod_sections; s++) {
+ fprintf(fp,
+- " %12s prio: %x flags: %05x offset: %-8lx size: %lx\n",
++ " %20s prio: %x flags: %08x %s: %-16lx size: %lx\n",
+ lm->mod_section_data[s].name,
+ lm->mod_section_data[s].priority,
+ lm->mod_section_data[s].flags,
+- lm->mod_section_data[s].offset,
++ MODULE_MEMORY() ? "addr" : "offset",
++ MODULE_MEMORY() ? lm->mod_section_data[s].addr :
++ lm->mod_section_data[s].offset,
+ lm->mod_section_data[s].size);
+ }
+
+ fprintf(fp, " loaded_objfile: %lx\n", (ulong)lm->loaded_objfile);
+
+- if (CRASHDEBUG(1)) {
++ if (CRASHDEBUG(1) && lm->mod_load_symtable) {
+ for (sp = lm->mod_load_symtable;
+- sp < lm->mod_load_symend; sp++) {
++ sp <= lm->mod_load_symend; sp++) {
+ fprintf(fp, " %lx %s\n",
+ sp->value, sp->name);
+ }
+@@ -4458,8 +4993,11 @@ get_section(ulong vaddr, char *buf)
+ if (module_symbol(vaddr, NULL, &lm, NULL, *gdb_output_radix)) {
+ if (lm->mod_flags & MOD_LOAD_SYMS) {
+ for (i = (lm->mod_sections-1); i >= 0; i--) {
+- start = lm->mod_base +
+- lm->mod_section_data[i].offset;
++ if (MODULE_MEMORY())
++ start = lm->mod_section_data[i].addr;
++ else
++ start = lm->mod_base +
++ lm->mod_section_data[i].offset;
+ end = start + lm->mod_section_data[i].size;
+
+ if ((vaddr >= start) && (vaddr < end)) {
+@@ -4514,7 +5052,7 @@ get_build_directory(char *buf)
+ int
+ symbol_query(char *s, char *print_pad, struct syment **spp)
+ {
+- int i;
++ int i, t;
+ struct syment *sp, *sp_end;
+ struct load_module *lm;
+ int cnt, search_init;
+@@ -4534,6 +5072,60 @@ symbol_query(char *s, char *print_pad, struct syment **spp)
+ }
+ }
+
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ if (lm->mod_flags & MOD_LOAD_SYMS) {
++ sp = lm->mod_load_symtable;
++ sp_end = lm->mod_load_symend;
++
++ for (; sp < sp_end; sp++) {
++ if (MODULE_PSEUDO_SYMBOL(sp))
++ continue;
++
++ if (strstr(sp->name, s)) {
++ if (print_pad) {
++ if (strlen(print_pad))
++ fprintf(fp, "%s", print_pad);
++ show_symbol(sp, 0, SHOW_RADIX()|SHOW_MODULE);
++ }
++ if (spp)
++ *spp = sp;
++ cnt++;
++ }
++ }
++ } else {
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++
++ for (; sp < sp_end; sp++) {
++ if (MODULE_PSEUDO_SYMBOL(sp))
++ continue;
++
++ if (strstr(sp->name, s)) {
++ if (print_pad) {
++ if (strlen(print_pad))
++ fprintf(fp, "%s", print_pad);
++ show_symbol(sp, 0, SHOW_RADIX()|SHOW_MODULE);
++ }
++ if (spp)
++ *spp = sp;
++ cnt++;
++ }
++ }
++ }
++ }
++ }
++ return cnt;
++
++old_module:
+ search_init = FALSE;
+
+ for (i = 0; i < st->mods_installed; i++) {
+@@ -4639,7 +5231,7 @@ symbol_search(char *s)
+ int
+ symbol_name_count(char *s)
+ {
+- int i;
++ int i, t;
+ struct syment *sp, *sp_end;
+ struct load_module *lm;
+ int count, pseudos, search_init;
+@@ -4653,6 +5245,37 @@ symbol_name_count(char *s)
+ }
+ }
+
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ if (lm->mod_flags & MOD_LOAD_SYMS) {
++ sp = lm->mod_load_symtable;
++ sp_end = lm->mod_load_symend;
++
++ for (; sp < sp_end; sp++) {
++ if (STREQ(s, sp->name))
++ count++;
++ }
++ } else {
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++ for (; sp < sp_end; sp++) {
++ if (STREQ(s, sp->name))
++ count++;
++ }
++ }
++ }
++ }
++ return count++;
++
++old_module:
+ pseudos = (strstr(s, "_MODULE_START_") || strstr(s, "_MODULE_END_"));
+ search_init = FALSE;
+
+@@ -4702,7 +5325,7 @@ symbol_name_count(char *s)
+ struct syment *
+ symbol_search_next(char *s, struct syment *spstart)
+ {
+- int i;
++ int i, t;
+ struct syment *sp, *sp_end;
+ struct load_module *lm;
+ int found_start;
+@@ -4722,6 +5345,38 @@ symbol_search_next(char *s, struct syment *spstart)
+ }
+ }
+
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++
++ if (!found_start && (spstart < sp || spstart > sp_end))
++ continue;
++
++ for ( ; sp < sp_end; sp++) {
++ if (sp == spstart) {
++ found_start = TRUE;
++ continue;
++ } else if (!found_start)
++ continue;
++
++ if (STREQ(s, sp->name))
++ return sp;
++ }
++ }
++ }
++
++ return NULL;
++
++old_module:
+ pseudos = (strstr(s, "_MODULE_START_") || strstr(s, "_MODULE_END_"));
+ search_init = FALSE;
+
+@@ -4831,17 +5486,29 @@ module_symbol(ulong value,
+ for (i = 0; i < st->mods_installed; i++) {
+ lm = &st->load_modules[i];
+
+- if (IN_MODULE(value, lm)) {
+- base = lm->mod_base;
+- end = lm->mod_base + lm->mod_size;
+- } else if (IN_MODULE_INIT(value, lm)) {
+- base = lm->mod_init_module_ptr;
+- end = lm->mod_init_module_ptr + lm->mod_init_size;
+- } else if (IN_MODULE_PERCPU(value, lm)) {
+- base = lm->mod_percpu;
+- end = lm->mod_percpu + lm->mod_percpu_size;
+- } else
+- continue;
++ if (MODULE_MEMORY()) {
++ if (IN_MODULE(value, lm) || IN_MODULE_INIT(value, lm)) {
++ int type = module_mem_type(value, lm);
++ base = lm->mem[type].base;
++ end = base + lm->mem[type].size;
++ } else if (IN_MODULE_PERCPU(value, lm)) {
++ base = lm->mod_percpu;
++ end = lm->mod_percpu + lm->mod_percpu_size;
++ } else
++ continue;
++ } else {
++ if (IN_MODULE(value, lm)) {
++ base = lm->mod_base;
++ end = lm->mod_base + lm->mod_size;
++ } else if (IN_MODULE_INIT(value, lm)) {
++ base = lm->mod_init_module_ptr;
++ end = lm->mod_init_module_ptr + lm->mod_init_size;
++ } else if (IN_MODULE_PERCPU(value, lm)) {
++ base = lm->mod_percpu;
++ end = lm->mod_percpu + lm->mod_percpu_size;
++ } else
++ continue;
++ }
+
+ if ((value >= base) && (value < end)) {
+ if (lmp)
+@@ -4877,6 +5544,71 @@ module_symbol(ulong value,
+ return FALSE;
+ }
+
++static struct syment *
++value_search_module_6_4(ulong value, ulong *offset)
++{
++ int i, t;
++ struct syment *sp, *sp_end, *spnext, *splast;
++ struct load_module *lm;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ if (!IN_MODULE(value, lm) && !IN_MODULE_INIT(value, lm))
++ continue;
++
++ for_each_mod_mem_type(t) {
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++
++ if (value < sp->value)
++ continue;
++
++ splast = NULL;
++ for ( ; sp <= sp_end; sp++) {
++ if (machine_type("ARM64") &&
++ IN_MODULE_PERCPU(sp->value, lm) &&
++ !IN_MODULE_PERCPU(value, lm))
++ continue;
++
++ if (value == sp->value) {
++ if (MODULE_MEM_END(sp, t))
++ break;
++
++ if (MODULE_PSEUDO_SYMBOL(sp)) {
++ spnext = sp + 1;
++ if (MODULE_PSEUDO_SYMBOL(spnext))
++ continue;
++ if (spnext->value == value)
++ sp = spnext;
++ }
++ if (sp->name[0] == '.') {
++ spnext = sp+1;
++ if (spnext->value == value)
++ sp = spnext;
++ }
++ if (offset)
++ *offset = 0;
++ return sp;
++ }
++
++ if (sp->value > value) {
++ sp = splast ? splast : sp - 1;
++ if (offset)
++ *offset = value - sp->value;
++ return sp;
++ }
++
++ if (!MODULE_PSEUDO_SYMBOL(sp)) {
++ splast = sp;
++ }
++ }
++ }
++ }
++
++ return NULL;
++}
++
+ struct syment *
+ value_search_module(ulong value, ulong *offset)
+ {
+@@ -4885,6 +5617,9 @@ value_search_module(ulong value, ulong *offset)
+ struct load_module *lm;
+ int search_init_sections, search_init;
+
++ if (MODULE_MEMORY())
++ return value_search_module_6_4(value, offset);
++
+ search_init = FALSE;
+ search_init_sections = 0;
+
+@@ -5203,6 +5938,99 @@ closest_symbol_value(ulong value)
+ return(0);
+ }
+
++/* Only for 6.4 and later */
++static struct syment *
++next_symbol_by_symname(char *symbol)
++{
++ struct syment *sp;
++
++ if ((sp = symbol_search(symbol))) {
++ sp++;
++ if (MODULE_PSEUDO_SYMBOL(sp) && strstr(sp->name, "_END"))
++ return next_module_symbol_by_value(sp->value);
++
++ return sp;
++ }
++
++ return NULL;
++}
++
++/* val_in should be a pseudo module end symbol. */
++static struct syment *
++next_module_symbol_by_value(ulong val_in)
++{
++ struct load_module *lm;
++ struct syment *sp, *sp_end;
++ ulong start, min;
++ int i, t;
++
++retry:
++ sp = sp_end = NULL;
++ min = (ulong)-1;
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ /* Search for the next lowest symtable. */
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ start = lm->symtable[t]->value;
++ if (start > val_in && start < min) {
++ min = start;
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++ }
++ }
++ }
++
++ if (!sp)
++ return NULL;
++
++ for ( ; sp < sp_end; sp++) {
++ if (MODULE_PSEUDO_SYMBOL(sp))
++ continue;
++ if (sp->value > val_in)
++ return sp;
++ }
++
++ /* Found a table that has only pseudo symbols. */
++ val_in = sp_end->value;
++ goto retry;
++}
++
++/* Only for 6.4 and later */
++static struct syment *
++next_module_symbol_by_syment(struct syment *sp_in)
++{
++ struct load_module *lm;
++ struct syment *sp;
++ int i, t;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ if (sp_in < lm->symtable[t] || sp_in > lm->symend[t])
++ continue;
++
++ if (sp_in == lm->symend[t])
++ return next_module_symbol_by_value(sp_in->value);
++
++ sp = sp_in + 1;
++ if (MODULE_PSEUDO_SYMBOL(sp))
++ return next_module_symbol_by_value(sp->value);
++
++ return sp;
++ }
++ }
++
++ return NULL;
++}
++
+ /*
+ * For a given symbol, return a pointer to the next (higher) symbol's syment.
+ * Either a symbol name or syment pointer may be passed as an argument.
+@@ -5230,6 +6058,9 @@ next_symbol(char *symbol, struct syment *sp_in)
+ }
+ }
+
++ if (MODULE_MEMORY())
++ return next_module_symbol_by_syment(sp_in);
++
+ search_init = FALSE;
+
+ for (i = 0; i < st->mods_installed; i++) {
+@@ -5270,46 +6101,148 @@ next_symbol(char *symbol, struct syment *sp_in)
+ }
+ }
+
+- return NULL;
++ return NULL;
++ }
++
++ if (MODULE_MEMORY())
++ return next_symbol_by_symname(symbol);
++
++ /*
++ * Deal with a few special cases...
++ */
++ if (strstr(symbol, " module)")) {
++ sprintf(buf, "_MODULE_START_");
++ strcat(buf, &symbol[1]);
++ p1 = strstr(buf, " module)");
++ *p1 = NULLCHAR;
++ symbol = buf;
++ }
++
++ if (STREQ(symbol, "_end")) {
++ if (!st->mods_installed)
++ return NULL;
++
++ lm = &st->load_modules[0];
++
++ return lm->mod_symtable;
++ }
++
++ if ((sp = symbol_search(symbol))) {
++ sp++;
++ if (MODULE_END(sp)) {
++ sp--;
++ i = load_module_index(sp);
++ if ((i+1) == st->mods_installed)
++ return NULL;
++
++ lm = &st->load_modules[i+1];
++
++ sp = lm->mod_symtable;
++ }
++ return sp;
++ }
++
++ return NULL;
++}
++
++/* Only for 6.4 and later */
++static struct syment *
++prev_symbol_by_symname(char *symbol)
++{
++ struct syment *sp;
++
++ if ((sp = symbol_search(symbol))) {
++ if (sp == st->symtable)
++ return NULL;
++
++ if (module_symbol(sp->value, NULL, NULL, NULL, 0)) {
++ if (MODULE_PSEUDO_SYMBOL(sp) && strstr(sp->name, "_START"))
++ return prev_module_symbol_by_value(sp->value);
++ else
++ sp--;
++ } else
++ sp--;
++
++ return sp;
++ }
++
++ return NULL;
++}
++
++/* val_in should be a pseudo module start symbol. */
++static struct syment *
++prev_module_symbol_by_value(ulong val_in)
++{
++ struct load_module *lm;
++ struct syment *sp, *sp_end;
++ ulong end, max;
++ int i, t;
++
++retry:
++ sp = sp_end = NULL;
++ max = 0;
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ /* Search for the previous highest table. */
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ end = lm->symend[t]->value;
++ if (end < val_in && end > max) {
++ max = end;
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++ }
++ }
+ }
+
++ if (!sp)
++ return NULL;
+
+- /*
+- * Deal with a few special cases...
+- */
+- if (strstr(symbol, " module)")) {
+- sprintf(buf, "_MODULE_START_");
+- strcat(buf, &symbol[1]);
+- p1 = strstr(buf, " module)");
+- *p1 = NULLCHAR;
+- symbol = buf;
++ for ( ; sp_end > sp; sp_end--) {
++ if (MODULE_PSEUDO_SYMBOL(sp_end))
++ continue;
++ if (sp_end->value < val_in)
++ return sp_end;
+ }
+
+- if (STREQ(symbol, "_end")) {
+- if (!st->mods_installed)
+- return NULL;
++ /* Found a table that has only pseudo symbols. */
++ val_in = sp->value;
++ goto retry;
++}
+
+- lm = &st->load_modules[0];
++/* Only for 6.4 and later */
++static struct syment *
++prev_module_symbol_by_syment(struct syment *sp_in)
++{
++ struct load_module *lm;
++ struct syment *sp;
++ int i, t;
+
+- return lm->mod_symtable;
+- }
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
+
+- if ((sp = symbol_search(symbol))) {
+- sp++;
+- if (MODULE_END(sp)) {
+- sp--;
+- i = load_module_index(sp);
+- if ((i+1) == st->mods_installed)
+- return NULL;
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
+
+- lm = &st->load_modules[i+1];
++ if (sp_in < lm->symtable[t] || sp_in > lm->symend[t])
++ continue;
+
+- sp = lm->mod_symtable;
++ if (sp_in == lm->symtable[t])
++ return prev_module_symbol_by_value(sp_in->value);
++
++ sp = sp_in - 1;
++ if (MODULE_PSEUDO_SYMBOL(sp))
++ return prev_module_symbol_by_value(sp->value);
++
++ return sp;
+ }
+- return sp;
+ }
+
+- return NULL;
++ return NULL;
+ }
+
+ /*
+@@ -5335,6 +6268,9 @@ prev_symbol(char *symbol, struct syment *sp_in)
+ sp_prev = sp;
+ }
+
++ if (MODULE_MEMORY())
++ return prev_module_symbol_by_syment(sp_in);
++
+ search_init = FALSE;
+
+ for (i = 0; i < st->mods_installed; i++) {
+@@ -5378,6 +6314,9 @@ prev_symbol(char *symbol, struct syment *sp_in)
+ return NULL;
+ }
+
++ if (MODULE_MEMORY())
++ return prev_symbol_by_symname(symbol);
++
+ if (strstr(symbol, " module)")) {
+ sprintf(buf, "_MODULE_START_");
+ strcat(buf, &symbol[1]);
+@@ -5600,7 +6539,7 @@ kernel_symbol_search(char *symbol)
+ int
+ get_syment_array(char *symbol, struct syment **sp_array, int max)
+ {
+- int i, cnt;
++ int i, cnt, t;
+ struct syment *sp, *sp_end;
+ struct load_module *lm;
+
+@@ -5625,6 +6564,31 @@ get_syment_array(char *symbol, struct syment **sp_array, int max)
+ }
+ }
+
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++
++ sp = lm->symtable[t];
++ sp_end = lm->symend[t];
++ for (; sp < sp_end; sp++) {
++ if (STREQ(symbol, sp->name)) {
++ if (max && (cnt < max))
++ sp_array[cnt] = sp;
++ cnt++;
++ }
++ }
++ }
++ }
++
++ return cnt;
++
++old_module:
+ for (i = 0; i < st->mods_installed; i++) {
+ lm = &st->load_modules[i];
+ sp = lm->mod_symtable;
+@@ -9229,6 +10193,9 @@ dump_offset_table(char *spec, ulong makestruct)
+ OFFSET(module_strtab));
+ fprintf(fp, " module_percpu: %ld\n",
+ OFFSET(module_percpu));
++ fprintf(fp, " module_mem: %ld\n", OFFSET(module_mem));
++ fprintf(fp, " module_memory_base: %ld\n", OFFSET(module_memory_base));
++ fprintf(fp, " module_memory_size: %ld\n", OFFSET(module_memory_size));
+
+ fprintf(fp, " module_sect_attrs: %ld\n",
+ OFFSET(module_sect_attrs));
+@@ -10852,6 +11819,7 @@ dump_offset_table(char *spec, ulong makestruct)
+ SIZE(super_block));
+ fprintf(fp, " irqdesc: %ld\n", SIZE(irqdesc));
+ fprintf(fp, " module: %ld\n", SIZE(module));
++ fprintf(fp, " module_memory: %ld\n", SIZE(module_memory));
+ fprintf(fp, " module_sect_attr: %ld\n", SIZE(module_sect_attr));
+ fprintf(fp, " list_head: %ld\n", SIZE(list_head));
+ fprintf(fp, " hlist_head: %ld\n", SIZE(hlist_head));
+@@ -11467,6 +12435,13 @@ store_section_data(struct load_module *lm, bfd *bfd, asection *section)
+ lm->mod_section_data[i].section = section;
+ lm->mod_section_data[i].priority = prio;
+ lm->mod_section_data[i].flags = section->flags & ~SEC_FOUND;
++ lm->mod_section_data[i].size = bfd_section_size(section);
++ lm->mod_section_data[i].offset = 0;
++ lm->mod_section_data[i].addr = 0;
++ if (strlen(name) < MAX_MOD_SEC_NAME)
++ strcpy(lm->mod_section_data[i].name, name);
++ else
++ strncpy(lm->mod_section_data[i].name, name, MAX_MOD_SEC_NAME-1);
+ /*
+ * The percpu section isn't included in kallsyms or module_core area.
+ */
+@@ -11474,13 +12449,8 @@ store_section_data(struct load_module *lm, bfd *bfd, asection *section)
+ (STREQ(name,".data.percpu") || STREQ(name, ".data..percpu"))) {
+ lm->mod_percpu_size = bfd_section_size(section);
+ lm->mod_section_data[i].flags |= SEC_FOUND;
++ lm->mod_section_data[i].addr = lm->mod_percpu;
+ }
+- lm->mod_section_data[i].size = bfd_section_size(section);
+- lm->mod_section_data[i].offset = 0;
+- if (strlen(name) < MAX_MOD_SEC_NAME)
+- strcpy(lm->mod_section_data[i].name, name);
+- else
+- strncpy(lm->mod_section_data[i].name, name, MAX_MOD_SEC_NAME-1);
+ lm->mod_sections += 1;
+ }
+
+@@ -11722,6 +12692,124 @@ calculate_load_order_v2(struct load_module *lm, bfd *bfd, int dynamic,
+ }
+ }
+
++/* Linux 6.4 and later */
++static void
++calculate_load_order_6_4(struct load_module *lm, bfd *bfd, int dynamic,
++ void *minisyms, long symcount, unsigned int size)
++{
++ struct syment *s1, *s2;
++ ulong sec_start;
++ bfd_byte *from, *fromend;
++ asymbol *store;
++ asymbol *sym;
++ symbol_info syminfo;
++ char *secname;
++ int i, t;
++
++ if ((store = bfd_make_empty_symbol(bfd)) == NULL)
++ error(FATAL, "bfd_make_empty_symbol() failed\n");
++
++ for_each_mod_mem_type(t) {
++ s1 = lm->symtable[t];
++ s2 = lm->symend[t];
++ while (s1 < s2) {
++
++ if (MODULE_PSEUDO_SYMBOL(s1)) {
++ s1++;
++ continue;
++ }
++
++ /* Skip over symbols whose sections have been identified. */
++ for (i = 0; i < lm->mod_sections; i++) {
++ if ((lm->mod_section_data[i].flags & SEC_FOUND) == 0)
++ continue;
++
++ if (s1->value >= lm->mod_section_data[i].addr &&
++ s1->value < lm->mod_section_data[i].addr
++ + lm->mod_section_data[i].size)
++ break;
++ }
++
++ /* Matched one of the sections. Skip symbol. */
++ if (i < lm->mod_sections) {
++ if (CRASHDEBUG(2))
++ fprintf(fp, "skip %lx %s %s\n", s1->value, s1->name,
++ lm->mod_section_data[i].name);
++ s1++;
++ continue;
++ }
++
++ /* Find the symbol in the object file. */
++ from = (bfd_byte *) minisyms;
++ fromend = from + symcount * size;
++ secname = NULL;
++ for (; from < fromend; from += size) {
++ if (!(sym = bfd_minisymbol_to_symbol(bfd, dynamic, from, store)))
++ error(FATAL, "bfd_minisymbol_to_symbol() failed\n");
++
++ bfd_get_symbol_info(bfd, sym, &syminfo);
++ if (CRASHDEBUG(3)) {
++ fprintf(fp,"matching sym %s %lx against bfd %s %lx\n",
++ s1->name, (long) s1->value, syminfo.name,
++ (long) syminfo.value);
++ }
++ if (strcmp(syminfo.name, s1->name) == 0) {
++ secname = (char *)bfd_section_name(sym->section);
++ break;
++ }
++
++ }
++ if (secname == NULL) {
++ if (CRASHDEBUG(1))
++ fprintf(fp, "symbol %s not found in module\n", s1->name);
++ s1++;
++ continue;
++ }
++
++ /* Match the section it came in. */
++ for (i = 0; i < lm->mod_sections; i++) {
++ if (STREQ(lm->mod_section_data[i].name, secname))
++ break;
++ }
++
++ if (i == lm->mod_sections) {
++ fprintf(fp, "?? Section %s not found for symbol %s\n",
++ secname, s1->name);
++ s1++;
++ continue;
++ }
++
++ if (lm->mod_section_data[i].flags & SEC_FOUND) {
++ s1++;
++ continue;
++ }
++
++ /* Update the offset information for the section */
++ sec_start = s1->value - syminfo.value;
++ /* keep the address instead of offset */
++ lm->mod_section_data[i].addr = sec_start;
++ lm->mod_section_data[i].flags |= SEC_FOUND;
++
++ if (CRASHDEBUG(2))
++ fprintf(fp, "update sec offset sym %s @ %lx val %lx section %s\n",
++ s1->name, s1->value, (ulong)syminfo.value, secname);
++
++ if (strcmp(secname, ".text") == 0)
++ lm->mod_text_start = sec_start;
++
++ if (strcmp(secname, ".bss") == 0)
++ lm->mod_bss_start = sec_start;
++
++ if (strcmp(secname, ".data") == 0)
++ lm->mod_data_start = sec_start;
++
++ if (strcmp(secname, ".rodata") == 0)
++ lm->mod_rodata_start = sec_start;
++ s1++;
++ }
++ }
++}
++
+ /*
+ * Later versons of insmod store basic address information of each
+ * module in a format that looks like the following example of the
+@@ -11927,8 +13015,11 @@ add_symbol_file(struct load_module *lm)
+ (!STREQ(secname, ".text") &&
+ !STREQ(secname, ".data.percpu") &&
+ !STREQ(secname, ".data..percpu"))) {
+- sprintf(buf, " -s %s 0x%lx", secname,
+- lm->mod_section_data[i].offset + lm->mod_base);
++ if (MODULE_MEMORY())
++ sprintf(buf, " -s %s 0x%lx", secname, lm->mod_section_data[i].addr);
++ else
++ sprintf(buf, " -s %s 0x%lx", secname,
++ lm->mod_section_data[i].offset + lm->mod_base);
+ len += strlen(buf);
+ }
+ }
+@@ -12269,24 +13360,43 @@ static struct syment *
+ kallsyms_module_symbol(struct load_module *lm, symbol_info *syminfo)
+ {
+ struct syment *sp, *spx;
+- int cnt;
++ int cnt, t;
+
+ if (!(lm->mod_flags & MOD_KALLSYMS))
+ return NULL;
+
+ sp = NULL;
+ cnt = 0;
+- for (spx = lm->mod_ext_symtable; spx <= lm->mod_ext_symend; spx++) {
+- if (!STREQ(spx->name, syminfo->name))
+- continue;
+- if (spx->cnt) {
+- cnt++;
+- continue;
+- }
++ if (MODULE_MEMORY()) {
++ for_each_mod_mem_type(t) {
++ if (!lm->ext_symtable[t])
++ continue;
++ for (spx = lm->ext_symtable[t]; spx <= lm->ext_symend[t]; spx++) {
++ if (!STREQ(spx->name, syminfo->name))
++ continue;
++ if (spx->cnt) {
++ cnt++;
++ continue;
++ }
+
+- spx->cnt++;
+- sp = spx;
+- break;
++ spx->cnt++;
++ sp = spx;
++ break;
++ }
++ }
++ } else {
++ for (spx = lm->mod_ext_symtable; spx <= lm->mod_ext_symend; spx++) {
++ if (!STREQ(spx->name, syminfo->name))
++ continue;
++ if (spx->cnt) {
++ cnt++;
++ continue;
++ }
++
++ spx->cnt++;
++ sp = spx;
++ break;
++ }
+ }
+
+ if (CRASHDEBUG(2)) {
+@@ -12312,7 +13422,7 @@ static void
+ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ long symcount, unsigned int size, ulong base_addr, char *namelist)
+ {
+- int i;
++ int i, t;
+ asymbol *store;
+ asymbol *sym;
+ bfd_byte *from, *fromend;
+@@ -12323,7 +13433,7 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ char *nameptr, *secname;
+ long index;
+ long symalloc;
+- int found;
++ int found = FALSE;
+
+ if ((store = bfd_make_empty_symbol(bfd)) == NULL)
+ error(FATAL, "bfd_make_empty_symbol() failed\n");
+@@ -12380,8 +13490,17 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ lm->mod_rodata_start = lm->mod_bss_start = 0;
+ lm->mod_load_symcnt = 0;
+ lm->mod_sections = 0;
+- for (spx = lm->mod_ext_symtable; spx <= lm->mod_ext_symend; spx++)
+- spx->cnt = 0;
++ if (MODULE_MEMORY()) {
++ for_each_mod_mem_type(t) {
++ if (!lm->ext_symtable[t])
++ continue;
++ for (spx = lm->ext_symtable[t]; spx <= lm->ext_symend[t]; spx++)
++ spx->cnt = 0;
++ }
++ } else {
++ for (spx = lm->mod_ext_symtable; spx <= lm->mod_ext_symend; spx++)
++ spx->cnt = 0;
++ }
+ sp = lm->mod_load_symtable;
+
+ if (!(lm->mod_section_data = (struct mod_section_data *)
+@@ -12392,13 +13511,14 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+
+ bfd_map_over_sections(bfd, section_header_info, MODULE_SECTIONS);
+
+- if (kt->flags & KMOD_V1)
++ if (MODULE_MEMORY())
++ calculate_load_order_6_4(lm, bfd, dynamic, minisyms, symcount, size);
++ else if (kt->flags & KMOD_V1)
+ calculate_load_order_v1(lm, bfd);
+ else
+ calculate_load_order_v2(lm, bfd, dynamic, minisyms,
+ symcount, size);
+
+-
+ from = (bfd_byte *) minisyms;
+ fromend = from + symcount * size;
+ for (; from < fromend; from += size)
+@@ -12501,7 +13621,10 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ syminfo.value += lm->mod_percpu;
+ found = TRUE;
+ } else {
+- syminfo.value += lm->mod_section_data[i].offset + lm->mod_base;
++ if (MODULE_MEMORY())
++ syminfo.value += lm->mod_section_data[i].addr;
++ else
++ syminfo.value += lm->mod_section_data[i].offset + lm->mod_base;
+ found = TRUE;
+ }
+ }
+@@ -12536,6 +13659,53 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ * syminfo data types accepted above, plus the two pseudo symbols.
+ * Note that the new syment name pointers haven't been resolved yet.
+ */
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for_each_mod_mem_type(t) {
++ if (!lm->ext_symtable[t])
++ continue;
++ for (spx = lm->ext_symtable[t]; spx <= lm->ext_symend[t]; spx++) {
++ found = FALSE;
++ for (sp = lm->mod_load_symtable; sp < lm->mod_load_symend; sp++) {
++ index = (long)sp->name;
++ nameptr = &lm->mod_load_namespace.address[index];
++ if (STREQ(spx->name, nameptr)) {
++ found = TRUE;
++ if (spx->value == sp->value) {
++ if (CRASHDEBUG(2))
++ fprintf(fp, "%s: %s matches!\n",
++ lm->mod_name, nameptr);
++ } else {
++ if (CRASHDEBUG(2))
++ fprintf(fp,
++ "[%s] %s: %lx != extern'd value: %lx\n",
++ lm->mod_name,
++ nameptr, sp->value,
++ spx->value);
++ }
++ break;
++ }
++ }
++ if (!found) {
++ if (CRASHDEBUG(2))
++ fprintf(fp, "append ext %s (%lx)\n", spx->name, spx->value);
++ /* append it here... */
++ namespace_ctl(NAMESPACE_INSTALL,
++ &lm->mod_load_namespace,
++ lm->mod_load_symend, spx->name);
++
++ lm->mod_load_symend->value = spx->value;
++ lm->mod_load_symend->type = spx->type;
++ lm->mod_load_symend->flags |= MODULE_SYMBOL;
++ lm->mod_load_symend++;
++ lm->mod_load_symcnt++;
++ }
++ }
++ }
++ goto append_section_symbols;
++
++old_module:
+ for (spx = lm->mod_ext_symtable; spx <= lm->mod_ext_symend; spx++) {
+ found = FALSE;
+ for (sp = lm->mod_load_symtable;
+@@ -12578,6 +13748,7 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ }
+ }
+
++append_section_symbols:
+ /*
+ * Append helpful pseudo symbols about found out sections.
+ * Use 'S' as its type which is never seen in existing symbols.
+@@ -12587,8 +13758,11 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ if (!(lm->mod_section_data[i].flags & SEC_FOUND))
+ continue;
+ /* Section start */
+- lm->mod_load_symend->value = lm->mod_base +
+- lm->mod_section_data[i].offset;
++ if (MODULE_MEMORY())
++ lm->mod_load_symend->value = lm->mod_section_data[i].addr;
++ else
++ lm->mod_load_symend->value = lm->mod_base +
++ lm->mod_section_data[i].offset;
+ lm->mod_load_symend->type = 'S';
+ lm->mod_load_symend->flags |= MODULE_SYMBOL;
+ sprintf(name, "_MODULE_SECTION_START [%s]",
+@@ -12599,9 +13773,12 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ lm->mod_load_symcnt++;
+
+ /* Section end */
+- lm->mod_load_symend->value = lm->mod_base +
+- lm->mod_section_data[i].offset +
+- lm->mod_section_data[i].size;
++ if (MODULE_MEMORY())
++ lm->mod_load_symend->value = lm->mod_section_data[i].addr;
++ else
++ lm->mod_load_symend->value = lm->mod_base +
++ lm->mod_section_data[i].offset;
++ lm->mod_load_symend->value += lm->mod_section_data[i].size;
+ lm->mod_load_symend->type = 'S';
+ lm->mod_load_symend->flags |= MODULE_SYMBOL;
+ sprintf(name, "_MODULE_SECTION_END [%s]",
+@@ -12618,16 +13795,57 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ qsort(lm->mod_load_symtable, lm->mod_load_symcnt, sizeof(struct syment),
+ compare_syms);
+
++ if (MODULE_MEMORY()) {
++ /* keep load symtable addresses to lm->load_symtable[] */
++ /* TODO: make more efficient */
++ for (sp = lm->mod_load_symtable; sp < lm->mod_load_symend; sp++) {
++ char buf1[BUFSIZE], buf2[BUFSIZE];
++
++ if (CRASHDEBUG(2))
++ fprintf(fp, "DEBUG: value %16lx name %s\n", sp->value, sp->name);
++
++ if (!MODULE_PSEUDO_SYMBOL(sp))
++ continue;
++
++ for_each_mod_mem_type(t) {
++ if (!lm->mem[t].size)
++ continue;
++
++ sprintf(buf1, "%s%s", module_tag[t].start, lm->mod_name);
++ sprintf(buf2, "%s%s", module_tag[t].end, lm->mod_name);
++
++ if (STREQ(sp->name, buf1)) {
++ lm->load_symtable[t] = sp;
++ break;
++ } else if (STREQ(sp->name, buf2)) {
++ lm->load_symend[t] = sp;
++ break;
++ }
++ }
++ }
++ }
++
+ lm->mod_load_symend--;
+- if (!MODULE_END(lm->mod_load_symend) &&
++ if (!MODULE_MEMORY() && !MODULE_END(lm->mod_load_symend) &&
+ !IN_MODULE_PERCPU(lm->mod_load_symend->value, lm))
+ error(INFO, "%s: last symbol: %s is not _MODULE_END_%s?\n",
+ lm->mod_name, lm->mod_load_symend->name, lm->mod_name);
+
+- mod_symtable_hash_remove_range(lm->mod_symtable, lm->mod_symend);
+- lm->mod_symtable = lm->mod_load_symtable;
+- lm->mod_symend = lm->mod_load_symend;
+- mod_symtable_hash_install_range(lm->mod_symtable, lm->mod_symend);
++ if (MODULE_MEMORY()) {
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++ mod_symtable_hash_remove_range(lm->symtable[t], lm->symend[t]);
++ }
++ lm->symtable = lm->load_symtable;
++ lm->symend = lm->load_symend;
++ mod_symtable_hash_install_range(lm->mod_load_symtable, lm->mod_load_symend);
++ } else {
++ mod_symtable_hash_remove_range(lm->mod_symtable, lm->mod_symend);
++ lm->mod_symtable = lm->mod_load_symtable;
++ lm->mod_symend = lm->mod_load_symend;
++ mod_symtable_hash_install_range(lm->mod_symtable, lm->mod_symend);
++ }
+
+ lm->mod_flags &= ~MOD_EXT_SYMS;
+ lm->mod_flags |= MOD_LOAD_SYMS;
+@@ -12642,7 +13860,7 @@ store_load_module_symbols(bfd *bfd, int dynamic, void *minisyms,
+ void
+ delete_load_module(ulong base_addr)
+ {
+- int i;
++ int i, t;
+ struct load_module *lm;
+ struct gnu_request request, *req;
+
+@@ -12657,7 +13875,18 @@ delete_load_module(ulong base_addr)
+ req->name = lm->mod_namelist;
+ gdb_interface(req);
+ }
+- mod_symtable_hash_remove_range(lm->mod_symtable, lm->mod_symend);
++ if (MODULE_MEMORY()) {
++ if (lm->mod_load_symtable) {
++ mod_symtable_hash_remove_range(lm->mod_load_symtable,
++ lm->mod_load_symend);
++ for_each_mod_mem_type(t) {
++ lm->load_symtable[t] = NULL;
++ lm->load_symend[t] = NULL;
++ }
++ }
++ } else
++ mod_symtable_hash_remove_range(lm->mod_symtable, lm->mod_symend);
++
+ if (lm->mod_load_symtable) {
+ free(lm->mod_load_symtable);
+ namespace_ctl(NAMESPACE_FREE,
+@@ -12665,9 +13894,23 @@ delete_load_module(ulong base_addr)
+ }
+ if (lm->mod_flags & MOD_REMOTE)
+ unlink_module(lm);
+- lm->mod_symtable = lm->mod_ext_symtable;
+- lm->mod_symend = lm->mod_ext_symend;
+- mod_symtable_hash_install_range(lm->mod_symtable, lm->mod_symend);
++
++ if (MODULE_MEMORY()) {
++ if (lm->mod_load_symtable) { /* still non-NULL */
++ lm->symtable = lm->ext_symtable;
++ lm->symend = lm->ext_symend;
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++ mod_symtable_hash_install_range(lm->symtable[t],
++ lm->symend[t]);
++ }
++ }
++ } else {
++ lm->mod_symtable = lm->mod_ext_symtable;
++ lm->mod_symend = lm->mod_ext_symend;
++ mod_symtable_hash_install_range(lm->mod_symtable, lm->mod_symend);
++ }
+ lm->mod_flags &= ~(MOD_LOAD_SYMS|MOD_REMOTE|MOD_NOPATCH);
+ lm->mod_flags |= MOD_EXT_SYMS;
+ lm->mod_load_symtable = NULL;
+@@ -12696,7 +13939,18 @@ delete_load_module(ulong base_addr)
+ req->name = lm->mod_namelist;
+ gdb_interface(req);
+ }
+- mod_symtable_hash_remove_range(lm->mod_symtable, lm->mod_symend);
++ if (MODULE_MEMORY()) {
++ if (lm->mod_load_symtable) {
++ mod_symtable_hash_remove_range(lm->mod_load_symtable,
++ lm->mod_load_symend);
++ for_each_mod_mem_type(t) {
++ lm->load_symtable[t] = NULL;
++ lm->load_symend[t] = NULL;
++ }
++ }
++ } else
++ mod_symtable_hash_remove_range(lm->mod_symtable, lm->mod_symend);
++
+ if (lm->mod_load_symtable) {
+ free(lm->mod_load_symtable);
+ namespace_ctl(NAMESPACE_FREE,
+@@ -12704,9 +13958,23 @@ delete_load_module(ulong base_addr)
+ }
+ if (lm->mod_flags & MOD_REMOTE)
+ unlink_module(lm);
+- lm->mod_symtable = lm->mod_ext_symtable;
+- lm->mod_symend = lm->mod_ext_symend;
+- mod_symtable_hash_install_range(lm->mod_symtable, lm->mod_symend);
++
++ if (MODULE_MEMORY()) {
++ if (lm->mod_load_symtable) {
++ lm->symtable = lm->ext_symtable;
++ lm->symend = lm->ext_symend;
++ for_each_mod_mem_type(t) {
++ if (!lm->symtable[t])
++ continue;
++ mod_symtable_hash_install_range(lm->symtable[t],
++ lm->symend[t]);
++ }
++ }
++ } else {
++ lm->mod_symtable = lm->mod_ext_symtable;
++ lm->mod_symend = lm->mod_ext_symend;
++ mod_symtable_hash_install_range(lm->mod_symtable, lm->mod_symend);
++ }
+ lm->mod_flags &= ~(MOD_LOAD_SYMS|MOD_REMOTE|MOD_NOPATCH);
+ lm->mod_flags |= MOD_EXT_SYMS;
+ lm->mod_load_symtable = NULL;
+@@ -13455,7 +14723,7 @@ is_downsized(char *name)
+ struct syment *
+ symbol_complete_match(const char *match, struct syment *sp_last)
+ {
+- int i;
++ int i, t;
+ struct syment *sp, *sp_end, *sp_start;
+ struct load_module *lm;
+ int search_init;
+@@ -13475,6 +14743,34 @@ symbol_complete_match(const char *match, struct syment *sp_last)
+ sp_start = NULL;
+ }
+
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = 0; i < st->mods_installed; i++) {
++ lm = &st->load_modules[i];
++
++ for_each_mod_mem_type(t) {
++ sp_end = lm->symend[t];
++ if (!sp_start)
++ sp_start = lm->symtable[t];
++
++ if (sp_start < lm->symtable[t] || sp_start > sp_end)
++ continue;
++
++ for (sp = sp_start; sp < sp_end; sp++) {
++ if (MODULE_PSEUDO_SYMBOL(sp))
++ continue;
++
++ if (STRNEQ(sp->name, match))
++ return sp;
++ }
++ sp_start = NULL;
++ }
++ }
++
++ return NULL;
++
++old_module:
+ search_init = FALSE;
+
+ for (i = 0; i < st->mods_installed; i++) {
+@@ -13521,3 +14817,58 @@ symbol_complete_match(const char *match, struct syment *sp_last)
+
+ return NULL;
+ }
++
++/* Returns module memory type if addr is in range, otherwise MOD_INVALID(-1) */
++static int
++in_module_range(ulong addr, struct load_module *lm, int start, int end)
++{
++ ulong base = 0, size = 0;
++ int i;
++
++ if (!MODULE_MEMORY())
++ goto old_module;
++
++ for (i = start ; i <= end; i++) {
++ base = lm->mem[i].base;
++ size = lm->mem[i].size;
++ if (!size)
++ continue;
++ if ((addr >= base) && (addr < (base + size)))
++ return i;
++ }
++ return MOD_INVALID;
++
++old_module:
++ if (start == MOD_TEXT) {
++ base = lm->mod_base;
++ size = lm->mod_size;
++ } else if (start == MOD_INIT_TEXT) {
++ base = lm->mod_init_module_ptr;
++ size = lm->mod_init_size;
++ } else
++ error(FATAL, "invalid module memory type!");
++
++ if ((addr >= base) && (addr < (base + size)))
++ return start;
++
++ return MOD_INVALID;
++}
++
++/* Returns module memory type, otherwise MOD_INVALID(-1) */
++static int
++module_mem_type(ulong addr, struct load_module *lm)
++{
++ return in_module_range(addr, lm, MOD_TEXT, MOD_INIT_RODATA);
++}
++
++/* Returns the end address of the module memory region. */
++static ulong
++module_mem_end(ulong addr, struct load_module *lm)
++{
++ int type = module_mem_type(addr, lm);
++
++ if (type == MOD_INVALID)
++ return 0;
++
++ return lm->mem[type].base + lm->mem[type].size;
++}
+--
+2.37.1
+
diff --git a/0014-RISCV64-Add-help-m-M-command-support.patch b/0014-RISCV64-Add-help-m-M-command-support.patch
deleted file mode 100644
index 439c0cc..0000000
--- a/0014-RISCV64-Add-help-m-M-command-support.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From 6c281cd355c904ddb82cbb49278b925d2ed13365 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:12 +0800
-Subject: [PATCH 14/28] RISCV64: Add 'help -m/M' command support
-
-Add riscv64_dump_machdep_table() implementation, display machdep_table.
-
-crash> help -m
- flags: 80 ()
- kvbase: ff60000000000000
- identity_map_base: ff60000000000000
- pagesize: 4096
- pageshift: 12
- pagemask: fffffffffffff000
- pageoffset: fff
- pgdir_shift: 48
- ptrs_per_pgd: 512
- ptrs_per_pte: 512
- stacksize: 16384
- hz: 250
- memsize: 1071644672 (0x3fe00000)
- bits: 64
- back_trace: riscv64_back_trace_cmd()
- processor_speed: riscv64_processor_speed()
- uvtop: riscv64_uvtop()
- kvtop: riscv64_kvtop()
- get_stack_frame: riscv64_get_stack_frame()
- get_stackbase: generic_get_stackbase()
- get_stacktop: generic_get_stacktop()
- translate_pte: riscv64_translate_pte()
- memory_size: generic_memory_size()
- vmalloc_start: riscv64_vmalloc_start()
- is_task_addr: riscv64_is_task_addr()
- verify_symbol: riscv64_verify_symbol()
- dis_filter: generic_dis_filter()
- dump_irq: generic_dump_irq()
- show_interrupts: generic_show_interrupts()
- get_irq_affinity: generic_get_irq_affinity()
- cmd_mach: riscv64_cmd_mach()
- get_smp_cpus: riscv64_get_smp_cpus()
- is_kvaddr: riscv64_is_kvaddr()
- is_uvaddr: riscv64_is_uvaddr()
- verify_paddr: generic_verify_paddr()
- init_kernel_pgd: NULL
- value_to_symbol: generic_machdep_value_to_symbol()
- line_number_hooks: NULL
- last_pgd_read: ffffffff810e9000
- last_p4d_read: 81410000
- last_pud_read: 81411000
- last_pmd_read: 81412000
- last_ptbl_read: 81415000
- pgd: 560d586f3ab0
- p4d: 560d586f4ac0
- pud: 560d586f5ad0
- pmd: 560d586f6ae0
- ptbl: 560d586f7af0
- section_size_bits: 27
- max_physmem_bits: 56
- sections_per_root: 0
- machspec: 560d57d204a0
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- riscv64.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 59 insertions(+), 1 deletion(-)
-
-diff --git a/riscv64.c b/riscv64.c
-index 6d1d3b5f36d1..5e8c7d12227c 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -132,7 +132,65 @@ riscv64_verify_symbol(const char *name, ulong value, char type)
- void
- riscv64_dump_machdep_table(ulong arg)
- {
-- /* TODO: */
-+ int others = 0;
-+
-+ fprintf(fp, " flags: %lx (", machdep->flags);
-+ if (machdep->flags & KSYMS_START)
-+ fprintf(fp, "%sKSYMS_START", others++ ? "|" : "");
-+ fprintf(fp, ")\n");
-+
-+ fprintf(fp, " kvbase: %lx\n", machdep->kvbase);
-+ fprintf(fp, " identity_map_base: %lx\n", machdep->identity_map_base);
-+ fprintf(fp, " pagesize: %d\n", machdep->pagesize);
-+ fprintf(fp, " pageshift: %d\n", machdep->pageshift);
-+ fprintf(fp, " pagemask: %llx\n", machdep->pagemask);
-+ fprintf(fp, " pageoffset: %lx\n", machdep->pageoffset);
-+ fprintf(fp, " pgdir_shift: %ld\n", machdep->machspec->va_bits - 9);
-+ fprintf(fp, " ptrs_per_pgd: %u\n", PTRS_PER_PGD);
-+ fprintf(fp, " ptrs_per_pte: %d\n", PTRS_PER_PTE);
-+ fprintf(fp, " stacksize: %ld\n", machdep->stacksize);
-+ fprintf(fp, " hz: %d\n", machdep->hz);
-+ fprintf(fp, " memsize: %ld (0x%lx)\n",
-+ machdep->memsize, machdep->memsize);
-+ fprintf(fp, " bits: %d\n", machdep->bits);
-+ fprintf(fp, " back_trace: riscv64_back_trace_cmd()\n");
-+ fprintf(fp, " processor_speed: riscv64_processor_speed()\n");
-+ fprintf(fp, " uvtop: riscv64_uvtop()\n");
-+ fprintf(fp, " kvtop: riscv64_kvtop()\n");
-+ fprintf(fp, " get_stack_frame: riscv64_get_stack_frame()\n");
-+ fprintf(fp, " get_stackbase: generic_get_stackbase()\n");
-+ fprintf(fp, " get_stacktop: generic_get_stacktop()\n");
-+ fprintf(fp, " translate_pte: riscv64_translate_pte()\n");
-+ fprintf(fp, " memory_size: generic_memory_size()\n");
-+ fprintf(fp, " vmalloc_start: riscv64_vmalloc_start()\n");
-+ fprintf(fp, " is_task_addr: riscv64_is_task_addr()\n");
-+ fprintf(fp, " verify_symbol: riscv64_verify_symbol()\n");
-+ fprintf(fp, " dis_filter: generic_dis_filter()\n");
-+ fprintf(fp, " dump_irq: generic_dump_irq()\n");
-+ fprintf(fp, " show_interrupts: generic_show_interrupts()\n");
-+ fprintf(fp, " get_irq_affinity: generic_get_irq_affinity()\n");
-+ fprintf(fp, " cmd_mach: riscv64_cmd_mach()\n");
-+ fprintf(fp, " get_smp_cpus: riscv64_get_smp_cpus()\n");
-+ fprintf(fp, " is_kvaddr: riscv64_is_kvaddr()\n");
-+ fprintf(fp, " is_uvaddr: riscv64_is_uvaddr()\n");
-+ fprintf(fp, " verify_paddr: generic_verify_paddr()\n");
-+ fprintf(fp, " init_kernel_pgd: NULL\n");
-+ fprintf(fp, " value_to_symbol: generic_machdep_value_to_symbol()\n");
-+ fprintf(fp, " line_number_hooks: NULL\n");
-+ fprintf(fp, " last_pgd_read: %lx\n", machdep->last_pgd_read);
-+ fprintf(fp, " last_p4d_read: %lx\n", machdep->machspec->last_p4d_read);
-+ fprintf(fp, " last_pud_read: %lx\n", machdep->last_pud_read);
-+ fprintf(fp, " last_pmd_read: %lx\n", machdep->last_pmd_read);
-+ fprintf(fp, " last_ptbl_read: %lx\n", machdep->last_ptbl_read);
-+ fprintf(fp, " pgd: %lx\n", (ulong)machdep->pgd);
-+ fprintf(fp, " p4d: %lx\n", (ulong)machdep->machspec->p4d);
-+ fprintf(fp, " pud: %lx\n", (ulong)machdep->pud);
-+ fprintf(fp, " pmd: %lx\n", (ulong)machdep->pmd);
-+ fprintf(fp, " ptbl: %lx\n", (ulong)machdep->ptbl);
-+ fprintf(fp, " section_size_bits: %ld\n", machdep->section_size_bits);
-+ fprintf(fp, " max_physmem_bits: %ld\n", machdep->max_physmem_bits);
-+ fprintf(fp, " sections_per_root: %ld\n", machdep->sections_per_root);
-+ fprintf(fp, " machspec: %lx\n", (ulong)machdep->machspec);
- }
-
- static ulong
---
-2.37.1
-
diff --git a/0015-RISCV64-Add-mach-command-support.patch b/0015-RISCV64-Add-mach-command-support.patch
deleted file mode 100644
index 443a0ff..0000000
--- a/0015-RISCV64-Add-mach-command-support.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 3f4714967961c2ca8b70dccb938a5258b6572d2b Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:13 +0800
-Subject: [PATCH 15/28] RISCV64: Add 'mach' command support
-
-With the patch we can get some basic machine state information,
-crash> mach
- MACHINE TYPE: riscv64
- MEMORY SIZE: 1 GB
- CPUS: 1
- PROCESSOR SPEED: (unknown)
- HZ: 250
- PAGE SIZE: 4096
- KERNEL STACK SIZE: 16384
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- riscv64.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 44 insertions(+), 1 deletion(-)
-
-diff --git a/riscv64.c b/riscv64.c
-index 5e8c7d12227c..ff77e41b9407 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -116,10 +116,53 @@ static void riscv64_get_struct_page_size(struct machine_specific *ms)
- }
- }
-
-+/*
-+ * "mach" command output.
-+ */
-+static void
-+riscv64_display_machine_stats(void)
-+{
-+ struct new_utsname *uts;
-+ char buf[BUFSIZE];
-+ ulong mhz;
-+
-+ uts = &kt->utsname;
-+
-+ fprintf(fp, " MACHINE TYPE: %s\n", uts->machine);
-+ fprintf(fp, " MEMORY SIZE: %s\n", get_memory_size(buf));
-+ fprintf(fp, " CPUS: %d\n", get_cpus_to_display());
-+ fprintf(fp, " PROCESSOR SPEED: ");
-+ if ((mhz = machdep->processor_speed()))
-+ fprintf(fp, "%ld Mhz\n", mhz);
-+ else
-+ fprintf(fp, "(unknown)\n");
-+ fprintf(fp, " HZ: %d\n", machdep->hz);
-+ fprintf(fp, " PAGE SIZE: %d\n", PAGESIZE());
-+ fprintf(fp, " KERNEL STACK SIZE: %ld\n", STACKSIZE());
-+}
-+
- static void
- riscv64_cmd_mach(void)
- {
-- /* TODO: */
-+ int c;
-+
-+ while ((c = getopt(argcnt, args, "cmo")) != EOF) {
-+ switch (c) {
-+ case 'c':
-+ case 'm':
-+ case 'o':
-+ option_not_supported(c);
-+ break;
-+ default:
-+ argerrs++;
-+ break;
-+ }
-+ }
-+
-+ if (argerrs)
-+ cmd_usage(pc->curcmd, SYNOPSIS);
-+
-+ riscv64_display_machine_stats();
- }
-
- static int
---
-2.37.1
-
diff --git a/0016-RISCV64-Add-the-implementation-of-symbol-verify.patch b/0016-RISCV64-Add-the-implementation-of-symbol-verify.patch
deleted file mode 100644
index 21f4bbb..0000000
--- a/0016-RISCV64-Add-the-implementation-of-symbol-verify.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 0d5ad129252a18a46d1818a68ed22b35c5234289 Mon Sep 17 00:00:00 2001
-From: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Date: Thu, 20 Oct 2022 09:50:14 +0800
-Subject: [PATCH 16/28] RISCV64: Add the implementation of symbol verify
-
-Verify the symbol to accept or reject a symbol from the kernel namelist.
-
-Signed-off-by: Xianting Tian <xianting.tian(a)linux.alibaba.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- riscv64.c | 15 ++++++++++++++-
- 1 file changed, 14 insertions(+), 1 deletion(-)
-
-diff --git a/riscv64.c b/riscv64.c
-index ff77e41b9407..6b9a68840d4c 100644
---- a/riscv64.c
-+++ b/riscv64.c
-@@ -165,10 +165,23 @@ riscv64_cmd_mach(void)
- riscv64_display_machine_stats();
- }
-
-+/*
-+ * Accept or reject a symbol from the kernel namelist.
-+ */
- static int
- riscv64_verify_symbol(const char *name, ulong value, char type)
- {
-- /* TODO: */
-+ if (CRASHDEBUG(8) && name && strlen(name))
-+ fprintf(fp, "%08lx %s\n", value, name);
-+
-+ if (!(machdep->flags & KSYMS_START)) {
-+ if (STREQ(name, "_text") || STREQ(name, "_stext"))
-+ machdep->flags |= KSYMS_START;
-+
-+ return (name && strlen(name) && !STRNEQ(name, "__func__.") &&
-+ !STRNEQ(name, "__crc_"));
-+ }
-+
- return TRUE;
- }
-
---
-2.37.1
-
diff --git a/0017-SLUB-Fix-for-offset-change-of-struct-slab-members-on.patch b/0017-SLUB-Fix-for-offset-change-of-struct-slab-members-on.patch
deleted file mode 100644
index 19fcb60..0000000
--- a/0017-SLUB-Fix-for-offset-change-of-struct-slab-members-on.patch
+++ /dev/null
@@ -1,149 +0,0 @@
-From d83df2fb66cd77877d365fda32cd45c531796599 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Date: Fri, 16 Dec 2022 14:03:46 +0900
-Subject: [PATCH 17/28] SLUB: Fix for offset change of struct slab members on
- Linux 6.2-rc1
-
-The following kernel commits split slab info from struct page into
-struct slab in Linux 5.17.
-
- d122019bf061 ("mm: Split slab into its own type")
- 07f910f9b729 ("mm: Remove slab from struct page")
-
-Crash commit 5f390ed811b0 followed the change for SLUB, but crash still
-uses the offset of page.lru inappropriately. Luckily, it could work
-because it was the same value as the offset of slab.slab_list until
-Linux 6.1.
-
-However, kernel commit 130d4df57390 ("mm/sl[au]b: rearrange struct slab
-fields to allow larger rcu_head") in Linux 6.2-rc1 changed the offset of
-slab.slab_list. As a result, without the patch, "kmem -s|-S" options
-print the following errors and fail to print values correctly for
-kernels configured with CONFIG_SLUB.
-
- crash> kmem -S filp
- CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME
- kmem: filp: partial list slab: ffffcc650405ab88 invalid page.inuse: -1
- ffff8fa0401eca00 232 1267 1792 56 8k filp
- ...
- KMEM_CACHE_NODE NODE SLABS PARTIAL PER-CPU
- ffff8fa0401cb8c0 0 56 24 8
- NODE 0 PARTIAL:
- SLAB MEMORY NODE TOTAL ALLOCATED FREE
- kmem: filp: invalid partial list slab pointer: ffffcc650405ab88
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 1 +
- memory.c | 16 ++++++++++------
- symbols.c | 1 +
- 3 files changed, 12 insertions(+), 6 deletions(-)
-
-diff --git a/defs.h b/defs.h
-index 0cff47e30ae9..d3d837631632 100644
---- a/defs.h
-+++ b/defs.h
-@@ -2188,6 +2188,7 @@ struct offset_table { /* stash of commonly-used offsets */
- long blk_mq_tags_rqs;
- long request_queue_hctx_table;
- long percpu_counter_counters;
-+ long slab_slab_list;
- };
-
- struct size_table { /* stash of commonly-used sizes */
-diff --git a/memory.c b/memory.c
-index 9d003713534b..d05737cc1429 100644
---- a/memory.c
-+++ b/memory.c
-@@ -781,6 +781,8 @@ vm_init(void)
- if (INVALID_MEMBER(page_slab))
- MEMBER_OFFSET_INIT(page_slab, "slab", "slab_cache");
-
-+ MEMBER_OFFSET_INIT(slab_slab_list, "slab", "slab_list");
-+
- MEMBER_OFFSET_INIT(page_slab_page, "page", "slab_page");
- if (INVALID_MEMBER(page_slab_page))
- ANON_MEMBER_OFFSET_INIT(page_slab_page, "page", "slab_page");
-@@ -19474,6 +19476,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
- {
- ulong next, last, list_head, flags;
- int first;
-+ long list_off = VALID_MEMBER(slab_slab_list) ? OFFSET(slab_slab_list) : OFFSET(page_lru);
-
- if (!node_ptr)
- return;
-@@ -19487,7 +19490,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
- next == list_head ? " (empty)\n" : "");
- first = 0;
- while (next != list_head) {
-- si->slab = last = next - OFFSET(page_lru);
-+ si->slab = last = next - list_off;
- if (first++ == 0)
- fprintf(fp, " %s", slab_hdr);
-
-@@ -19510,7 +19513,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
-
- if (!IS_KVADDR(next) ||
- ((next != list_head) &&
-- !is_page_ptr(next - OFFSET(page_lru), NULL))) {
-+ !is_page_ptr(next - list_off, NULL))) {
- error(INFO,
- "%s: partial list slab: %lx invalid page.lru.next: %lx\n",
- si->curname, last, next);
-@@ -19537,7 +19540,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
- next == list_head ? " (empty)\n" : "");
- first = 0;
- while (next != list_head) {
-- si->slab = next - OFFSET(page_lru);
-+ si->slab = next - list_off;
- if (first++ == 0)
- fprintf(fp, " %s", slab_hdr);
-
-@@ -19754,6 +19757,7 @@ count_partial(ulong node, struct meminfo *si, ulong *free)
- short inuse, objects;
- ulong total_inuse;
- ulong count = 0;
-+ long list_off = VALID_MEMBER(slab_slab_list) ? OFFSET(slab_slab_list) : OFFSET(page_lru);
-
- count = 0;
- total_inuse = 0;
-@@ -19765,12 +19769,12 @@ count_partial(ulong node, struct meminfo *si, ulong *free)
- hq_open();
-
- while (next != list_head) {
-- if (!readmem(next - OFFSET(page_lru) + OFFSET(page_inuse),
-+ if (!readmem(next - list_off + OFFSET(page_inuse),
- KVADDR, &inuse, sizeof(ushort), "page.inuse", RETURN_ON_ERROR)) {
- hq_close();
- return -1;
- }
-- last = next - OFFSET(page_lru);
-+ last = next - list_off;
-
- if (inuse == -1) {
- error(INFO,
-@@ -19796,7 +19800,7 @@ count_partial(ulong node, struct meminfo *si, ulong *free)
- }
- if (!IS_KVADDR(next) ||
- ((next != list_head) &&
-- !is_page_ptr(next - OFFSET(page_lru), NULL))) {
-+ !is_page_ptr(next - list_off, NULL))) {
- error(INFO, "%s: partial list slab: %lx invalid page.lru.next: %lx\n",
- si->curname, last, next);
- break;
-diff --git a/symbols.c b/symbols.c
-index cb5b508dcc50..33e68d520a72 100644
---- a/symbols.c
-+++ b/symbols.c
-@@ -9710,6 +9710,7 @@ dump_offset_table(char *spec, ulong makestruct)
- OFFSET(slab_inuse));
- fprintf(fp, " slab_free: %ld\n",
- OFFSET(slab_free));
-+ fprintf(fp, " slab_slab_list: %ld\n", OFFSET(slab_slab_list));
-
- fprintf(fp, " kmem_cache_size: %ld\n",
- OFFSET(kmem_cache_size));
---
-2.37.1
-
diff --git a/0018-Fix-for-kmem-i-to-display-correct-SLAB-statistics-on.patch b/0018-Fix-for-kmem-i-to-display-correct-SLAB-statistics-on.patch
deleted file mode 100644
index 893076e..0000000
--- a/0018-Fix-for-kmem-i-to-display-correct-SLAB-statistics-on.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 41d4b85ea50efc733df65ec8421a74be10e47987 Mon Sep 17 00:00:00 2001
-From: Lianbo Jiang <lijiang(a)redhat.com>
-Date: Fri, 23 Dec 2022 18:42:35 +0800
-Subject: [PATCH 18/28] Fix for "kmem -i" to display correct SLAB statistics on
- Linux 5.9 and later
-
-Kernel commit d42f3245c7e2 ("mm: memcg: convert vmstat slab counters to
-bytes"), which is contained in Linux v5.9-rc1 and later kernels, renamed
-NR_SLAB_{RECLAIMABLE,UNRECLAIMABLE} to NR_SLAB_{RECLAIMABLE,UNRECLAIMABLE}_B.
-
-Without the patch, "kmem -i" command will display incorrect SLAB
-statistics:
-
- crash> kmem -i | grep -e PAGES -e SLAB
- PAGES TOTAL PERCENTAGE
- SLAB 89458 349.4 MB 0% of TOTAL MEM
- ^^^^^ ^^^^^
-
-With the patch, the actual result is:
- crash> kmem -i | grep -e PAGES -e SLAB
- PAGES TOTAL PERCENTAGE
- SLAB 261953 1023.3 MB 0% of TOTAL MEM
-
-Reported-by: Buland Kumar Singh <bsingh(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
----
- memory.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/memory.c b/memory.c
-index d05737cc1429..625a94b7d7d4 100644
---- a/memory.c
-+++ b/memory.c
-@@ -8388,6 +8388,11 @@ dump_kmeminfo(void)
- get_slabs = nr_slab;
- if (dump_vm_stat("NR_SLAB_UNRECLAIMABLE", &nr_slab, 0))
- get_slabs += nr_slab;
-+ } else if (dump_vm_stat("NR_SLAB_RECLAIMABLE_B", &nr_slab, 0)) {
-+ /* 5.9 and later */
-+ get_slabs = nr_slab;
-+ if (dump_vm_stat("NR_SLAB_UNRECLAIMABLE_B", &nr_slab, 0))
-+ get_slabs += nr_slab;
- }
- }
-
---
-2.37.1
-
diff --git a/0019-Fix-build-failure-due-to-no-EM_RISCV-with-glibc-2.23.patch b/0019-Fix-build-failure-due-to-no-EM_RISCV-with-glibc-2.23.patch
deleted file mode 100644
index 6f35fbb..0000000
--- a/0019-Fix-build-failure-due-to-no-EM_RISCV-with-glibc-2.23.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 4cf7c714e3cc97e6d41a9b1fdd48f5199f632a4d Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Date: Tue, 27 Dec 2022 09:53:46 +0900
-Subject: [PATCH 19/28] Fix build failure due to no EM_RISCV with glibc-2.23
- and earlier
-
-With glibc-2.23 and earlier (e.g. RHEL7), crash build fails with errors
-like this due to EM_RISCV undeclared:
-
- $ make -j 24 warn
- TARGET: X86_64
- CRASH: 8.0.2++
- GDB: 10.2
- ...
- symbols.c: In function 'is_kernel':
- symbols.c:3746:8: error: 'EM_RISCV' undeclared (first use in this function)
- case EM_RISCV:
- ^
- ...
-
-Define EM_RISCV as 243 [1][2] if not defined.
-
-[1] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=94e73c95d9b5
-[2] http://www.sco.com/developers/gabi/latest/ch4.eheader.html
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/defs.h b/defs.h
-index d3d837631632..08ac4dc96a92 100644
---- a/defs.h
-+++ b/defs.h
-@@ -3493,6 +3493,10 @@ struct arm64_stackframe {
- #define _MAX_PHYSMEM_BITS 48
- #endif /* MIPS64 */
-
-+#ifndef EM_RISCV
-+#define EM_RISCV 243
-+#endif
-+
- #ifdef RISCV64
- #define _64BIT_
- #define MACHINE_TYPE "RISCV64"
---
-2.37.1
-
diff --git a/0020-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch b/0020-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch
deleted file mode 100644
index 6f83e15..0000000
--- a/0020-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From a053a1442dff4eecd17aee089502feac922a7af7 Mon Sep 17 00:00:00 2001
-From: Lianbo Jiang <lijiang(a)redhat.com>
-Date: Mon, 26 Dec 2022 21:03:17 +0800
-Subject: [PATCH 20/28] gdb: Fix an assertion failure in the gdb's copy_type()
-
-This is a backported patch from gdb. Without the patch, the following
-crash command may abort due to an assertion failure in the gdb's
-copy_type():
-
- crash> px __per_cpu_start:0
- gdbtypes.c:5505: internal-error: type* copy_type(const type*): Assertion `TYPE_OBJFILE_OWNED (type)' failed.
- A problem internal to GDB has been detected,
- further debugging may prove unreliable.
- Quit this debugging session? (y or n)
-
-The gdb commit 8e2da1651879 ("Fix assertion failure in copy_type")
-solved the current issue.
-
-Reported-by: Buland Kumar Singh <bsingh(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- gdb-10.2.patch | 39 +++++++++++++++++++++++++++++++++++++++
- 1 file changed, 39 insertions(+)
-
-diff --git a/gdb-10.2.patch b/gdb-10.2.patch
-index 7055f6e0fb0b..aa34743501ad 100644
---- a/gdb-10.2.patch
-+++ b/gdb-10.2.patch
-@@ -2039,3 +2039,42 @@ exit 0
- }
- nextfield++;
- }
-+--- gdb-10.2/gdb/gdbtypes.c.orig
-++++ gdb-10.2/gdb/gdbtypes.c
-+@@ -5492,27 +5492,25 @@ copy_type_recursive (struct objfile *objfile,
-+ }
-+
-+ /* Make a copy of the given TYPE, except that the pointer & reference
-+- types are not preserved.
-+-
-+- This function assumes that the given type has an associated objfile.
-+- This objfile is used to allocate the new type. */
-++ types are not preserved. */
-+
-+ struct type *
-+ copy_type (const struct type *type)
-+ {
-+- struct type *new_type;
-+-
-+- gdb_assert (TYPE_OBJFILE_OWNED (type));
-++ struct type *new_type = alloc_type_copy (type);
-+
-+- new_type = alloc_type_copy (type);
-+ TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type);
-+ TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
-+ memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
-+ sizeof (struct main_type));
-+ if (type->main_type->dyn_prop_list != NULL)
-+- new_type->main_type->dyn_prop_list
-+- = copy_dynamic_prop_list (&TYPE_OBJFILE (type) -> objfile_obstack,
-+- type->main_type->dyn_prop_list);
-++ {
-++ struct obstack *storage = (TYPE_OBJFILE_OWNED (type)
-++ ? &TYPE_OBJFILE (type)->objfile_obstack
-++ : gdbarch_obstack (TYPE_OWNER (type).gdbarch));
-++ new_type->main_type->dyn_prop_list
-++ = copy_dynamic_prop_list (storage, type->main_type->dyn_prop_list);
-++ }
-+
-+ return new_type;
-+ }
---
-2.37.1
-
diff --git a/0021-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.1-and-later.patch b/0021-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.1-and-later.patch
deleted file mode 100644
index a187e07..0000000
--- a/0021-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.1-and-later.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 120d6e89fc14eb7f1c9a3106305c7066730f36b8 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Date: Thu, 5 Jan 2023 17:18:51 +0900
-Subject: [PATCH 21/28] SLAB: Fix for "kmem -s|-S" options on Linux 6.1 and
- later
-
-Kernel commit e36ce448a08d ("mm/slab: use kmalloc_node() for off slab
-freelist_idx_t array allocation"), which is contained in Linux 6.1 and
-later kernels, removed kmem_cache.freelist_cache member on kernels
-configured with CONFIG_SLAB=y.
-
-Without the patch, crash does not set SLAB_OVERLOAD_PAGE and
-"kmem -s|-S" options fail with the following error:
-
- kmem: invalid structure member offset: slab_list
- FILE: memory.c LINE: 12156 FUNCTION: verify_slab_v2()
-
-Use kmem_cache.freelist_size instead, which was introduced together
-with kmem_cache.freelist_cache by kernel commit 8456a648cf44.
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- memory.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/memory.c b/memory.c
-index 625a94b7d7d4..71ded688206f 100644
---- a/memory.c
-+++ b/memory.c
-@@ -535,8 +535,11 @@ vm_init(void)
- /*
- * slab: overload struct slab over struct page
- * https://lkml.org/lkml/2013/10/16/155
-+ *
-+ * commit e36ce448a08d removed kmem_cache.freelist_cache in 6.1,
-+ * so use freelist_size instead.
- */
-- if (MEMBER_EXISTS("kmem_cache", "freelist_cache")) {
-+ if (MEMBER_EXISTS("kmem_cache", "freelist_size")) {
- vt->flags |= SLAB_OVERLOAD_PAGE;
- ANON_MEMBER_OFFSET_INIT(page_s_mem, "page", "s_mem");
- ANON_MEMBER_OFFSET_INIT(page_freelist, "page", "freelist");
---
-2.37.1
-
diff --git a/0022-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.2-rc1-and-l.patch b/0022-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.2-rc1-and-l.patch
deleted file mode 100644
index 67f8deb..0000000
--- a/0022-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.2-rc1-and-l.patch
+++ /dev/null
@@ -1,233 +0,0 @@
-From ac96e17d1de51016ee1a983e68c7e840ff55ab8d Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Date: Thu, 5 Jan 2023 17:36:42 +0900
-Subject: [PATCH 22/28] SLAB: Fix for "kmem -s|-S" options on Linux 6.2-rc1 and
- later
-
-Kernel commit 130d4df57390 ("mm/sl[au]b: rearrange struct slab fields to
-allow larger rcu_head"), which is contained in Linux 6.2-rc1 and later
-kernels, changed the offset of slab.slab_list and now it's not equal to
-the offset of page.lru.
-
-Without the patch, "kmem -s|-S" options print errors and zeros for slab
-counters like this for kernels configured with CONFIG_SLAB=y.
-
- crash> kmem -s
- CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME
- kmem: rpc_inode_cache: partial list: page/slab: fffff31ac4125190 bad active counter: 99476865
- kmem: rpc_inode_cache: partial list: page/slab: fffff31ac4125190 bad s_mem pointer: 100000003
- kmem: rpc_inode_cache: full list: page/slab: fffff31ac4125150 bad active counter: 99476225
- kmem: rpc_inode_cache: full list: page/slab: fffff31ac4125150 bad active counter: 99476225
- kmem: rpc_inode_cache: full list: page/slab: fffff31ac4125150 bad s_mem pointer: 100000005
- ffff930202adfb40 704 0 0 0 4k rpc_inode_cache
- ...
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab(a)nec.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- memory.c | 45 +++++++++++++++++++++++++--------------------
- 1 file changed, 25 insertions(+), 20 deletions(-)
-
-diff --git a/memory.c b/memory.c
-index 71ded688206f..156de2f7b5a3 100644
---- a/memory.c
-+++ b/memory.c
-@@ -78,6 +78,7 @@ struct meminfo { /* general purpose memory information structure */
- int *freelist;
- int freelist_index_size;
- ulong random;
-+ ulong list_offset;
- };
-
- /*
-@@ -553,6 +554,8 @@ vm_init(void)
- MEMBER_OFFSET_INIT(page_freelist, "slab", "freelist");
- if (INVALID_MEMBER(page_active))
- MEMBER_OFFSET_INIT(page_active, "slab", "active");
-+
-+ MEMBER_OFFSET_INIT(slab_slab_list, "slab", "slab_list");
- }
-
- if (!VALID_STRUCT(kmem_slab_s) && VALID_STRUCT(slab_s)) {
-@@ -10767,6 +10770,8 @@ dump_kmem_cache_percpu_v2(struct meminfo *si)
- if (vt->flags & SLAB_OVERLOAD_PAGE) {
- si->freelist = si->kmem_bufctl;
- si->freelist_index_size = slab_freelist_index_size();
-+ si->list_offset = VALID_MEMBER(slab_slab_list) ?
-+ OFFSET(slab_slab_list) : OFFSET(page_lru);
- }
- for (i = 0; i < vt->kmem_max_cpus; i++)
- si->cpudata[i] = (ulong *)
-@@ -11983,7 +11988,7 @@ do_slab_chain_slab_overload_page(long cmd, struct meminfo *si)
- }
- last = si->slab;
-
-- readmem(si->slab - OFFSET(page_lru), KVADDR, page_buf,
-+ readmem(si->slab - si->list_offset, KVADDR, page_buf,
- SIZE(page), "page (slab) buffer",
- FAULT_ON_ERROR);
-
-@@ -11996,8 +12001,7 @@ do_slab_chain_slab_overload_page(long cmd, struct meminfo *si)
-
- si->num_slabs++;
-
-- si->slab = ULONG(page_buf +
-- OFFSET(page_lru));
-+ si->slab = ULONG(page_buf + si->list_offset);
-
- /*
- * Check for slab transition. (Tony Dziedzic)
-@@ -12024,11 +12028,11 @@ do_slab_chain_slab_overload_page(long cmd, struct meminfo *si)
- case SLAB_WALKTHROUGH:
- if (si->flags & SLAB_OVERLOAD_PAGE_PTR) {
- specified_slab = si->spec_addr;
-- si->slab = si->spec_addr + OFFSET(page_lru);
-+ si->slab = si->spec_addr + si->list_offset;
- } else {
- specified_slab = si->slab;
- if (si->slab)
-- si->slab += OFFSET(page_lru);
-+ si->slab += si->list_offset;
- }
- si->flags |= (SLAB_WALKTHROUGH|SLAB_FIRST_NODE);
- si->flags &= ~SLAB_GET_COUNTS;
-@@ -12082,7 +12086,7 @@ do_slab_chain_slab_overload_page(long cmd, struct meminfo *si)
- if (si->slab == slab_chains[s])
- continue;
-
-- readmem(si->slab - OFFSET(page_lru), KVADDR, page_buf,
-+ readmem(si->slab - si->list_offset, KVADDR, page_buf,
- SIZE(page), "page (slab) buffer",
- FAULT_ON_ERROR);
-
-@@ -12242,7 +12246,7 @@ verify_slab_overload_page(struct meminfo *si, ulong last, int s)
-
- errcnt = 0;
-
-- if (!readmem(si->slab - OFFSET(page_lru), KVADDR, page_buf,
-+ if (!readmem(si->slab - si->list_offset, KVADDR, page_buf,
- SIZE(page), "page (slab) buffer", QUIET|RETURN_ON_ERROR)) {
- error(INFO, "%s: %s list: bad slab pointer: %lx\n",
- si->curname, list, si->slab);
-@@ -12250,7 +12254,7 @@ verify_slab_overload_page(struct meminfo *si, ulong last, int s)
- return FALSE;
- }
-
-- list_head = (struct kernel_list_head *)(page_buf + OFFSET(page_lru));
-+ list_head = (struct kernel_list_head *)(page_buf + si->list_offset);
- if (!IS_KVADDR((ulong)list_head->next) ||
- !accessible((ulong)list_head->next)) {
- error(INFO, "%s: %s list: page/slab: %lx bad next pointer: %lx\n",
-@@ -12569,7 +12573,7 @@ dump_slab_overload_page(struct meminfo *si)
- int tmp;
- ulong slab_overload_page, freelist;
-
-- slab_overload_page = si->slab - OFFSET(page_lru);
-+ slab_overload_page = si->slab - si->list_offset;
-
- readmem(slab_overload_page + OFFSET(page_s_mem),
- KVADDR, &si->s_mem, sizeof(ulong),
-@@ -12796,12 +12800,12 @@ gather_slab_free_list_slab_overload_page(struct meminfo *si)
-
- if (CRASHDEBUG(1))
- fprintf(fp, "slab page: %lx active: %ld si->c_num: %ld\n",
-- si->slab - OFFSET(page_lru), si->s_inuse, si->c_num);
-+ si->slab - si->list_offset, si->s_inuse, si->c_num);
-
- if (si->s_inuse == si->c_num )
- return;
-
-- slab_overload_page = si->slab - OFFSET(page_lru);
-+ slab_overload_page = si->slab - si->list_offset;
- readmem(slab_overload_page + OFFSET(page_freelist),
- KVADDR, &freelist, sizeof(void *), "page freelist",
- FAULT_ON_ERROR);
-@@ -13099,7 +13103,7 @@ dump_slab_objects_percpu(struct meminfo *si)
-
- if ((si->flags & ADDRESS_SPECIFIED) &&
- (vt->flags & SLAB_OVERLOAD_PAGE)) {
-- readmem(si->slab - OFFSET(page_lru) + OFFSET(page_freelist),
-+ readmem(si->slab - si->list_offset + OFFSET(page_freelist),
- KVADDR, &freelist, sizeof(ulong), "page.freelist",
- FAULT_ON_ERROR);
-
-@@ -18713,6 +18717,9 @@ dump_kmem_cache_slub(struct meminfo *si)
-
- si->cache_buf = GETBUF(SIZE(kmem_cache));
-
-+ si->list_offset = VALID_MEMBER(slab_slab_list) ?
-+ OFFSET(slab_slab_list) : OFFSET(page_lru);
-+
- if (VALID_MEMBER(page_objects) &&
- OFFSET(page_objects) == OFFSET(page_inuse))
- si->flags |= SLAB_BITFIELD;
-@@ -19484,7 +19491,6 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
- {
- ulong next, last, list_head, flags;
- int first;
-- long list_off = VALID_MEMBER(slab_slab_list) ? OFFSET(slab_slab_list) : OFFSET(page_lru);
-
- if (!node_ptr)
- return;
-@@ -19498,7 +19504,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
- next == list_head ? " (empty)\n" : "");
- first = 0;
- while (next != list_head) {
-- si->slab = last = next - list_off;
-+ si->slab = last = next - si->list_offset;
- if (first++ == 0)
- fprintf(fp, " %s", slab_hdr);
-
-@@ -19521,7 +19527,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
-
- if (!IS_KVADDR(next) ||
- ((next != list_head) &&
-- !is_page_ptr(next - list_off, NULL))) {
-+ !is_page_ptr(next - si->list_offset, NULL))) {
- error(INFO,
- "%s: partial list slab: %lx invalid page.lru.next: %lx\n",
- si->curname, last, next);
-@@ -19548,7 +19554,7 @@ do_node_lists_slub(struct meminfo *si, ulong node_ptr, int node)
- next == list_head ? " (empty)\n" : "");
- first = 0;
- while (next != list_head) {
-- si->slab = next - list_off;
-+ si->slab = next - si->list_offset;
- if (first++ == 0)
- fprintf(fp, " %s", slab_hdr);
-
-@@ -19765,7 +19771,6 @@ count_partial(ulong node, struct meminfo *si, ulong *free)
- short inuse, objects;
- ulong total_inuse;
- ulong count = 0;
-- long list_off = VALID_MEMBER(slab_slab_list) ? OFFSET(slab_slab_list) : OFFSET(page_lru);
-
- count = 0;
- total_inuse = 0;
-@@ -19777,12 +19782,12 @@ count_partial(ulong node, struct meminfo *si, ulong *free)
- hq_open();
-
- while (next != list_head) {
-- if (!readmem(next - list_off + OFFSET(page_inuse),
-+ if (!readmem(next - si->list_offset + OFFSET(page_inuse),
- KVADDR, &inuse, sizeof(ushort), "page.inuse", RETURN_ON_ERROR)) {
- hq_close();
- return -1;
- }
-- last = next - list_off;
-+ last = next - si->list_offset;
-
- if (inuse == -1) {
- error(INFO,
-@@ -19808,7 +19813,7 @@ count_partial(ulong node, struct meminfo *si, ulong *free)
- }
- if (!IS_KVADDR(next) ||
- ((next != list_head) &&
-- !is_page_ptr(next - list_off, NULL))) {
-+ !is_page_ptr(next - si->list_offset, NULL))) {
- error(INFO, "%s: partial list slab: %lx invalid page.lru.next: %lx\n",
- si->curname, last, next);
- break;
---
-2.37.1
-
diff --git a/0023-Port-the-maple-tree-data-structures-and-functions.patch b/0023-Port-the-maple-tree-data-structures-and-functions.patch
deleted file mode 100644
index 96994be..0000000
--- a/0023-Port-the-maple-tree-data-structures-and-functions.patch
+++ /dev/null
@@ -1,633 +0,0 @@
-From 872cad2d63b3a07f65323fe80a7abb29ea276b44 Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao(a)redhat.com>
-Date: Tue, 10 Jan 2023 14:56:27 +0800
-Subject: [PATCH 23/28] Port the maple tree data structures and functions
-
-There have been two ways to iterate vm_area_struct until Linux 6.0:
- 1) by rbtree, aka vma.vm_rb;
- 2) by linked list, aka vma.vm_{next,prev}.
-However with the maple tree patches[1][2] in Linux 6.1, vm_rb and
-vm_{next,prev} are removed from vm_area_struct. The vm_area_dump()
-in crash mainly uses the linked list for vma iteration, which will
-not work for this case. So the maple tree iteration needs to be
-ported to crash.
-
-For crash, currently it only iteratively reads the maple tree,
-no more rcu safe or maple tree modification features needed.
-So we only port a subset of kernel maple tree features.
-In addition, we need to modify the ported kernel source code,
-making it compatible with crash.
-
-This patch deals with the two issues:
- 1) Poring mt_dump() function and all its dependencies from
- kernel source to crash, to enable crash maple tree iteration,
- 2) adapting the ported code with crash.
-
-[1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit...
-[2]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit...
-
-Signed-off-by: Tao Liu <ltao(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- Makefile | 10 +-
- defs.h | 19 +++
- maple_tree.c | 407 +++++++++++++++++++++++++++++++++++++++++++++++++++
- maple_tree.h | 82 +++++++++++
- 4 files changed, 515 insertions(+), 3 deletions(-)
- create mode 100644 maple_tree.c
- create mode 100644 maple_tree.h
-
-diff --git a/Makefile b/Makefile
-index 1506dd426bc7..102597f735b2 100644
---- a/Makefile
-+++ b/Makefile
-@@ -59,6 +59,7 @@ IBM_HFILES=ibm_common.h
- SADUMP_HFILES=sadump.h
- UNWIND_HFILES=unwind.h unwind_i.h rse.h unwind_x86.h unwind_x86_64.h
- VMWARE_HFILES=vmware_vmss.h
-+MAPLE_TREE_HFILES=maple_tree.h
-
- CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \
- kernel.c test.c gdb_interface.c configure.c net.c dev.c bpf.c \
-@@ -73,12 +74,12 @@ CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \
- xen_hyper.c xen_hyper_command.c xen_hyper_global_data.c \
- xen_hyper_dump_tables.c kvmdump.c qemu.c qemu-load.c sadump.c ipcs.c \
- ramdump.c vmware_vmss.c vmware_guestdump.c \
-- xen_dom0.c kaslr_helper.c sbitmap.c
-+ xen_dom0.c kaslr_helper.c sbitmap.c maple_tree.c
-
- SOURCE_FILES=${CFILES} ${GENERIC_HFILES} ${MCORE_HFILES} \
- ${REDHAT_CFILES} ${REDHAT_HFILES} ${UNWIND_HFILES} \
- ${LKCD_DUMP_HFILES} ${LKCD_TRACE_HFILES} ${LKCD_OBSOLETE_HFILES}\
-- ${IBM_HFILES} ${SADUMP_HFILES} ${VMWARE_HFILES}
-+ ${IBM_HFILES} ${SADUMP_HFILES} ${VMWARE_HFILES} ${MAPLE_TREE_HFILES}
-
- OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \
- build_data.o kernel.o test.o gdb_interface.o net.o dev.o bpf.o \
-@@ -93,7 +94,7 @@ OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \
- xen_hyper.o xen_hyper_command.o xen_hyper_global_data.o \
- xen_hyper_dump_tables.o kvmdump.o qemu.o qemu-load.o sadump.o ipcs.o \
- ramdump.o vmware_vmss.o vmware_guestdump.o \
-- xen_dom0.o kaslr_helper.o sbitmap.o
-+ xen_dom0.o kaslr_helper.o sbitmap.o maple_tree.o
-
- MEMORY_DRIVER_FILES=memory_driver/Makefile memory_driver/crash.c memory_driver/README
-
-@@ -539,6 +540,9 @@ kaslr_helper.o: ${GENERIC_HFILES} kaslr_helper.c
- bpf.o: ${GENERIC_HFILES} bpf.c
- ${CC} -c ${CRASH_CFLAGS} bpf.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-
-+maple_tree.o: ${GENERIC_HFILES} ${MAPLE_TREE_HFILES} maple_tree.c
-+ ${CC} -c ${CRASH_CFLAGS} maple_tree.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-+
- ${PROGRAM}: force
- @$(MAKE) all
-
-diff --git a/defs.h b/defs.h
-index 08ac4dc96a92..46bfd4a67e64 100644
---- a/defs.h
-+++ b/defs.h
-@@ -2189,6 +2189,21 @@ struct offset_table { /* stash of commonly-used offsets */
- long request_queue_hctx_table;
- long percpu_counter_counters;
- long slab_slab_list;
-+ long mm_struct_mm_mt;
-+ long maple_tree_ma_root;
-+ long maple_tree_ma_flags;
-+ long maple_node_parent;
-+ long maple_node_ma64;
-+ long maple_node_mr64;
-+ long maple_node_slot;
-+ long maple_arange_64_pivot;
-+ long maple_arange_64_slot;
-+ long maple_arange_64_gap;
-+ long maple_arange_64_meta;
-+ long maple_range_64_pivot;
-+ long maple_range_64_slot;
-+ long maple_metadata_end;
-+ long maple_metadata_gap;
- };
-
- struct size_table { /* stash of commonly-used sizes */
-@@ -2360,6 +2375,8 @@ struct size_table { /* stash of commonly-used sizes */
- long sbq_wait_state;
- long blk_mq_tags;
- long percpu_counter;
-+ long maple_tree;
-+ long maple_node;
- };
-
- struct array_table {
-@@ -5742,6 +5759,8 @@ int file_dump(ulong, ulong, ulong, int, int);
- int same_file(char *, char *);
- int cleanup_memory_driver(void);
-
-+void maple_init(void);
-+int do_mptree(struct tree_data *);
-
- /*
- * help.c
-diff --git a/maple_tree.c b/maple_tree.c
-new file mode 100644
-index 000000000000..474faeda6252
---- /dev/null
-+++ b/maple_tree.c
-@@ -0,0 +1,407 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+/*
-+ * Maple Tree implementation
-+ * Copyright (c) 2018-2022 Oracle Corporation
-+ * Authors: Liam R. Howlett <Liam.Howlett(a)oracle.com>
-+ * Matthew Wilcox <willy(a)infradead.org>
-+ *
-+ * The following are copied and modified from lib/maple_tree.c
-+ */
-+
-+#include "maple_tree.h"
-+#include "defs.h"
-+
-+unsigned char *mt_slots = NULL;
-+unsigned char *mt_pivots = NULL;
-+ulong mt_max[4] = {0};
-+
-+#define MAPLE_BUFSIZE 512
-+
-+static inline ulong mte_to_node(ulong maple_enode_entry)
-+{
-+ return maple_enode_entry & ~MAPLE_NODE_MASK;
-+}
-+
-+static inline enum maple_type mte_node_type(ulong maple_enode_entry)
-+{
-+ return (maple_enode_entry >> MAPLE_NODE_TYPE_SHIFT) &
-+ MAPLE_NODE_TYPE_MASK;
-+}
-+
-+static inline ulong mt_slot(void **slots, unsigned char offset)
-+{
-+ return (ulong)slots[offset];
-+}
-+
-+static inline bool ma_is_leaf(const enum maple_type type)
-+{
-+ return type < maple_range_64;
-+}
-+
-+/*************** For cmd_tree ********************/
-+
-+struct maple_tree_ops {
-+ void (*entry)(ulong node, ulong slot, const char *path,
-+ ulong index, void *private);
-+ void *private;
-+ bool is_td;
-+};
-+
-+static const char spaces[] = " ";
-+
-+static void do_mt_range64(ulong, ulong, ulong, uint, char *, ulong *,
-+ struct maple_tree_ops *);
-+static void do_mt_arange64(ulong, ulong, ulong, uint, char *, ulong *,
-+ struct maple_tree_ops *);
-+static void do_mt_entry(ulong, ulong, ulong, uint, uint, char *, ulong *,
-+ struct maple_tree_ops *);
-+static void do_mt_node(ulong, ulong, ulong, uint, char *, ulong *,
-+ struct maple_tree_ops *);
-+struct req_entry *fill_member_offsets(char *);
-+void dump_struct_members_fast(struct req_entry *, int, ulong);
-+void dump_struct_members_for_tree(struct tree_data *, int, ulong);
-+
-+static void mt_dump_range(ulong min, ulong max, uint depth)
-+{
-+ if (min == max)
-+ fprintf(fp, "%.*s%lu: ", depth * 2, spaces, min);
-+ else
-+ fprintf(fp, "%.*s%lu-%lu: ", depth * 2, spaces, min, max);
-+}
-+
-+static inline bool mt_is_reserved(ulong entry)
-+{
-+ return (entry < MAPLE_RESERVED_RANGE) && xa_is_internal(entry);
-+}
-+
-+static inline bool mte_is_leaf(ulong maple_enode_entry)
-+{
-+ return ma_is_leaf(mte_node_type(maple_enode_entry));
-+}
-+
-+static uint mt_height(char *mt_buf)
-+{
-+ return (UINT(mt_buf + OFFSET(maple_tree_ma_flags)) &
-+ MT_FLAGS_HEIGHT_MASK)
-+ >> MT_FLAGS_HEIGHT_OFFSET;
-+}
-+
-+static void dump_mt_range64(char *mr64_buf)
-+{
-+ int i;
-+
-+ fprintf(fp, " contents: ");
-+ for (i = 0; i < mt_slots[maple_range_64] - 1; i++)
-+ fprintf(fp, "%p %lu ",
-+ VOID_PTR(mr64_buf + OFFSET(maple_range_64_slot)
-+ + sizeof(void *) * i),
-+ ULONG(mr64_buf + OFFSET(maple_range_64_pivot)
-+ + sizeof(ulong) * i));
-+ fprintf(fp, "%p\n", VOID_PTR(mr64_buf + OFFSET(maple_range_64_slot)
-+ + sizeof(void *) * i));
-+}
-+
-+static void dump_mt_arange64(char *ma64_buf)
-+{
-+ int i;
-+
-+ fprintf(fp, " contents: ");
-+ for (i = 0; i < mt_slots[maple_arange_64]; i++)
-+ fprintf(fp, "%lu ", ULONG(ma64_buf + OFFSET(maple_arange_64_gap)
-+ + sizeof(ulong) * i));
-+
-+ fprintf(fp, "| %02X %02X| ",
-+ UCHAR(ma64_buf + OFFSET(maple_arange_64_meta) +
-+ OFFSET(maple_metadata_end)),
-+ UCHAR(ma64_buf + OFFSET(maple_arange_64_meta) +
-+ OFFSET(maple_metadata_gap)));
-+
-+ for (i = 0; i < mt_slots[maple_arange_64] - 1; i++)
-+ fprintf(fp, "%p %lu ",
-+ VOID_PTR(ma64_buf + OFFSET(maple_arange_64_slot) +
-+ sizeof(void *) * i),
-+ ULONG(ma64_buf + OFFSET(maple_arange_64_pivot) +
-+ sizeof(ulong) * i));
-+ fprintf(fp, "%p\n", VOID_PTR(ma64_buf + OFFSET(maple_arange_64_slot) +
-+ sizeof(void *) * i));
-+}
-+
-+static void dump_mt_entry(ulong entry, ulong min, ulong max, uint depth)
-+{
-+ mt_dump_range(min, max, depth);
-+
-+ if (xa_is_value(entry))
-+ fprintf(fp, "value %ld (0x%lx) [0x%lx]\n", xa_to_value(entry),
-+ xa_to_value(entry), entry);
-+ else if (xa_is_zero(entry))
-+ fprintf(fp, "zero (%ld)\n", xa_to_internal(entry));
-+ else if (mt_is_reserved(entry))
-+ fprintf(fp, "UNKNOWN ENTRY (0x%lx)\n", entry);
-+ else
-+ fprintf(fp, "0x%lx\n", entry);
-+}
-+
-+static void dump_mt_node(ulong maple_node, char *node_data, uint type,
-+ ulong min, ulong max, uint depth)
-+{
-+ mt_dump_range(min, max, depth);
-+
-+ fprintf(fp, "node 0x%lx depth %d type %d parent %p",
-+ maple_node, depth, type,
-+ maple_node ? VOID_PTR(node_data + OFFSET(maple_node_parent)) :
-+ NULL);
-+}
-+
-+static void do_mt_range64(ulong entry, ulong min, ulong max,
-+ uint depth, char *path, ulong *global_index,
-+ struct maple_tree_ops *ops)
-+{
-+ ulong maple_node_m_node = mte_to_node(entry);
-+ char node_buf[MAPLE_BUFSIZE];
-+ bool leaf = mte_is_leaf(entry);
-+ ulong first = min, last;
-+ int i;
-+ int len = strlen(path);
-+ struct tree_data *td = ops->is_td ? (struct tree_data *)ops->private : NULL;
-+ char *mr64_buf;
-+
-+ if (SIZE(maple_node) > MAPLE_BUFSIZE)
-+ error(FATAL, "MAPLE_BUFSIZE should be larger than maple_node struct");
-+
-+ readmem(maple_node_m_node, KVADDR, node_buf, SIZE(maple_node),
-+ "mt_dump_range64 read maple_node", FAULT_ON_ERROR);
-+
-+ mr64_buf = node_buf + OFFSET(maple_node_mr64);
-+
-+ for (i = 0; i < mt_slots[maple_range_64]; i++) {
-+ last = max;
-+
-+ if (i < (mt_slots[maple_range_64] - 1))
-+ last = ULONG(mr64_buf + OFFSET(maple_range_64_pivot) +
-+ sizeof(ulong) * i);
-+
-+ else if (!VOID_PTR(mr64_buf + OFFSET(maple_range_64_slot) +
-+ sizeof(void *) * i) &&
-+ max != mt_max[mte_node_type(entry)])
-+ break;
-+ if (last == 0 && i > 0)
-+ break;
-+ if (leaf)
-+ do_mt_entry(mt_slot((void **)(mr64_buf +
-+ OFFSET(maple_range_64_slot)), i),
-+ first, last, depth + 1, i, path, global_index, ops);
-+ else if (VOID_PTR(mr64_buf + OFFSET(maple_range_64_slot) +
-+ sizeof(void *) * i)) {
-+ sprintf(path + len, "/%d", i);
-+ do_mt_node(mt_slot((void **)(mr64_buf +
-+ OFFSET(maple_range_64_slot)), i),
-+ first, last, depth + 1, path, global_index, ops);
-+ }
-+
-+ if (last == max)
-+ break;
-+ if (last > max) {
-+ fprintf(fp, "node %p last (%lu) > max (%lu) at pivot %d!\n",
-+ mr64_buf, last, max, i);
-+ break;
-+ }
-+ first = last + 1;
-+ }
-+}
-+
-+static void do_mt_arange64(ulong entry, ulong min, ulong max,
-+ uint depth, char *path, ulong *global_index,
-+ struct maple_tree_ops *ops)
-+{
-+ ulong maple_node_m_node = mte_to_node(entry);
-+ char node_buf[MAPLE_BUFSIZE];
-+ bool leaf = mte_is_leaf(entry);
-+ ulong first = min, last;
-+ int i;
-+ int len = strlen(path);
-+ struct tree_data *td = ops->is_td ? (struct tree_data *)ops->private : NULL;
-+ char *ma64_buf;
-+
-+ if (SIZE(maple_node) > MAPLE_BUFSIZE)
-+ error(FATAL, "MAPLE_BUFSIZE should be larger than maple_node struct");
-+
-+ readmem(maple_node_m_node, KVADDR, node_buf, SIZE(maple_node),
-+ "mt_dump_arange64 read maple_node", FAULT_ON_ERROR);
-+
-+ ma64_buf = node_buf + OFFSET(maple_node_ma64);
-+
-+ for (i = 0; i < mt_slots[maple_arange_64]; i++) {
-+ last = max;
-+
-+ if (i < (mt_slots[maple_arange_64] - 1))
-+ last = ULONG(ma64_buf + OFFSET(maple_arange_64_pivot) +
-+ sizeof(ulong) * i);
-+ else if (!VOID_PTR(ma64_buf + OFFSET(maple_arange_64_slot) +
-+ sizeof(void *) * i))
-+ break;
-+ if (last == 0 && i > 0)
-+ break;
-+
-+ if (leaf)
-+ do_mt_entry(mt_slot((void **)(ma64_buf +
-+ OFFSET(maple_arange_64_slot)), i),
-+ first, last, depth + 1, i, path, global_index, ops);
-+ else if (VOID_PTR(ma64_buf + OFFSET(maple_arange_64_slot) +
-+ sizeof(void *) * i)) {
-+ sprintf(path + len, "/%d", i);
-+ do_mt_node(mt_slot((void **)(ma64_buf +
-+ OFFSET(maple_arange_64_slot)), i),
-+ first, last, depth + 1, path, global_index, ops);
-+ }
-+
-+ if (last == max)
-+ break;
-+ if (last > max) {
-+ fprintf(fp, "node %p last (%lu) > max (%lu) at pivot %d!\n",
-+ ma64_buf, last, max, i);
-+ break;
-+ }
-+ first = last + 1;
-+ }
-+}
-+
-+static void do_mt_entry(ulong entry, ulong min, ulong max, uint depth,
-+ uint index, char *path, ulong *global_index,
-+ struct maple_tree_ops *ops)
-+{
-+ int print_radix = 0, i;
-+ static struct req_entry **e = NULL;
-+ struct tree_data *td = ops->is_td ? (struct tree_data *)ops->private : NULL;
-+
-+ if (!td)
-+ return;
-+}
-+
-+static void do_mt_node(ulong entry, ulong min, ulong max,
-+ uint depth, char *path, ulong *global_index,
-+ struct maple_tree_ops *ops)
-+{
-+ ulong maple_node = mte_to_node(entry);
-+ uint type = mte_node_type(entry);
-+ uint i;
-+ char node_buf[MAPLE_BUFSIZE];
-+ struct tree_data *td = ops->is_td ? (struct tree_data *)ops->private : NULL;
-+
-+ if (SIZE(maple_node) > MAPLE_BUFSIZE)
-+ error(FATAL, "MAPLE_BUFSIZE should be larger than maple_node struct");
-+
-+ readmem(maple_node, KVADDR, node_buf, SIZE(maple_node),
-+ "mt_dump_node read maple_node", FAULT_ON_ERROR);
-+
-+ switch (type) {
-+ case maple_dense:
-+ for (i = 0; i < mt_slots[maple_dense]; i++) {
-+ if (min + i > max)
-+ fprintf(fp, "OUT OF RANGE: ");
-+ do_mt_entry(mt_slot((void **)(node_buf + OFFSET(maple_node_slot)), i),
-+ min + i, min + i, depth, i, path, global_index, ops);
-+ }
-+ break;
-+ case maple_leaf_64:
-+ case maple_range_64:
-+ do_mt_range64(entry, min, max, depth, path, global_index, ops);
-+ break;
-+ case maple_arange_64:
-+ do_mt_arange64(entry, min, max, depth, path, global_index, ops);
-+ break;
-+ default:
-+ fprintf(fp, " UNKNOWN TYPE\n");
-+ }
-+}
-+
-+static int do_maple_tree_traverse(ulong ptr, int is_root,
-+ struct maple_tree_ops *ops)
-+{
-+ char path[BUFSIZE] = {0};
-+ char tree_buf[MAPLE_BUFSIZE];
-+ ulong entry;
-+ struct tree_data *td = ops->is_td ? (struct tree_data *)ops->private : NULL;
-+ ulong global_index = 0;
-+
-+ if (SIZE(maple_tree) > MAPLE_BUFSIZE)
-+ error(FATAL, "MAPLE_BUFSIZE should be larger than maple_tree struct");
-+
-+ if (!is_root) {
-+ strcpy(path, "direct");
-+ do_mt_node(ptr, 0, mt_max[mte_node_type(ptr)],
-+ 0, path, &global_index, ops);
-+ } else {
-+ readmem(ptr, KVADDR, tree_buf, SIZE(maple_tree),
-+ "mt_dump read maple_tree", FAULT_ON_ERROR);
-+ entry = ULONG(tree_buf + OFFSET(maple_tree_ma_root));
-+
-+ if (!xa_is_node(entry))
-+ do_mt_entry(entry, 0, 0, 0, 0, path, &global_index, ops);
-+ else if (entry) {
-+ strcpy(path, "root");
-+ do_mt_node(entry, 0, mt_max[mte_node_type(entry)], 0,
-+ path, &global_index, ops);
-+ }
-+ }
-+ return 0;
-+}
-+
-+int do_mptree(struct tree_data *td)
-+{
-+ struct maple_tree_ops ops = {
-+ .entry = NULL,
-+ .private = td,
-+ .is_td = true,
-+ };
-+
-+ int is_root = !(td->flags & TREE_NODE_POINTER);
-+
-+ do_maple_tree_traverse(td->start, is_root, &ops);
-+
-+ return 0;
-+}
-+
-+/***********************************************/
-+void maple_init(void)
-+{
-+ int array_len;
-+
-+ STRUCT_SIZE_INIT(maple_tree, "maple_tree");
-+ STRUCT_SIZE_INIT(maple_node, "maple_node");
-+
-+ MEMBER_OFFSET_INIT(maple_tree_ma_root, "maple_tree", "ma_root");
-+ MEMBER_OFFSET_INIT(maple_tree_ma_flags, "maple_tree", "ma_flags");
-+
-+ MEMBER_OFFSET_INIT(maple_node_parent, "maple_node", "parent");
-+ MEMBER_OFFSET_INIT(maple_node_ma64, "maple_node", "ma64");
-+ MEMBER_OFFSET_INIT(maple_node_mr64, "maple_node", "mr64");
-+ MEMBER_OFFSET_INIT(maple_node_slot, "maple_node", "slot");
-+
-+ MEMBER_OFFSET_INIT(maple_arange_64_pivot, "maple_arange_64", "pivot");
-+ MEMBER_OFFSET_INIT(maple_arange_64_slot, "maple_arange_64", "slot");
-+ MEMBER_OFFSET_INIT(maple_arange_64_gap, "maple_arange_64", "gap");
-+ MEMBER_OFFSET_INIT(maple_arange_64_meta, "maple_arange_64", "meta");
-+
-+ MEMBER_OFFSET_INIT(maple_range_64_pivot, "maple_range_64", "pivot");
-+ MEMBER_OFFSET_INIT(maple_range_64_slot, "maple_range_64", "slot");
-+
-+ MEMBER_OFFSET_INIT(maple_metadata_end, "maple_metadata", "end");
-+ MEMBER_OFFSET_INIT(maple_metadata_gap, "maple_metadata", "gap");
-+
-+ array_len = get_array_length("mt_slots", NULL, sizeof(char));
-+ mt_slots = calloc(array_len, sizeof(char));
-+ readmem(symbol_value("mt_slots"), KVADDR, mt_slots,
-+ array_len * sizeof(char), "maple_init read mt_slots",
-+ RETURN_ON_ERROR);
-+
-+ array_len = get_array_length("mt_pivots", NULL, sizeof(char));
-+ mt_pivots = calloc(array_len, sizeof(char));
-+ readmem(symbol_value("mt_pivots"), KVADDR, mt_pivots,
-+ array_len * sizeof(char), "maple_init read mt_pivots",
-+ RETURN_ON_ERROR);
-+
-+ mt_max[maple_dense] = mt_slots[maple_dense];
-+ mt_max[maple_leaf_64] = ULONG_MAX;
-+ mt_max[maple_range_64] = ULONG_MAX;
-+ mt_max[maple_arange_64] = ULONG_MAX;
-+}
-diff --git a/maple_tree.h b/maple_tree.h
-new file mode 100644
-index 000000000000..f53d5aaffd2e
---- /dev/null
-+++ b/maple_tree.h
-@@ -0,0 +1,82 @@
-+/* SPDX-License-Identifier: GPL-2.0+ */
-+#ifndef _MAPLE_TREE_H
-+#define _MAPLE_TREE_H
-+/*
-+ * Maple Tree - An RCU-safe adaptive tree for storing ranges
-+ * Copyright (c) 2018-2022 Oracle
-+ * Authors: Liam R. Howlett <Liam.Howlett(a)Oracle.com>
-+ * Matthew Wilcox <willy(a)infradead.org>
-+ *
-+ * eXtensible Arrays
-+ * Copyright (c) 2017 Microsoft Corporation
-+ * Author: Matthew Wilcox <willy(a)infradead.org>
-+ *
-+ * See Documentation/core-api/xarray.rst for how to use the XArray.
-+ */
-+#include <stdbool.h>
-+#include <limits.h>
-+#include <sys/types.h>
-+
-+/*
-+ * The following are copied and modified from include/linux/maple_tree.h
-+ */
-+
-+enum maple_type {
-+ maple_dense,
-+ maple_leaf_64,
-+ maple_range_64,
-+ maple_arange_64,
-+};
-+
-+#define MAPLE_NODE_MASK 255UL
-+
-+#define MT_FLAGS_HEIGHT_OFFSET 0x02
-+#define MT_FLAGS_HEIGHT_MASK 0x7C
-+
-+#define MAPLE_NODE_TYPE_MASK 0x0F
-+#define MAPLE_NODE_TYPE_SHIFT 0x03
-+
-+#define MAPLE_RESERVED_RANGE 4096
-+
-+/*
-+ * The following are copied and modified from include/linux/xarray.h
-+ */
-+
-+#define XA_ZERO_ENTRY xa_mk_internal(257)
-+
-+static inline ulong xa_mk_internal(ulong v)
-+{
-+ return (v << 2) | 2;
-+}
-+
-+static inline bool xa_is_internal(ulong entry)
-+{
-+ return (entry & 3) == 2;
-+}
-+
-+static inline bool xa_is_node(ulong entry)
-+{
-+ return xa_is_internal(entry) && entry > 4096;
-+}
-+
-+static inline bool xa_is_value(ulong entry)
-+{
-+ return entry & 1;
-+}
-+
-+static inline bool xa_is_zero(ulong entry)
-+{
-+ return entry == XA_ZERO_ENTRY;
-+}
-+
-+static inline unsigned long xa_to_internal(ulong entry)
-+{
-+ return entry >> 2;
-+}
-+
-+static inline unsigned long xa_to_value(ulong entry)
-+{
-+ return entry >> 1;
-+}
-+
-+#endif /* _MAPLE_TREE_H */
---
-2.37.1
-
diff --git a/0024-Add-maple-tree-support-to-tree-command.patch b/0024-Add-maple-tree-support-to-tree-command.patch
deleted file mode 100644
index c0c64ff..0000000
--- a/0024-Add-maple-tree-support-to-tree-command.patch
+++ /dev/null
@@ -1,335 +0,0 @@
-From 16a696762cbfe6a40312840fee2297f05fdefb21 Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao(a)redhat.com>
-Date: Tue, 10 Jan 2023 14:56:28 +0800
-Subject: [PATCH 24/28] Add maple tree support to "tree" command
-
-The maple tree is a new data structure for crash, so "tree" command
-needs to support it for users to dump and view the content of maple
-trees. This patch achieves this by using ported mt_dump() and its
-related functions from kernel and adapting them with "tree" command.
-
-Also introduce a new -v arg specifically for dumping the complete
-content of a maple tree:
-
- crash> tree -t maple 0xffff9034c006aec0 -v
-
- maple_tree(ffff9034c006aec0) flags 309, height 2 root 0xffff9034de70041e
-
- 0-18446744073709551615: node 0xffff9034de700400 depth 0 type 3 parent 0xffff9034c006aec1 contents:...
- 0-140112331583487: node 0xffff9034c01e8800 depth 1 type 1 parent 0xffff9034de700406 contents:...
- 0-94643156942847: (nil)
- 94643156942848-94643158024191: 0xffff9035131754c0
- 94643158024192-94643160117247: (nil)
- ...
-
-The existing options of "tree" command can work as well:
-
- crash> tree -t maple -r mm_struct.mm_mt 0xffff9034c006aec0 -p
- ffff9035131754c0
- index: 1 position: root/0/1
- ffff9035131751c8
- index: 2 position: root/0/3
- ffff9035131757b8
- index: 3 position: root/0/4
- ...
-
- crash> tree -t maple 0xffff9034c006aec0 -p -x -s vm_area_struct.vm_start,vm_end
- ffff9035131754c0
- index: 1 position: root/0/1
- vm_start = 0x5613d3c00000,
- vm_end = 0x5613d3d08000,
- ffff9035131751c8
- index: 2 position: root/0/3
- vm_start = 0x5613d3f07000,
- vm_end = 0x5613d3f0b000,
- ffff9035131757b8
- index: 3 position: root/0/4
- vm_start = 0x5613d3f0b000,
- vm_end = 0x5613d3f14000,
- ....
-
-Signed-off-by: Tao Liu <ltao(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 1 +
- maple_tree.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++
- tools.c | 67 +++++++++++++++++++++++++++++++++++++++-------------
- 3 files changed, 114 insertions(+), 17 deletions(-)
-
-diff --git a/defs.h b/defs.h
-index 46bfd4a67e64..f98e18937949 100644
---- a/defs.h
-+++ b/defs.h
-@@ -2713,6 +2713,7 @@ struct tree_data {
- #define TREE_PARSE_MEMBER (VERBOSE << 7)
- #define TREE_READ_MEMBER (VERBOSE << 8)
- #define TREE_LINEAR_ORDER (VERBOSE << 9)
-+#define TREE_STRUCT_VERBOSE (VERBOSE << 10)
-
- #define ALIAS_RUNTIME (1)
- #define ALIAS_RCLOCAL (2)
-diff --git a/maple_tree.c b/maple_tree.c
-index 474faeda6252..471136f3eb1d 100644
---- a/maple_tree.c
-+++ b/maple_tree.c
-@@ -173,6 +173,10 @@ static void do_mt_range64(ulong entry, ulong min, ulong max,
-
- mr64_buf = node_buf + OFFSET(maple_node_mr64);
-
-+ if (td && td->flags & TREE_STRUCT_VERBOSE) {
-+ dump_mt_range64(mr64_buf);
-+ }
-+
- for (i = 0; i < mt_slots[maple_range_64]; i++) {
- last = max;
-
-@@ -230,6 +234,10 @@ static void do_mt_arange64(ulong entry, ulong min, ulong max,
-
- ma64_buf = node_buf + OFFSET(maple_node_ma64);
-
-+ if (td && td->flags & TREE_STRUCT_VERBOSE) {
-+ dump_mt_arange64(ma64_buf);
-+ }
-+
- for (i = 0; i < mt_slots[maple_arange_64]; i++) {
- last = max;
-
-@@ -275,6 +283,51 @@ static void do_mt_entry(ulong entry, ulong min, ulong max, uint depth,
-
- if (!td)
- return;
-+
-+ if (!td->count && td->structname_args) {
-+ /*
-+ * Retrieve all members' info only once (count == 0)
-+ * After last iteration all memory will be freed up
-+ */
-+ e = (struct req_entry **)GETBUF(sizeof(*e) * td->structname_args);
-+ for (i = 0; i < td->structname_args; i++)
-+ e[i] = fill_member_offsets(td->structname[i]);
-+ }
-+
-+ td->count++;
-+
-+ if (td->flags & TREE_STRUCT_VERBOSE) {
-+ dump_mt_entry(entry, min, max, depth);
-+ } else if (td->flags & VERBOSE && entry)
-+ fprintf(fp, "%lx\n", entry);
-+ if (td->flags & TREE_POSITION_DISPLAY && entry)
-+ fprintf(fp, " index: %ld position: %s/%u\n",
-+ ++(*global_index), path, index);
-+
-+ if (td->structname) {
-+ if (td->flags & TREE_STRUCT_RADIX_10)
-+ print_radix = 10;
-+ else if (td->flags & TREE_STRUCT_RADIX_16)
-+ print_radix = 16;
-+ else
-+ print_radix = 0;
-+
-+ for (i = 0; i < td->structname_args; i++) {
-+ switch (count_chars(td->structname[i], '.')) {
-+ case 0:
-+ dump_struct(td->structname[i], entry, print_radix);
-+ break;
-+ default:
-+ if (td->flags & TREE_PARSE_MEMBER)
-+ dump_struct_members_for_tree(td, i, entry);
-+ else if (td->flags & TREE_READ_MEMBER)
-+ dump_struct_members_fast(e[i], print_radix, entry);
-+ }
-+ }
-+ }
-+
-+ if (e)
-+ FREEBUF(e);
- }
-
- static void do_mt_node(ulong entry, ulong min, ulong max,
-@@ -293,6 +346,10 @@ static void do_mt_node(ulong entry, ulong min, ulong max,
- readmem(maple_node, KVADDR, node_buf, SIZE(maple_node),
- "mt_dump_node read maple_node", FAULT_ON_ERROR);
-
-+ if (td && td->flags & TREE_STRUCT_VERBOSE) {
-+ dump_mt_node(maple_node, node_buf, type, min, max, depth);
-+ }
-+
- switch (type) {
- case maple_dense:
- for (i = 0; i < mt_slots[maple_dense]; i++) {
-@@ -335,6 +392,12 @@ static int do_maple_tree_traverse(ulong ptr, int is_root,
- "mt_dump read maple_tree", FAULT_ON_ERROR);
- entry = ULONG(tree_buf + OFFSET(maple_tree_ma_root));
-
-+ if (td && td->flags & TREE_STRUCT_VERBOSE) {
-+ fprintf(fp, "maple_tree(%lx) flags %X, height %u root 0x%lx\n\n",
-+ ptr, UINT(tree_buf + OFFSET(maple_tree_ma_flags)),
-+ mt_height(tree_buf), entry);
-+ }
-+
- if (!xa_is_node(entry))
- do_mt_entry(entry, 0, 0, 0, 0, path, &global_index, ops);
- else if (entry) {
-diff --git a/tools.c b/tools.c
-index 5f86771f5327..c2cfa7e280bc 100644
---- a/tools.c
-+++ b/tools.c
-@@ -30,7 +30,7 @@ static void dealloc_hq_entry(struct hq_entry *);
- static void show_options(void);
- static void dump_struct_members(struct list_data *, int, ulong);
- static void rbtree_iteration(ulong, struct tree_data *, char *);
--static void dump_struct_members_for_tree(struct tree_data *, int, ulong);
-+void dump_struct_members_for_tree(struct tree_data *, int, ulong);
-
- struct req_entry {
- char *arg, *name, **member;
-@@ -40,8 +40,8 @@ struct req_entry {
- };
-
- static void print_value(struct req_entry *, unsigned int, ulong, unsigned int);
--static struct req_entry *fill_member_offsets(char *);
--static void dump_struct_members_fast(struct req_entry *, int, ulong);
-+struct req_entry *fill_member_offsets(char *);
-+void dump_struct_members_fast(struct req_entry *, int, ulong);
-
- FILE *
- set_error(char *target)
-@@ -3666,7 +3666,7 @@ dump_struct_members_fast(struct req_entry *e, int radix, ulong p)
- }
- }
-
--static struct req_entry *
-+struct req_entry *
- fill_member_offsets(char *arg)
- {
- int j;
-@@ -4307,6 +4307,7 @@ dump_struct_members(struct list_data *ld, int idx, ulong next)
- #define RADIXTREE_REQUEST (0x1)
- #define RBTREE_REQUEST (0x2)
- #define XARRAY_REQUEST (0x4)
-+#define MAPLE_REQUEST (0x8)
-
- void
- cmd_tree()
-@@ -4317,6 +4318,7 @@ cmd_tree()
- struct datatype_member struct_member, *sm;
- struct syment *sp;
- ulong value;
-+ char *type_name = NULL;
-
- type_flag = 0;
- root_offset = 0;
-@@ -4324,25 +4326,33 @@ cmd_tree()
- td = &tree_data;
- BZERO(td, sizeof(struct tree_data));
-
-- while ((c = getopt(argcnt, args, "xdt:r:o:s:S:plN")) != EOF) {
-+ while ((c = getopt(argcnt, args, "xdt:r:o:s:S:plNv")) != EOF) {
- switch (c)
- {
- case 't':
-- if (type_flag & (RADIXTREE_REQUEST|RBTREE_REQUEST|XARRAY_REQUEST)) {
-+ if (type_flag & (RADIXTREE_REQUEST|RBTREE_REQUEST|XARRAY_REQUEST|MAPLE_REQUEST)) {
- error(INFO, "multiple tree types may not be entered\n");
- cmd_usage(pc->curcmd, SYNOPSIS);
- }
-
- if (STRNEQ(optarg, "ra"))
-- if (MEMBER_EXISTS("radix_tree_root", "xa_head"))
-+ if (MEMBER_EXISTS("radix_tree_root", "xa_head")) {
- type_flag = XARRAY_REQUEST;
-- else
-+ type_name = "Xarrays";
-+ } else {
- type_flag = RADIXTREE_REQUEST;
-- else if (STRNEQ(optarg, "rb"))
-+ type_name = "radix trees";
-+ }
-+ else if (STRNEQ(optarg, "rb")) {
- type_flag = RBTREE_REQUEST;
-- else if (STRNEQ(optarg, "x"))
-+ type_name = "rbtrees";
-+ } else if (STRNEQ(optarg, "x")) {
- type_flag = XARRAY_REQUEST;
-- else {
-+ type_name = "Xarrays";
-+ } else if (STRNEQ(optarg, "m")) {
-+ type_flag = MAPLE_REQUEST;
-+ type_name = "maple trees";
-+ } else {
- error(INFO, "invalid tree type: %s\n", optarg);
- cmd_usage(pc->curcmd, SYNOPSIS);
- }
-@@ -4417,6 +4427,9 @@ cmd_tree()
- "-d and -x are mutually exclusive\n");
- td->flags |= TREE_STRUCT_RADIX_10;
- break;
-+ case 'v':
-+ td->flags |= TREE_STRUCT_VERBOSE;
-+ break;
- default:
- argerrs++;
- break;
-@@ -4426,13 +4439,17 @@ cmd_tree()
- if (argerrs)
- cmd_usage(pc->curcmd, SYNOPSIS);
-
-- if ((type_flag & (XARRAY_REQUEST|RADIXTREE_REQUEST)) && (td->flags & TREE_LINEAR_ORDER))
-- error(FATAL, "-l option is not applicable to %s\n",
-- type_flag & RADIXTREE_REQUEST ? "radix trees" : "Xarrays");
-+ if ((type_flag & (XARRAY_REQUEST|RADIXTREE_REQUEST|MAPLE_REQUEST)) &&
-+ (td->flags & TREE_LINEAR_ORDER))
-+ error(FATAL, "-l option is not applicable to %s\n", type_name);
-
-- if ((type_flag & (XARRAY_REQUEST|RADIXTREE_REQUEST)) && (td->flags & TREE_NODE_OFFSET_ENTERED))
-- error(FATAL, "-o option is not applicable to %s\n",
-- type_flag & RADIXTREE_REQUEST ? "radix trees" : "Xarrays");
-+ if ((type_flag & (XARRAY_REQUEST|RADIXTREE_REQUEST|MAPLE_REQUEST)) &&
-+ (td->flags & TREE_NODE_OFFSET_ENTERED))
-+ error(FATAL, "-o option is not applicable to %s\n", type_name);
-+
-+ if ((type_flag & (RBTREE_REQUEST|XARRAY_REQUEST|RADIXTREE_REQUEST)) &&
-+ (td->flags & TREE_STRUCT_VERBOSE))
-+ error(FATAL, "-v option is not applicable to %s\n", type_name);
-
- if ((td->flags & TREE_ROOT_OFFSET_ENTERED) &&
- (td->flags & TREE_NODE_POINTER))
-@@ -4506,12 +4523,26 @@ next_arg:
- if (td->flags & TREE_STRUCT_RADIX_16)
- fprintf(fp, "%sTREE_STRUCT_RADIX_16",
- others++ ? "|" : "");
-+ if (td->flags & TREE_PARSE_MEMBER)
-+ fprintf(fp, "%sTREE_PARSE_MEMBER",
-+ others++ ? "|" : "");
-+ if (td->flags & TREE_READ_MEMBER)
-+ fprintf(fp, "%sTREE_READ_MEMBER",
-+ others++ ? "|" : "");
-+ if (td->flags & TREE_LINEAR_ORDER)
-+ fprintf(fp, "%sTREE_LINEAR_ORDER",
-+ others++ ? "|" : "");
-+ if (td->flags & TREE_STRUCT_VERBOSE)
-+ fprintf(fp, "%sTREE_STRUCT_VERBOSE",
-+ others++ ? "|" : "");
- fprintf(fp, ")\n");
- fprintf(fp, " type: ");
- if (type_flag & RADIXTREE_REQUEST)
- fprintf(fp, "radix\n");
- else if (type_flag & XARRAY_REQUEST)
- fprintf(fp, "xarray\n");
-+ else if (type_flag & MAPLE_REQUEST)
-+ fprintf(fp, "maple\n");
- else
- fprintf(fp, "red-black%s",
- type_flag & RBTREE_REQUEST ?
-@@ -4532,6 +4563,8 @@ next_arg:
- do_rdtree(td);
- else if (type_flag & XARRAY_REQUEST)
- do_xatree(td);
-+ else if (type_flag & MAPLE_REQUEST)
-+ do_mptree(td);
- else
- do_rbtree(td);
- hq_close();
---
-2.37.1
-
diff --git a/0025-Add-do_maple_tree-for-maple-tree-operations.patch b/0025-Add-do_maple_tree-for-maple-tree-operations.patch
deleted file mode 100644
index 370f1ef..0000000
--- a/0025-Add-do_maple_tree-for-maple-tree-operations.patch
+++ /dev/null
@@ -1,205 +0,0 @@
-From 222176a0a6c14b6a1cdcebb8dda020ccb17b90f8 Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao(a)redhat.com>
-Date: Tue, 10 Jan 2023 14:56:29 +0800
-Subject: [PATCH 25/28] Add do_maple_tree() for maple tree operations
-
-do_maple_tree() is similar to do_radix_tree() and do_xarray(), which
-takes the same do_maple_tree_traverse entry as tree command.
-
-Signed-off-by: Tao Liu <ltao(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- defs.h | 6 +++
- maple_tree.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 151 insertions(+)
-
-diff --git a/defs.h b/defs.h
-index f98e18937949..33a823b7b67c 100644
---- a/defs.h
-+++ b/defs.h
-@@ -5762,6 +5762,12 @@ int cleanup_memory_driver(void);
-
- void maple_init(void);
- int do_mptree(struct tree_data *);
-+ulong do_maple_tree(ulong, int, struct list_pair *);
-+#define MAPLE_TREE_COUNT (1)
-+#define MAPLE_TREE_SEARCH (2)
-+#define MAPLE_TREE_DUMP (3)
-+#define MAPLE_TREE_GATHER (4)
-+#define MAPLE_TREE_DUMP_CB (5)
-
- /*
- * help.c
-diff --git a/maple_tree.c b/maple_tree.c
-index 471136f3eb1d..807c17f7dfa0 100644
---- a/maple_tree.c
-+++ b/maple_tree.c
-@@ -40,6 +40,12 @@ static inline bool ma_is_leaf(const enum maple_type type)
-
- /*************** For cmd_tree ********************/
-
-+struct do_maple_tree_info {
-+ ulong maxcount;
-+ ulong count;
-+ void *data;
-+};
-+
- struct maple_tree_ops {
- void (*entry)(ulong node, ulong slot, const char *path,
- ulong index, void *private);
-@@ -281,6 +287,9 @@ static void do_mt_entry(ulong entry, ulong min, ulong max, uint depth,
- static struct req_entry **e = NULL;
- struct tree_data *td = ops->is_td ? (struct tree_data *)ops->private : NULL;
-
-+ if (ops->entry)
-+ ops->entry(entry, entry, path, max, ops->private);
-+
- if (!td)
- return;
-
-@@ -424,6 +433,142 @@ int do_mptree(struct tree_data *td)
- return 0;
- }
-
-+/************* For do_maple_tree *****************/
-+static void do_maple_tree_count(ulong node, ulong slot, const char *path,
-+ ulong index, void *private)
-+{
-+ struct do_maple_tree_info *info = private;
-+ info->count++;
-+}
-+
-+static void do_maple_tree_search(ulong node, ulong slot, const char *path,
-+ ulong index, void *private)
-+{
-+ struct do_maple_tree_info *info = private;
-+ struct list_pair *lp = info->data;
-+
-+ if (lp->index == index) {
-+ lp->value = (void *)slot;
-+ info->count = 1;
-+ }
-+}
-+
-+static void do_maple_tree_dump(ulong node, ulong slot, const char *path,
-+ ulong index, void *private)
-+{
-+ struct do_maple_tree_info *info = private;
-+ fprintf(fp, "[%lu] %lx\n", index, slot);
-+ info->count++;
-+}
-+
-+static void do_maple_tree_gather(ulong node, ulong slot, const char *path,
-+ ulong index, void *private)
-+{
-+ struct do_maple_tree_info *info = private;
-+ struct list_pair *lp = info->data;
-+
-+ if (info->maxcount) {
-+ lp[info->count].index = index;
-+ lp[info->count].value = (void *)slot;
-+
-+ info->count++;
-+ info->maxcount--;
-+ }
-+}
-+
-+static void do_maple_tree_dump_cb(ulong node, ulong slot, const char *path,
-+ ulong index, void *private)
-+{
-+ struct do_maple_tree_info *info = private;
-+ struct list_pair *lp = info->data;
-+ int (*cb)(ulong) = lp->value;
-+
-+ /* Caller defined operation */
-+ if (!cb(slot)) {
-+ error(FATAL, "do_maple_tree: callback "
-+ "operation failed: entry: %ld item: %lx\n",
-+ info->count, slot);
-+ }
-+ info->count++;
-+}
-+
-+/*
-+ * do_maple_tree argument usage:
-+ *
-+ * root: Address of a maple_tree_root structure
-+ *
-+ * flag: MAPLE_TREE_COUNT - Return the number of entries in the tree.
-+ * MAPLE_TREE_SEARCH - Search for an entry at lp->index; if found,
-+ * store the entry in lp->value and return a count of 1; otherwise
-+ * return a count of 0.
-+ * MAPLE_TREE_DUMP - Dump all existing index/value pairs.
-+ * MAPLE_TREE_GATHER - Store all existing index/value pairs in the
-+ * passed-in array of list_pair structs starting at lp,
-+ * returning the count of entries stored; the caller can/should
-+ * limit the number of returned entries by putting the array size
-+ * (max count) in the lp->index field of the first structure
-+ * in the passed-in array.
-+ * MAPLE_TREE_DUMP_CB - Similar with MAPLE_TREE_DUMP, but for each
-+ * maple tree entry, a user defined callback at lp->value will
-+ * be invoked.
-+ *
-+ * lp: Unused by MAPLE_TREE_COUNT and MAPLE_TREE_DUMP.
-+ * A pointer to a list_pair structure for MAPLE_TREE_SEARCH.
-+ * A pointer to an array of list_pair structures for
-+ * MAPLE_TREE_GATHER; the dimension (max count) of the array may
-+ * be stored in the index field of the first structure to avoid
-+ * any chance of an overrun.
-+ * For MAPLE_TREE_DUMP_CB, the lp->value must be initialized as a
-+ * callback function. The callback prototype must be: int (*)(ulong);
-+ */
-+ulong
-+do_maple_tree(ulong root, int flag, struct list_pair *lp)
-+{
-+ struct do_maple_tree_info info = {
-+ .count = 0,
-+ .data = lp,
-+ };
-+ struct maple_tree_ops ops = {
-+ .private = &info,
-+ .is_td = false,
-+ };
-+
-+ switch (flag)
-+ {
-+ case MAPLE_TREE_COUNT:
-+ ops.entry = do_maple_tree_count;
-+ break;
-+
-+ case MAPLE_TREE_SEARCH:
-+ ops.entry = do_maple_tree_search;
-+ break;
-+
-+ case MAPLE_TREE_DUMP:
-+ ops.entry = do_maple_tree_dump;
-+ break;
-+
-+ case MAPLE_TREE_GATHER:
-+ if (!(info.maxcount = lp->index))
-+ info.maxcount = (ulong)(-1); /* caller beware */
-+
-+ ops.entry = do_maple_tree_gather;
-+ break;
-+
-+ case MAPLE_TREE_DUMP_CB:
-+ if (lp->value == NULL) {
-+ error(FATAL, "do_maple_tree: need set callback function");
-+ }
-+ ops.entry = do_maple_tree_dump_cb;
-+ break;
-+
-+ default:
-+ error(FATAL, "do_maple_tree: invalid flag: %lx\n", flag);
-+ }
-+
-+ do_maple_tree_traverse(root, true, &ops);
-+ return info.count;
-+}
-+
- /***********************************************/
- void maple_init(void)
- {
---
-2.37.1
-
diff --git a/0026-Introduce-maple-tree-vma-iteration-to-vm_area_dump.patch b/0026-Introduce-maple-tree-vma-iteration-to-vm_area_dump.patch
deleted file mode 100644
index 7a41a99..0000000
--- a/0026-Introduce-maple-tree-vma-iteration-to-vm_area_dump.patch
+++ /dev/null
@@ -1,455 +0,0 @@
-From 9efc1f68a44f6fe521e64efe4a3dc36e9ba0bbc1 Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao(a)redhat.com>
-Date: Tue, 10 Jan 2023 14:56:30 +0800
-Subject: [PATCH 26/28] Introduce maple tree vma iteration to vm_area_dump()
-
-Since memory.c:vm_area_dump() will iterate all vma, this patch mainly
-introduces maple tree vma iteration to it.
-
-We extract the code which handles each vma into a function. If
-mm_struct_mmap exist, aka the linked list of vma iteration available,
-we goto the original way; if not and mm_struct_mm_mt exist, aka
-maple tree is available, then we goto the maple tree vma iteration.
-
-Signed-off-by: Tao Liu <ltao(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- Makefile | 2 +-
- memory.c | 321 +++++++++++++++++++++++++++++++++----------------------
- 2 files changed, 193 insertions(+), 130 deletions(-)
-
-diff --git a/Makefile b/Makefile
-index 102597f735b2..a94a243c243e 100644
---- a/Makefile
-+++ b/Makefile
-@@ -355,7 +355,7 @@ filesys.o: ${GENERIC_HFILES} filesys.c
- help.o: ${GENERIC_HFILES} help.c
- ${CC} -c ${CRASH_CFLAGS} help.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-
--memory.o: ${GENERIC_HFILES} memory.c
-+memory.o: ${GENERIC_HFILES} ${MAPLE_TREE_HFILES} memory.c
- ${CC} -c ${CRASH_CFLAGS} memory.c ${WARNING_OPTIONS} ${WARNING_ERROR}
-
- test.o: ${GENERIC_HFILES} test.c
-diff --git a/memory.c b/memory.c
-index 156de2f7b5a3..5141fbea4b40 100644
---- a/memory.c
-+++ b/memory.c
-@@ -21,6 +21,7 @@
- #include <ctype.h>
- #include <netinet/in.h>
- #include <byteswap.h>
-+#include "maple_tree.h"
-
- struct meminfo { /* general purpose memory information structure */
- ulong cache; /* used by the various memory searching/dumping */
-@@ -137,6 +138,27 @@ struct searchinfo {
- char buf[BUFSIZE];
- };
-
-+struct handle_each_vm_area_args {
-+ ulong task;
-+ ulong flag;
-+ ulong vaddr;
-+ struct reference *ref;
-+ char *vma_header;
-+ char *buf1;
-+ char *buf2;
-+ char *buf3;
-+ char *buf4;
-+ char *buf5;
-+ ulong vma;
-+ char **vma_buf;
-+ struct task_mem_usage *tm;
-+ int *found;
-+ int *single_vma_found;
-+ unsigned int radix;
-+ struct task_context *tc;
-+ ulong *single_vma;
-+};
-+
- static char *memtype_string(int, int);
- static char *error_handle_string(ulong);
- static void collect_page_member_data(char *, struct meminfo *);
-@@ -299,6 +321,7 @@ static void dump_page_flags(ulonglong);
- static ulong kmem_cache_nodelists(ulong);
- static void dump_hstates(void);
- static ulong freelist_ptr(struct meminfo *, ulong, ulong);
-+static ulong handle_each_vm_area(struct handle_each_vm_area_args *);
-
- /*
- * Memory display modes specific to this file.
-@@ -363,6 +386,10 @@ vm_init(void)
-
- MEMBER_OFFSET_INIT(task_struct_mm, "task_struct", "mm");
- MEMBER_OFFSET_INIT(mm_struct_mmap, "mm_struct", "mmap");
-+ MEMBER_OFFSET_INIT(mm_struct_mm_mt, "mm_struct", "mm_mt");
-+ if (VALID_MEMBER(mm_struct_mm_mt)) {
-+ maple_init();
-+ }
- MEMBER_OFFSET_INIT(mm_struct_pgd, "mm_struct", "pgd");
- MEMBER_OFFSET_INIT(mm_struct_rss, "mm_struct", "rss");
- if (!VALID_MEMBER(mm_struct_rss))
-@@ -3874,7 +3901,7 @@ bailout:
- * for references -- and only then does a display
- */
-
--#define PRINT_VM_DATA() \
-+#define PRINT_VM_DATA(buf4, buf5, tm) \
- { \
- fprintf(fp, "%s %s ", \
- mkstring(buf4, VADDR_PRLEN, CENTER|LJUST, "MM"), \
-@@ -3896,9 +3923,9 @@ bailout:
- mkstring(buf5, 8, CENTER|LJUST, NULL)); \
- }
-
--#define PRINT_VMA_DATA() \
-+#define PRINT_VMA_DATA(buf1, buf2, buf3, buf4, vma) \
- fprintf(fp, "%s%s%s%s%s %6llx%s%s\n", \
-- mkstring(buf4, VADDR_PRLEN, CENTER|LJUST|LONG_HEX, MKSTR(vma)), \
-+ mkstring(buf4, VADDR_PRLEN, CENTER|LJUST|LONG_HEX, MKSTR(vma)),\
- space(MINSPACE), \
- mkstring(buf2, UVADDR_PRLEN, RJUST|LONG_HEX, MKSTR(vm_start)), \
- space(MINSPACE), \
-@@ -3925,18 +3952,137 @@ bailout:
- (DO_REF_SEARCH(X) && (string_exists(S)) && FILENAME_COMPONENT((S),(X)->str))
- #define VM_REF_FOUND(X) ((X) && ((X)->cmdflags & VM_REF_HEADER))
-
--ulong
--vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
-+static ulong handle_each_vm_area(struct handle_each_vm_area_args *args)
- {
-- struct task_context *tc;
-- ulong vma;
-+ char *dentry_buf, *file_buf;
- ulong vm_start;
- ulong vm_end;
-- ulong vm_next, vm_mm;
-- char *dentry_buf, *vma_buf, *file_buf;
-+ ulong vm_mm;
- ulonglong vm_flags;
- ulong vm_file, inode;
- ulong dentry, vfsmnt;
-+
-+ if ((args->flag & PHYSADDR) && !DO_REF_SEARCH(args->ref))
-+ fprintf(fp, "%s", args->vma_header);
-+
-+ inode = 0;
-+ BZERO(args->buf1, BUFSIZE);
-+ *(args->vma_buf) = fill_vma_cache(args->vma);
-+
-+ vm_mm = ULONG(*(args->vma_buf) + OFFSET(vm_area_struct_vm_mm));
-+ vm_end = ULONG(*(args->vma_buf) + OFFSET(vm_area_struct_vm_end));
-+ vm_start = ULONG(*(args->vma_buf) + OFFSET(vm_area_struct_vm_start));
-+ vm_flags = get_vm_flags(*(args->vma_buf));
-+ vm_file = ULONG(*(args->vma_buf) + OFFSET(vm_area_struct_vm_file));
-+
-+ if (args->flag & PRINT_SINGLE_VMA) {
-+ if (args->vma != *(args->single_vma))
-+ return 0;
-+ fprintf(fp, "%s", args->vma_header);
-+ *(args->single_vma_found) = TRUE;
-+ }
-+
-+ if (args->flag & PRINT_VMA_STRUCTS) {
-+ dump_struct("vm_area_struct", args->vma, args->radix);
-+ return 0;
-+ }
-+
-+ if (vm_file && !(args->flag & VERIFY_ADDR)) {
-+ file_buf = fill_file_cache(vm_file);
-+ dentry = ULONG(file_buf + OFFSET(file_f_dentry));
-+ dentry_buf = NULL;
-+ if (dentry) {
-+ dentry_buf = fill_dentry_cache(dentry);
-+ if (VALID_MEMBER(file_f_vfsmnt)) {
-+ vfsmnt = ULONG(file_buf + OFFSET(file_f_vfsmnt));
-+ get_pathname(dentry, args->buf1, BUFSIZE, 1, vfsmnt);
-+ } else
-+ get_pathname(dentry, args->buf1, BUFSIZE, 1, 0);
-+ }
-+ if ((args->flag & PRINT_INODES) && dentry)
-+ inode = ULONG(dentry_buf + OFFSET(dentry_d_inode));
-+ }
-+
-+ if (!(args->flag & UVADDR) || ((args->flag & UVADDR) &&
-+ ((args->vaddr >= vm_start) && (args->vaddr < vm_end)))) {
-+ *(args->found) = TRUE;
-+
-+ if (args->flag & VERIFY_ADDR)
-+ return args->vma;
-+
-+ if (DO_REF_SEARCH(args->ref)) {
-+ if (VM_REF_CHECK_HEXVAL(args->ref, args->vma) ||
-+ VM_REF_CHECK_HEXVAL(args->ref, (ulong)vm_flags) ||
-+ VM_REF_CHECK_STRING(args->ref, args->buf1)) {
-+ if (!(args->ref->cmdflags & VM_REF_HEADER)) {
-+ print_task_header(fp, args->tc, 0);
-+ PRINT_VM_DATA(args->buf4, args->buf5, args->tm);
-+ args->ref->cmdflags |= VM_REF_HEADER;
-+ }
-+ if (!(args->ref->cmdflags & VM_REF_VMA) ||
-+ (args->ref->cmdflags & VM_REF_PAGE)) {
-+ fprintf(fp, "%s", args->vma_header);
-+ args->ref->cmdflags |= VM_REF_VMA;
-+ args->ref->cmdflags &= ~VM_REF_PAGE;
-+ args->ref->ref1 = args->vma;
-+ }
-+ PRINT_VMA_DATA(args->buf1, args->buf2,
-+ args->buf3, args->buf4, args->vma);
-+ }
-+
-+ if (vm_area_page_dump(args->vma, args->task,
-+ vm_start, vm_end, vm_mm, args->ref)) {
-+ if (!(args->ref->cmdflags & VM_REF_HEADER)) {
-+ print_task_header(fp, args->tc, 0);
-+ PRINT_VM_DATA(args->buf4, args->buf5, args->tm);
-+ args->ref->cmdflags |= VM_REF_HEADER;
-+ }
-+ if (!(args->ref->cmdflags & VM_REF_VMA) ||
-+ (args->ref->ref1 != args->vma)) {
-+ fprintf(fp, "%s", args->vma_header);
-+ PRINT_VMA_DATA(args->buf1, args->buf2,
-+ args->buf3, args->buf4, args->vma);
-+ args->ref->cmdflags |= VM_REF_VMA;
-+ args->ref->ref1 = args->vma;
-+ }
-+
-+ args->ref->cmdflags |= VM_REF_DISPLAY;
-+ vm_area_page_dump(args->vma, args->task,
-+ vm_start, vm_end, vm_mm, args->ref);
-+ args->ref->cmdflags &= ~VM_REF_DISPLAY;
-+ }
-+
-+ return 0;
-+ }
-+
-+ if (inode) {
-+ fprintf(fp, "%lx%s%s%s%s%s%6llx%s%lx %s\n",
-+ args->vma, space(MINSPACE),
-+ mkstring(args->buf2, UVADDR_PRLEN, RJUST|LONG_HEX,
-+ MKSTR(vm_start)), space(MINSPACE),
-+ mkstring(args->buf3, UVADDR_PRLEN, RJUST|LONG_HEX,
-+ MKSTR(vm_end)), space(MINSPACE),
-+ vm_flags, space(MINSPACE), inode, args->buf1);
-+ } else {
-+ PRINT_VMA_DATA(args->buf1, args->buf2,
-+ args->buf3, args->buf4, args->vma);
-+
-+ if (args->flag & (PHYSADDR|PRINT_SINGLE_VMA))
-+ vm_area_page_dump(args->vma, args->task,
-+ vm_start, vm_end, vm_mm, args->ref);
-+ }
-+
-+ if (args->flag & UVADDR)
-+ return args->vma;
-+ }
-+ return 0;
-+}
-+
-+ulong
-+vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
-+{
-+ struct task_context *tc;
-+ ulong vma;
- ulong single_vma;
- unsigned int radix;
- int single_vma_found;
-@@ -3948,6 +4094,10 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
- char buf4[BUFSIZE];
- char buf5[BUFSIZE];
- char vma_header[BUFSIZE];
-+ char *vma_buf;
-+ int i;
-+ ulong mm_mt, entry_num;
-+ struct list_pair *entry_list;
-
- tc = task_to_context(task);
- tm = &task_mem_usage;
-@@ -3981,14 +4131,14 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
- if (VM_REF_CHECK_HEXVAL(ref, tm->mm_struct_addr) ||
- VM_REF_CHECK_HEXVAL(ref, tm->pgd_addr)) {
- print_task_header(fp, tc, 0);
-- PRINT_VM_DATA();
-+ PRINT_VM_DATA(buf4, buf5, tm);
- fprintf(fp, "\n");
- return (ulong)NULL;
- }
-
- if (!(flag & (UVADDR|PRINT_MM_STRUCT|PRINT_VMA_STRUCTS|PRINT_SINGLE_VMA)) &&
- !DO_REF_SEARCH(ref))
-- PRINT_VM_DATA();
-+ PRINT_VM_DATA(buf4, buf5, tm);
-
- if (!tm->mm_struct_addr) {
- if (pc->curcmd_flags & MM_STRUCT_FORCE) {
-@@ -4012,9 +4162,6 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
- return (ulong)NULL;
- }
-
-- readmem(tm->mm_struct_addr + OFFSET(mm_struct_mmap), KVADDR,
-- &vma, sizeof(void *), "mm_struct mmap", FAULT_ON_ERROR);
--
- sprintf(vma_header, "%s%s%s%s%s FLAGS%sFILE\n",
- mkstring(buf1, VADDR_PRLEN, CENTER|LJUST, "VMA"),
- space(MINSPACE),
-@@ -4027,125 +4174,41 @@ vm_area_dump(ulong task, ulong flag, ulong vaddr, struct reference *ref)
- !DO_REF_SEARCH(ref))
- fprintf(fp, "%s", vma_header);
-
-- for (found = FALSE; vma; vma = vm_next) {
--
-- if ((flag & PHYSADDR) && !DO_REF_SEARCH(ref))
-- fprintf(fp, "%s", vma_header);
--
-- inode = 0;
-- BZERO(buf1, BUFSIZE);
-- vma_buf = fill_vma_cache(vma);
--
-- vm_mm = ULONG(vma_buf + OFFSET(vm_area_struct_vm_mm));
-- vm_end = ULONG(vma_buf + OFFSET(vm_area_struct_vm_end));
-- vm_next = ULONG(vma_buf + OFFSET(vm_area_struct_vm_next));
-- vm_start = ULONG(vma_buf + OFFSET(vm_area_struct_vm_start));
-- vm_flags = get_vm_flags(vma_buf);
-- vm_file = ULONG(vma_buf + OFFSET(vm_area_struct_vm_file));
--
-- if (flag & PRINT_SINGLE_VMA) {
-- if (vma != single_vma)
-- continue;
-- fprintf(fp, "%s", vma_header);
-- single_vma_found = TRUE;
-- }
--
-- if (flag & PRINT_VMA_STRUCTS) {
-- dump_struct("vm_area_struct", vma, radix);
-- continue;
-- }
-+ found = FALSE;
-
-- if (vm_file && !(flag & VERIFY_ADDR)) {
-- file_buf = fill_file_cache(vm_file);
-- dentry = ULONG(file_buf + OFFSET(file_f_dentry));
-- dentry_buf = NULL;
-- if (dentry) {
-- dentry_buf = fill_dentry_cache(dentry);
-- if (VALID_MEMBER(file_f_vfsmnt)) {
-- vfsmnt = ULONG(file_buf +
-- OFFSET(file_f_vfsmnt));
-- get_pathname(dentry, buf1, BUFSIZE,
-- 1, vfsmnt);
-- } else {
-- get_pathname(dentry, buf1, BUFSIZE,
-- 1, 0);
-- }
-- }
-- if ((flag & PRINT_INODES) && dentry) {
-- inode = ULONG(dentry_buf +
-- OFFSET(dentry_d_inode));
-+ struct handle_each_vm_area_args args = {
-+ .task = task, .flag = flag, .vaddr = vaddr,
-+ .ref = ref, .tc = tc, .radix = radix,
-+ .tm = tm, .buf1 = buf1, .buf2 = buf2,
-+ .buf3 = buf3, .buf4 = buf4, .buf5 = buf5,
-+ .vma_header = vma_header, .single_vma = &single_vma,
-+ .single_vma_found = &single_vma_found, .found = &found,
-+ .vma_buf = &vma_buf,
-+ };
-+
-+ if (INVALID_MEMBER(mm_struct_mmap) && VALID_MEMBER(mm_struct_mm_mt)) {
-+ mm_mt = tm->mm_struct_addr + OFFSET(mm_struct_mm_mt);
-+ entry_num = do_maple_tree(mm_mt, MAPLE_TREE_COUNT, NULL);
-+ entry_list = (struct list_pair *)GETBUF(entry_num * sizeof(struct list_pair));
-+ do_maple_tree(mm_mt, MAPLE_TREE_GATHER, entry_list);
-+
-+ for (i = 0; i < entry_num; i++) {
-+ if (!!(args.vma = (ulong)entry_list[i].value) &&
-+ handle_each_vm_area(&args)) {
-+ FREEBUF(entry_list);
-+ return args.vma;
- }
- }
--
-- if (!(flag & UVADDR) || ((flag & UVADDR) &&
-- ((vaddr >= vm_start) && (vaddr < vm_end)))) {
-- found = TRUE;
--
-- if (flag & VERIFY_ADDR)
-- return vma;
--
-- if (DO_REF_SEARCH(ref)) {
-- if (VM_REF_CHECK_HEXVAL(ref, vma) ||
-- VM_REF_CHECK_HEXVAL(ref, (ulong)vm_flags) ||
-- VM_REF_CHECK_STRING(ref, buf1)) {
-- if (!(ref->cmdflags & VM_REF_HEADER)) {
-- print_task_header(fp, tc, 0);
-- PRINT_VM_DATA();
-- ref->cmdflags |= VM_REF_HEADER;
-- }
-- if (!(ref->cmdflags & VM_REF_VMA) ||
-- (ref->cmdflags & VM_REF_PAGE)) {
-- fprintf(fp, "%s", vma_header);
-- ref->cmdflags |= VM_REF_VMA;
-- ref->cmdflags &= ~VM_REF_PAGE;
-- ref->ref1 = vma;
-- }
-- PRINT_VMA_DATA();
-- }
--
-- if (vm_area_page_dump(vma, task,
-- vm_start, vm_end, vm_mm, ref)) {
-- if (!(ref->cmdflags & VM_REF_HEADER)) {
-- print_task_header(fp, tc, 0);
-- PRINT_VM_DATA();
-- ref->cmdflags |= VM_REF_HEADER;
-- }
-- if (!(ref->cmdflags & VM_REF_VMA) ||
-- (ref->ref1 != vma)) {
-- fprintf(fp, "%s", vma_header);
-- PRINT_VMA_DATA();
-- ref->cmdflags |= VM_REF_VMA;
-- ref->ref1 = vma;
-- }
--
-- ref->cmdflags |= VM_REF_DISPLAY;
-- vm_area_page_dump(vma, task,
-- vm_start, vm_end, vm_mm, ref);
-- ref->cmdflags &= ~VM_REF_DISPLAY;
-- }
--
-- continue;
-- }
--
-- if (inode) {
-- fprintf(fp, "%lx%s%s%s%s%s%6llx%s%lx %s\n",
-- vma, space(MINSPACE),
-- mkstring(buf2, UVADDR_PRLEN, RJUST|LONG_HEX,
-- MKSTR(vm_start)), space(MINSPACE),
-- mkstring(buf3, UVADDR_PRLEN, RJUST|LONG_HEX,
-- MKSTR(vm_end)), space(MINSPACE),
-- vm_flags, space(MINSPACE), inode, buf1);
-- } else {
-- PRINT_VMA_DATA();
--
-- if (flag & (PHYSADDR|PRINT_SINGLE_VMA))
-- vm_area_page_dump(vma, task,
-- vm_start, vm_end, vm_mm, ref);
-- }
--
-- if (flag & UVADDR)
-+ FREEBUF(entry_list);
-+ } else {
-+ readmem(tm->mm_struct_addr + OFFSET(mm_struct_mmap), KVADDR,
-+ &vma, sizeof(void *), "mm_struct mmap", FAULT_ON_ERROR);
-+ while (vma) {
-+ args.vma = vma;
-+ if (handle_each_vm_area(&args))
- return vma;
-- }
-+ vma = ULONG(vma_buf + OFFSET(vm_area_struct_vm_next));
-+ }
- }
-
- if (flag & VERIFY_ADDR)
---
-2.37.1
-
diff --git a/0027-Update-the-help-text-of-tree-command-for-maple-tree.patch b/0027-Update-the-help-text-of-tree-command-for-maple-tree.patch
deleted file mode 100644
index 8bc6e10..0000000
--- a/0027-Update-the-help-text-of-tree-command-for-maple-tree.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From 49f6c2095d82700b7845ad9a09cb6942cc114b52 Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao(a)redhat.com>
-Date: Tue, 10 Jan 2023 14:56:31 +0800
-Subject: [PATCH 27/28] Update the help text of "tree" command for maple tree
-
-Signed-off-by: Tao Liu <ltao(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- help.c | 86 +++++++++++++++++++++++++++++++++++++++++++---------------
- 1 file changed, 64 insertions(+), 22 deletions(-)
-
-diff --git a/help.c b/help.c
-index 367500fc280d..56a9d8274525 100644
---- a/help.c
-+++ b/help.c
-@@ -6307,19 +6307,20 @@ NULL
-
- char *help_tree[] = {
- "tree",
--"display radix tree, XArray or red-black tree",
--"[-t [radix|xarray|rbtree]] [-r offset] [-[s|S] struct[.member[,member]]]\n -[x|d] [-o offset] [-l] [-p] [-N] start",
--" This command dumps the contents of a radix tree, an XAarray, or a red-black",
--" tree. The arguments are as follows:\n",
-+"display radix tree, XArray, red-black tree or maple tree",
-+"[-t [radix|xarray|rbtree|maple]] [-r offset] [-[s|S] struct[.member[,member]]]\n"
-+" -[x|d] [-o offset] [-l] [-p] [-v] [-N] start",
-+" This command dumps the contents of a radix tree, an XAarray, a red-black",
-+" tree, or a maple tree. The arguments are as follows:\n",
- " -t type The type of tree to dump; the type string can be one of ",
--" \"radix\", \"rbtree\", or \"xarray\", or alternatively, \"ra\",",
--" \"rb\" or \"x\" are acceptable. If not specified, rbtree is the",
--" default type.",
-+" \"radix\", \"rbtree\", \"xarray\", or \"maple\", or alternatively,",
-+" \"ra\", \"rb\", \"x\" or \"m\" are acceptable. If not specified,",
-+" rbtree is the default type.",
- " -r offset If the \"start\" argument is the address of a data structure that",
--" contains an radix_tree_root, xarray or rb_root structure, then this",
--" is the offset to that structure member. If the offset is non-zero,",
--" then this option is required. The offset may be entered in either",
--" of two manners:",
-+" contains an radix_tree_root, maple_tree, xarray or rb_root",
-+" structure, then this is the offset to that structure member. If",
-+" the offset is non-zero, then this option is required. The offset",
-+" may be entered in either of two manners:",
- " 1. In \"structure.member\" format.",
- " 2. A number of bytes.",
- " -o offset For red-black trees only, the offset of the rb_node within its ",
-@@ -6348,25 +6349,26 @@ char *help_tree[] = {
- " -p Display the node's position information, showing the relationship",
- " between it and the root. For red-black trees, a position that",
- " indicates \"root/l/r\" means that the node is the right child",
--" of the left child of the root node. For radix trees and xarrays,",
--" the index, the height, and the slot index values are shown with",
--" respect to the root.",
-+" of the left child of the root node. For radix trees, xarrays and",
-+" maple trees, the index, the height, and the slot index values are",
-+" shown with respect to the root.",
- " -x Override default output format with hexadecimal format.",
- " -d Override default output format with decimal format.",
-+" -v For maple trees only, dump the contents of each maple tree node.",
- " ",
- " The meaning of the \"start\" argument, which can be expressed either in",
- " hexadecimal format or symbolically, depends upon whether the -N option",
- " is prepended:",
- " ",
--" start The address of a radix_tree_root, xarray or rb_root structure, or",
--" the address of a structure containing the radix_tree_root, xarray",
--" or rb_root structure; if the latter, then the \"-r offset\" option",
--" must be used if the member offset of the root structure is ",
--" non-zero.",
-+" start The address of a radix_tree_root, maple_tree, xarray or rb_root",
-+" structure, or the address of a structure containing the",
-+" radix_tree_root, maple_tree, xarray or rb_root structure; if the",
-+" latter, then the \"-r offset\" option must be used if the member",
-+" offset of the root structure is non-zero.",
- " ",
--" -N start The address of a radix_tree_node, xa_node or rb_node structure,",
--" bypassing the radix_tree_root, xarray, or rb_root that points",
--" to it.",
-+" -N start The address of a radix_tree_node, maple_node, xa_node or rb_node",
-+" structure, bypassing the radix_tree_root, maple_tree, xarray, or",
-+" rb_root that points to it.",
- "",
- "\nEXAMPLES",
- " The vmap_area_root is a standalone rb_root structure. Display the ",
-@@ -6703,6 +6705,46 @@ char *help_tree[] = {
- " _refcount = {",
- " counter = 0x1",
- " }",
-+"",
-+" The -v option is introduced specifically for dumping the complete content of",
-+" maple tree:",
-+"",
-+" %s> tree -t maple 0xffff9034c006aec0 -v",
-+"",
-+" maple_tree(ffff9034c006aec0) flags 309, height 2 root 0xffff9034de70041e",
-+"",
-+" 0-18446744073709551615: node 0xffff9034de700400 depth 0 type 3 parent ...",
-+" 0-140112331583487: node 0xffff9034c01e8800 depth 1 type 1 parent ...",
-+" 0-94643156942847: 0x0",
-+" 94643156942848-94643158024191: 0xffff9035131754c0",
-+" 94643158024192-94643160117247: 0x0",
-+" ...",
-+"",
-+" The existing options can work as well for maple tree:",
-+"",
-+" %s> tree -t maple -r mm_struct.mm_mt 0xffff9034c006aec0 -p",
-+" ffff9035131754c0",
-+" index: 1 position: root/0/1",
-+" ffff9035131751c8",
-+" index: 2 position: root/0/3",
-+" ffff9035131757b8",
-+" index: 3 position: root/0/4",
-+" ...",
-+"",
-+" %s> tree -t maple 0xffff9034c006aec0 -p -x -s vm_area_struct.vm_start,vm_end",
-+" ffff9035131754c0",
-+" index: 1 position: root/0/1",
-+" vm_start = 0x5613d3c00000,",
-+" vm_end = 0x5613d3d08000,",
-+" ffff9035131751c8",
-+" index: 2 position: root/0/3",
-+" vm_start = 0x5613d3f07000,",
-+" vm_end = 0x5613d3f0b000,",
-+" ffff9035131757b8",
-+" index: 3 position: root/0/4",
-+" vm_start = 0x5613d3f0b000,",
-+" vm_end = 0x5613d3f14000,",
-+" ....",
- NULL
- };
-
---
-2.37.1
-
diff --git a/0028-Dump-maple-tree-offset-variables-by-help-o.patch b/0028-Dump-maple-tree-offset-variables-by-help-o.patch
deleted file mode 100644
index 3c1bae8..0000000
--- a/0028-Dump-maple-tree-offset-variables-by-help-o.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 46344aa2f92b07ded52cf9841f8db24dd7fe67d7 Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao(a)redhat.com>
-Date: Tue, 10 Jan 2023 14:56:32 +0800
-Subject: [PATCH 28/28] Dump maple tree offset variables by "help -o"
-
-In the previous patches, some variables are added to offset_table and
-size_table, print them out with "help -o" command.
-
-Signed-off-by: Tao Liu <ltao(a)redhat.com>
-Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
----
- symbols.c | 17 +++++++++++++++++
- 1 file changed, 17 insertions(+)
-
-diff --git a/symbols.c b/symbols.c
-index 33e68d520a72..e38df8aad0f5 100644
---- a/symbols.c
-+++ b/symbols.c
-@@ -10766,6 +10766,21 @@ dump_offset_table(char *spec, ulong makestruct)
- OFFSET(sbq_wait_state_wait_cnt));
- fprintf(fp, " sbq_wait_state_wait: %ld\n",
- OFFSET(sbq_wait_state_wait));
-+ fprintf(fp, " mm_struct_mm_mt: %ld\n", OFFSET(mm_struct_mm_mt));
-+ fprintf(fp, " maple_tree_ma_root: %ld\n", OFFSET(maple_tree_ma_root));
-+ fprintf(fp, " maple_tree_ma_flags: %ld\n", OFFSET(maple_tree_ma_flags));
-+ fprintf(fp, " maple_node_parent: %ld\n", OFFSET(maple_node_parent));
-+ fprintf(fp, " maple_node_ma64: %ld\n", OFFSET(maple_node_ma64));
-+ fprintf(fp, " maple_node_mr64: %ld\n", OFFSET(maple_node_mr64));
-+ fprintf(fp, " maple_node_slot: %ld\n", OFFSET(maple_node_slot));
-+ fprintf(fp, " maple_arange_64_pivot: %ld\n", OFFSET(maple_arange_64_pivot));
-+ fprintf(fp, " maple_arange_64_slot: %ld\n", OFFSET(maple_arange_64_slot));
-+ fprintf(fp, " maple_arange_64_gap: %ld\n", OFFSET(maple_arange_64_gap));
-+ fprintf(fp, " maple_arange_64_meta: %ld\n", OFFSET(maple_arange_64_meta));
-+ fprintf(fp, " maple_range_64_pivot: %ld\n", OFFSET(maple_range_64_pivot));
-+ fprintf(fp, " maple_range_64_slot: %ld\n", OFFSET(maple_range_64_slot));
-+ fprintf(fp, " maple_metadata_end: %ld\n", OFFSET(maple_metadata_end));
-+ fprintf(fp, " maple_metadata_gap: %ld\n", OFFSET(maple_metadata_gap));
-
- fprintf(fp, "\n size_table:\n");
- fprintf(fp, " page: %ld\n", SIZE(page));
-@@ -11038,6 +11053,8 @@ dump_offset_table(char *spec, ulong makestruct)
- fprintf(fp, " sbitmap_queue: %ld\n", SIZE(sbitmap_queue));
- fprintf(fp, " sbq_wait_state: %ld\n", SIZE(sbq_wait_state));
- fprintf(fp, " blk_mq_tags: %ld\n", SIZE(blk_mq_tags));
-+ fprintf(fp, " maple_tree: %ld\n", SIZE(maple_tree));
-+ fprintf(fp, " maple_node: %ld\n", SIZE(maple_node));
-
- fprintf(fp, " percpu_counter: %ld\n", SIZE(percpu_counter));
-
---
-2.37.1
-
diff --git a/crash-8.0.2_build.patch b/crash-8.0.3_build.patch
similarity index 91%
rename from crash-8.0.2_build.patch
rename to crash-8.0.3_build.patch
index 898d09c..bb09e2b 100644
--- a/crash-8.0.2_build.patch
+++ b/crash-8.0.3_build.patch
@@ -1,5 +1,5 @@
---- crash-8.0.2/Makefile.orig
-+++ crash-8.0.2/Makefile
+--- crash-8.0.3/Makefile.orig
++++ crash-8.0.3/Makefile
@@ -204,7 +204,7 @@ GDB_FLAGS=
# TARGET_CFLAGS will be configured automatically by configure
TARGET_CFLAGS=
@@ -18,8 +18,8 @@
@echo "../../${PROGRAM} ../../${PROGRAM}lib.a" > ${GDB}/gdb/mergeobj
@rm -f ${PROGRAM}
@if [ ! -f ${GDB}/config.status ]; then \
---- crash-8.0.2/configure.c.orig
-+++ crash-8.0.2/configure.c
+--- crash-8.0.3/configure.c.orig
++++ crash-8.0.3/configure.c
@@ -810,7 +810,8 @@ build_configure(struct supported_gdb_version *sp)
fprintf(fp2, "%s\n", sp->GDB);
sprintf(target_data.gdb_version, "%s", &sp->GDB[4]);
diff --git a/crash.spec b/crash.spec
index 5732189..241900f 100644
--- a/crash.spec
+++ b/crash.spec
@@ -3,8 +3,8 @@
#
Summary: Kernel analysis utility for live systems, netdump, diskdump, kdump, LKCD or mcore dumpfiles
Name: crash
-Version: 8.0.2
-Release: 3%{?dist}
+Version: 8.0.3
+Release: 1%{?dist}
License: GPLv3
Source0: https://github.com/crash-utility/crash/archive/crash-%{version}.tar.gz
Source1: http://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.gz
@@ -18,36 +18,20 @@ Requires: binutils
Provides: bundled(libiberty)
Provides: bundled(gdb) = 10.2
Patch0: lzo_snappy_zstd.patch
-Patch1: 0001-ps-Provide-an-option-to-display-no-header-line.patch
-Patch2: 0002-arm64-fix-backtraces-of-KASAN-kernel-dumpfile-trunca.patch
-Patch3: 0003-arm64-handle-vabits_actual-symbol-missing-case.patch
-Patch4: 0004-EPPIC-extension-support-for-crash-8.x-gdb-10.x.patch
-Patch5: 0005-x86_64-Fix-for-move-of-per-cpu-variables-into-struct.patch
-Patch6: 0006-Fix-for-mm_struct.rss_stat-conversion-into-percpu_co.patch
-Patch7: 0007-Fix-mount-command-to-appropriately-display-the-mount.patch
-Patch8: 0008-Add-RISCV64-framework-code-support.patch
-Patch9: 0009-RISCV64-Make-crash-tool-enter-command-line-and-suppo.patch
-Patch10: 0010-RISCV64-Add-dis-command-support.patch
-Patch11: 0011-RISCV64-Add-irq-command-support.patch
-Patch12: 0012-RISCV64-Add-bt-command-support.patch
-Patch13: 0013-RISCV64-Add-help-r-command-support.patch
-Patch14: 0014-RISCV64-Add-help-m-M-command-support.patch
-Patch15: 0015-RISCV64-Add-mach-command-support.patch
-Patch16: 0016-RISCV64-Add-the-implementation-of-symbol-verify.patch
-Patch17: 0017-SLUB-Fix-for-offset-change-of-struct-slab-members-on.patch
-Patch18: 0018-Fix-for-kmem-i-to-display-correct-SLAB-statistics-on.patch
-Patch19: 0019-Fix-build-failure-due-to-no-EM_RISCV-with-glibc-2.23.patch
-Patch20: 0020-gdb-Fix-an-assertion-failure-in-the-gdb-s-copy_type.patch
-Patch21: 0021-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.1-and-later.patch
-Patch22: 0022-SLAB-Fix-for-kmem-s-S-options-on-Linux-6.2-rc1-and-l.patch
-Patch23: 0023-Port-the-maple-tree-data-structures-and-functions.patch
-Patch24: 0024-Add-maple-tree-support-to-tree-command.patch
-Patch25: 0025-Add-do_maple_tree-for-maple-tree-operations.patch
-Patch26: 0026-Introduce-maple-tree-vma-iteration-to-vm_area_dump.patch
-Patch27: 0027-Update-the-help-text-of-tree-command-for-maple-tree.patch
-Patch28: 0028-Dump-maple-tree-offset-variables-by-help-o.patch
-Patch29: crash-8.0.2_build.patch
-Patch30: crash-8.0.0-5-gdb-cdefs.patch
+Patch1: crash-8.0.3_build.patch
+Patch2: 0001-Fix-kernel-version-macros-for-revision-numbers-over-.patch
+Patch3: 0002-Fix-failure-of-dev-d-D-options-on-Linux-6.4-and-late.patch
+Patch4: 0003-Fix-kmem-v-option-displaying-no-regions-on-Linux-6.3.patch
+Patch5: 0004-arm64-x86_64-Enhance-vtop-command-to-show-zero_pfn-i.patch
+Patch6: 0005-diskdump-netdump-fix-segmentation-fault-caused-by-fa.patch
+Patch7: 0006-Fix-segfault-in-arm64_is_kernel_exception_frame-when.patch
+Patch8: 0007-Output-prompt-when-stdin-is-not-a-TTY.patch
+Patch9: 0008-x86_64-Fix-bt-command-printing-stale-entries-on-Linu.patch
+Patch10: 0009-Fix-invalid-structure-size-error-during-crash-startu.patch
+Patch11: 0010-Revert-Fix-segfault-in-arm64_is_kernel_exception_fra.patch
+Patch12: 0011-arm64-Fix-again-segfault-in-arm64_is_kernel_exceptio.patch
+Patch13: 0012-ppc64-Remove-redundant-PTE-checks.patch
+Patch14: 0013-Support-module-memory-layout-change-on-Linux-6.4.patch
%description
The core analysis suite is a self-contained tool that can be used to
@@ -82,25 +66,6 @@ offered by Mission Critical Linux, or the LKCD kernel patch.
%patch12 -p1
%patch13 -p1
%patch14 -p1
-%patch15 -p1
-%patch16 -p1
-%patch17 -p1
-%patch18 -p1
-%patch19 -p1
-%patch20 -p1
-%patch21 -p1
-%patch22 -p1
-%patch23 -p1
-%patch24 -p1
-%patch25 -p1
-%patch26 -p1
-%patch27 -p1
-%patch28 -p1
-%patch29 -p1 -b crash-8.0.2_build.patch
-%ifarch ppc64le
-%patch30 -p1 -b crash-8.0.0-5-gdb-cdefs.patch
-%endif
-
%build
@@ -126,6 +91,10 @@ cp -p defs.h %{buildroot}%{_includedir}/crash
%{_includedir}/*
%changelog
+* Tue Jun 27 2023 Lianbo Jiang <lijiang(a)redhat.com> - 8.0.3-1
+- Rebase to upstream crash 8.0.3
+- Support module memory layout change on Linux 6.4
+
* Tue Feb 07 2023 Lianbo Jiang <lijiang(a)redhat.com> - 8.0.2-3
- Update to the latest upstream commit <46344aa2f92b>
diff --git a/sources b/sources
index ef38a0b..29d88c0 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-SHA512 (crash-8.0.2.tar.gz) = 9ff24d1206e9376e83690f76c817a48a68ff6adce677fad70335a73550a59c9af6e4753c1199f22eafa60c137156313244bbf98ed01bc2b066f41d324738ef6b
+SHA512 (crash-8.0.3.tar.gz) = 1ce7fda89274051cea02a049a674f2ca43fc02e00121f951af0d4c23c7b74cc79949ec376bb6737f82b95fec0cbe495b53a09df7e5f1f31ee5a829c1d53d0ba0
SHA512 (gdb-10.2.tar.gz) = aa89caf47c1c84366020377d47e7c51ddbc48e5b7686f244e38797c8eb88411cf57fcdc37eb669961efb41ceeac4181747f429625fd1acce7712cb9a1fea9c41
10 months, 1 week
[Report] Packages Restricting Arches
by root
List of packages currently excluding arches (1375)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- BareBonesBrowserLaunch
ExclusiveArch: %{java_arches} noarch
- CFR
ExclusiveArch: %{java_arches} noarch
- CardManager
ExclusiveArch: %{java_arches} noarch
- GAPDoc
ExclusiveArch: %{gap_arches} noarch
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- IPAddress
ExclusiveArch: %{java_arches} noarch
- Mars
ExclusiveArch: %{java_arches} noarch
- OpenColorIO
ExclusiveArch: x86_64 ppc64le
- OpenImageIO
ExclusiveArch: x86_64 ppc64le
- OpenMolcas
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- OpenStego
ExclusiveArch: %{java_arches} noarch
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- R-rJava
ExclusiveArch: %{java_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- RediSearch
ExclusiveArch: x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aardvark-dns
ExclusiveArch: %{golang_arches_future}
- accel-config
ExclusiveArch: %{ix86} x86_64
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- algobox
ExclusiveArch: %{qt5_qtwebengine_arches}
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64 s390x
- anet
ExclusiveArch: %{GPRbuild_arches}
- ant
ExclusiveArch: %{java_arches} noarch
- ant-antunit
ExclusiveArch: %{java_arches} noarch
- antlr
ExclusiveArch: %{java_arches}
- antlr-maven-plugin
ExclusiveArch: %{java_arches} noarch
- antlr3
ExclusiveArch: %{java_arches}
- antlr32
ExclusiveArch: %{java_arches} noarch
- antlr4-project
ExclusiveArch: %{java_arches}
- antlrworks
ExclusiveArch: %{java_arches} noarch
- aopalliance
ExclusiveArch: %{java_arches} noarch
- apache-commons-beanutils
ExclusiveArch: %{java_arches} noarch
- apache-commons-cli
ExclusiveArch: %{java_arches} noarch
- apache-commons-codec
ExclusiveArch: %{java_arches} noarch
- apache-commons-collections
ExclusiveArch: %{java_arches} noarch
- apache-commons-collections4
ExclusiveArch: %{java_arches} noarch
- apache-commons-compress
ExclusiveArch: %{java_arches} noarch
- apache-commons-digester
ExclusiveArch: %{java_arches} noarch
- apache-commons-exec
ExclusiveArch: %{java_arches} noarch
- apache-commons-fileupload
ExclusiveArch: %{java_arches} noarch
- apache-commons-io
ExclusiveArch: %{java_arches} noarch
- apache-commons-jxpath
ExclusiveArch: %{java_arches} noarch
- apache-commons-lang3
ExclusiveArch: %{java_arches} noarch
- apache-commons-logging
ExclusiveArch: %{java_arches} noarch
- apache-commons-math
ExclusiveArch: %{java_arches} noarch
- apache-commons-modeler
ExclusiveArch: %{java_arches} noarch
- apache-commons-net
ExclusiveArch: %{java_arches} noarch
- apache-commons-parent
ExclusiveArch: %{java_arches} noarch
- apache-commons-pool
ExclusiveArch: %{java_arches} noarch
- apache-ivy
ExclusiveArch: %{java_arches} noarch
- apache-parent
ExclusiveArch: %{java_arches} noarch
- apache-resource-bundles
ExclusiveArch: %{java_arches} noarch
- apache-sshd
ExclusiveArch: %{java_arches} noarch
- apiguardian
ExclusiveArch: %{java_arches} noarch
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: %{ldc_arches}
- aqute-bnd
ExclusiveArch: %{java_arches} noarch
- args4j
ExclusiveArch: %{java_arches} noarch
- arianna
ExclusiveArch: %{qt5_qtwebengine_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- assertj-core
ExclusiveArch: %{java_arches} noarch
- atinject
ExclusiveArch: %{java_arches} noarch
- aunit
ExclusiveArch: %GPRbuild_arches
- auto
ExclusiveArch: %{java_arches} noarch
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- azure-cli
ExclusiveArch: %{java_arches} noarch
- batik
ExclusiveArch: %{java_arches} noarch
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
- bcel
ExclusiveArch: %{java_arches} noarch
- bcm283x-firmware
ExclusiveArch: aarch64
- beansbinding
ExclusiveArch: %{java_arches} noarch
- belle-sip
ExclusiveArch: %{java_arches}
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- beust-jcommander
ExclusiveArch: %{java_arches} noarch
- bibletime
ExclusiveArch: %{java_arches}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- bless
ExclusiveArch: %mono_arches
- bodhi-server
ExclusiveArch: %{golang_arches_future}
- bolzplatz2006
ExclusiveArch: %{java_arches}
- bouncycastle
ExclusiveArch: %{java_arches} noarch
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- brazil
ExclusiveArch: %{java_arches} noarch
- bsf
ExclusiveArch: %{java_arches} noarch
- bsh
ExclusiveArch: %{java_arches} noarch
- build-helper-maven-plugin
ExclusiveArch: %{java_arches} noarch
- buildah
ExclusiveArch: %{golang_arches_future}
- byte-buddy
ExclusiveArch: %{java_arches} noarch
- byteman
ExclusiveArch: %{java_arches} noarch
- cachelib
ExclusiveArch: x86_64 aarch64 ppc64le
- calamares
ExclusiveArch: %{ix86} x86_64 aarch64
- calibre
ExclusiveArch: aarch64 x86_64
- cambozola
ExclusiveArch: %{java_arches} noarch
- canl-java
ExclusiveArch: %{java_arches} noarch
- catatonit
ExclusiveArch: aarch64 ppc64le s390x x86_64
ExclusiveArch: %{golang_arches_future}
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- cdi-api
ExclusiveArch: %{java_arches} noarch
- ceph
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- cglib
ExclusiveArch: %{java_arches} noarch
- chromium
ExclusiveArch: x86_64
ExclusiveArch: x86_64 aarch64
ExclusiveArch: x86_64 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- classloader-leak-test-framework
ExclusiveArch: %{java_arches} noarch
- classpathless-compiler
ExclusiveArch: %{java_arches} noarch
- clevis-pin-tpm2
ExclusiveArch: %{rust_arches}
- clojure
ExclusiveArch: %{java_arches} noarch
- clojure-core-specs-alpha
ExclusiveArch: %{java_arches} noarch
- clojure-maven-plugin
ExclusiveArch: %{java_arches} noarch
- clojure-spec-alpha
ExclusiveArch: %{java_arches} noarch
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- codehaus-parent
ExclusiveArch: %{java_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- colossus
ExclusiveArch: %{java_arches} noarch
- conmon
ExclusiveArch: %{golang_arches_future}
- console-image-viewer
ExclusiveArch: %{java_arches} noarch
- containernetworking-plugins
ExclusiveArch: %{golang_arches}
- coq
ExclusiveArch: %{java_arches}
- cortado
ExclusiveArch: %{java_arches} noarch
- cpu-x
ExclusiveArch: i686 x86_64
- cpufetch
ExclusiveArch: %{arm} aarch64 x86_64 ppc ppc64 ppc64le
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- crash-gcore-command
ExclusiveArch: aarch64 ppc64le x86_64
- crash-trace-command
ExclusiveArch: aarch64 ppc64le s390x x86_64
- credentials-fetcher
ExclusiveArch: x86_64 aarch64 s390x
- cri-o
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- cri-tools
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- crun
ExclusiveArch: %{golang_arches_future}
- cryptlib
ExclusiveArch: x86_64 aarch64 ppc64le
- crypto-policies
ExclusiveArch: %{java_arches} noarch
- cryptobone
ExclusiveArch: x86_64 ppc64le aarch64
- csslint
ExclusiveArch: %{nodejs_arches} noarch
- cvc4
ExclusiveArch: %{java_arches}
- daq
ExclusiveArch: x86_64 aarch64
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- decentxml
ExclusiveArch: %{java_arches} noarch
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-desktop-schemas
ExclusiveArch: %{go_arches}
- directory-maven-plugin
ExclusiveArch: %{java_arches} noarch
- dirgra
ExclusiveArch: %{java_arches} noarch
- disruptor
ExclusiveArch: %{java_arches} noarch
- ditaa
ExclusiveArch: %{java_arches} noarch
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: x86_64
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dogtag-pki
ExclusiveArch: %{java_arches}
- dolphin-emu
ExclusiveArch: x86_64 aarch64
- dom4j
ExclusiveArch: %{java_arches} noarch
- dotnet6.0
ExclusiveArch: aarch64 x86_64 s390x
ExclusiveArch: x86_64
- dotnet7.0
ExclusiveArch: aarch64 ppc64le s390x x86_64
ExclusiveArch: x86_64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dub
ExclusiveArch: %{ldc_arches}
- dxvk-native
ExclusiveArch: %{ix86} x86_64
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- easymock
ExclusiveArch: %{java_arches} noarch
- ecj
ExclusiveArch: %{java_arches} noarch
- eclipse-swt
ExclusiveArch: %{java_arches}
- ed25519-java
ExclusiveArch: %{java_arches} noarch
- edk2
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efifs
ExclusiveArch: %{efi}
- efitools
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- emacs-slime
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- embree
ExclusiveArch: aarch64 x86_64
- embree3
ExclusiveArch: aarch64 x86_64
- enjarify
ExclusiveArch: %{java_arches} noarch
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- eric
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- erlang-corba
ExclusiveArch: %{java_arches}
- esmi_ib_library
ExclusiveArch: x86_64
- eth-tools
ExclusiveArch: x86_64
- exec-maven-plugin
ExclusiveArch: %{java_arches} noarch
- external-editor-revived
ExclusiveArch: %{rust_arches}
- extra-enforcer-rules
ExclusiveArch: %{java_arches} noarch
- fasterxml-oss-parent
ExclusiveArch: %{java_arches} noarch
- fb303
ExclusiveArch: x86_64 aarch64 ppc64le
- fbthrift
ExclusiveArch: x86_64 aarch64 ppc64le
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- felix-parent
ExclusiveArch: %{java_arches} noarch
- felix-utils
ExclusiveArch: %{java_arches} noarch
- fernflower
ExclusiveArch: %{java_arches} noarch
- fes
ExclusiveArch: %{ix86} x86_64
- filedrop
ExclusiveArch: %{java_arches} noarch
- firecracker
ExclusiveArch: aarch64 x86_64
- fishbowl
ExclusiveArch: %{java_arches} noarch
- fizz
ExclusiveArch: x86_64 aarch64 ppc64le
- flocq
ExclusiveArch: %{java_arches}
- florist
ExclusiveArch: %{GPRbuild_arches}
- fluent-bit
ExclusiveArch: x86_64 aarch64
- folly
ExclusiveArch: x86_64 aarch64 ppc64le
- fop
ExclusiveArch: %{java_arches} noarch
- forge-parent
ExclusiveArch: %{java_arches} noarch
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frama-c
ExclusiveArch: %{java_arches}
- freecol
ExclusiveArch: %{java_arches} noarch
- freemarker
ExclusiveArch: %{java_arches} noarch
- freerouting
ExclusiveArch: %{java_arches} noarch
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: x86_64 ppc64
- fuse-overlayfs
ExclusiveArch: %{arm64} ppc64le s390x x86_64
- fusesource-pom
ExclusiveArch: %{java_arches} noarch
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x riscv64 %{power64}
- fwupd-efi
ExclusiveArch: x86_64 aarch64
- ga
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- gap
ExclusiveArch: %{gap_arches}
- gap-pkg-ace
ExclusiveArch: %{gap_arches}
- gap-pkg-aclib
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-alnuth
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-atlasrep
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-autodoc
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-automata
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-autpgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-browse
ExclusiveArch: %{gap_arches}
- gap-pkg-caratinterface
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-circle
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-cohomolo
ExclusiveArch: %{gap_arches}
- gap-pkg-congruence
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-corelg
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crime
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crisp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crypting
ExclusiveArch: %{gap_arches}
- gap-pkg-cryst
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crystcat
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-ctbllib
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-curlinterface
ExclusiveArch: %{gap_arches}
- gap-pkg-cvec
ExclusiveArch: %{gap_arches}
- gap-pkg-datastructures
ExclusiveArch: %{gap_arches}
- gap-pkg-design
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-digraphs
ExclusiveArch: %{gap_arches}
- gap-pkg-edim
ExclusiveArch: %{gap_arches}
- gap-pkg-factint
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-ferret
ExclusiveArch: %{gap_arches}
- gap-pkg-fga
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-fining
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-float
ExclusiveArch: %{gap_arches}
- gap-pkg-format
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-forms
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-fr
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-francy
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-gbnp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-genss
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-grape
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-groupoids
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-grpconst
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-guava
ExclusiveArch: %{gap_arches}
- gap-pkg-hap
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-hapcryst
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-hecke
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-images
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-io
ExclusiveArch: %{gap_arches}
- gap-pkg-irredsol
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-json
ExclusiveArch: %{gap_arches}
- gap-pkg-jupyterkernel
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-jupyterviz
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-laguna
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-liealgdb
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-liepring
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-liering
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-loops
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-lpres
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-mapclass
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-nautytracesinterface
ExclusiveArch: %{gap_arches}
- gap-pkg-nq
ExclusiveArch: %{gap_arches}
- gap-pkg-openmath
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-orb
ExclusiveArch: %{gap_arches}
- gap-pkg-polenta
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-polycyclic
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-polymaking
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-primgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-profiling
ExclusiveArch: %{gap_arches}
- gap-pkg-qpa
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-quagroup
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-radiroot
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-recog
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-repsn
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-resclasses
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-scscp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-semigroups
ExclusiveArch: %{gap_arches}
- gap-pkg-singular
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-sla
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-smallgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-smallsemi
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-sonata
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-sophus
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-spinsym
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-standardff
ExclusiveArch: %{gap_arches}
- gap-pkg-tomlib
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-toric
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-transgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-utils
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-uuid
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-xmod
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-zeromqinterface
ExclusiveArch: %{gap_arches}
- gappalib-coq
ExclusiveArch: %{java_arches}
- gbrainy
ExclusiveArch: %mono_arches
- gdb
ExclusiveArch: %{ix86} x86_64
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gearhead1
ExclusiveArch: %{fpc_arches}
- gearhead2
ExclusiveArch: %{fpc_arches}
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gitqlient
ExclusiveArch: %{qt5_qtwebengine_arches}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- google-gson
ExclusiveArch: %{java_arches} noarch
- google-guice
ExclusiveArch: %{java_arches} noarch
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- goverlay
ExclusiveArch: %{fpc_arches}
- gprbuild
ExclusiveArch: %{GPRbuild_arches}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha aarch64
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{grafanapcp_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- guava
ExclusiveArch: %{java_arches} noarch
- gudev-sharp
ExclusiveArch: %mono_arches
- guestfs-tools
ExclusiveArch: %{kernel_arches}
- hamcrest
ExclusiveArch: %{java_arches} noarch
- harec
ExclusiveArch: x86_64 aarch64
- hawtjni
ExclusiveArch: %{java_arches} noarch
- hedgewars
ExclusiveArch: %{fpc_arches}
- hibernate-jpa-2.0-api
ExclusiveArch: %{java_arches} noarch
- hibernate-jpa-2.1-api
ExclusiveArch: %{java_arches} noarch
- hid4java
ExclusiveArch: %{java_arches} noarch
- hsakmt
ExclusiveArch: x86_64 aarch64 ppc64le
- httpcomponents-client
ExclusiveArch: %{java_arches} noarch
- httpcomponents-core
ExclusiveArch: %{java_arches} noarch
- httpcomponents-project
ExclusiveArch: %{java_arches} noarch
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64 aarch64
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- icedtea-web
ExclusiveArch: %{java_arches}
- icu4j
ExclusiveArch: %{java_arches} noarch
- imagej
ExclusiveArch: %{java_arches} noarch
- imhex
ExclusiveArch: x86_64 %{arm64}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- intel-cm-compiler
ExclusiveArch: i686 x86_64
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-compute-runtime
ExclusiveArch: x86_64
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-igc
ExclusiveArch: x86_64
- intel-ipp-crypto-mb
ExclusiveArch: x86_64
- intel-ipsec-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ispc
ExclusiveArch: x86_64 aarch64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iyfct
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- jFormatString
ExclusiveArch: %{java_arches} noarch
- jackson-annotations
ExclusiveArch: %{java_arches} noarch
- jackson-bom
ExclusiveArch: %{java_arches} noarch
- jackson-core
ExclusiveArch: %{java_arches} noarch
- jackson-databind
ExclusiveArch: %{java_arches} noarch
- jackson-dataformats-binary
ExclusiveArch: %{java_arches} noarch
- jackson-dataformats-text
ExclusiveArch: %{java_arches} noarch
- jackson-jaxrs-providers
ExclusiveArch: %{java_arches} noarch
- jackson-modules-base
ExclusiveArch: %{java_arches} noarch
- jackson-parent
ExclusiveArch: %{java_arches} noarch
- jacoco
ExclusiveArch: %{java_arches} noarch
- jacop
ExclusiveArch: %{java_arches} noarch
- jakarta-activation
ExclusiveArch: %{java_arches} noarch
- jakarta-activation1
ExclusiveArch: %{java_arches} noarch
- jakarta-annotations
ExclusiveArch: %{java_arches} noarch
- jakarta-el
ExclusiveArch: %{java_arches} noarch
- jakarta-interceptors
ExclusiveArch: %{java_arches} noarch
- jakarta-json
ExclusiveArch: %{java_arches} noarch
- jakarta-mail
ExclusiveArch: %{java_arches} noarch
- jakarta-oro
ExclusiveArch: %{java_arches} noarch
- jakarta-saaj
ExclusiveArch: %{java_arches} noarch
- jakarta-server-pages
ExclusiveArch: %{java_arches} noarch
- jakarta-servlet
ExclusiveArch: %{java_arches} noarch
- jakarta-xml-ws
ExclusiveArch: %{java_arches} noarch
- janino
ExclusiveArch: %{java_arches} noarch
- jansi
ExclusiveArch: %{java_arches}
- jansi-native
ExclusiveArch: %{java_arches}
- jansi1
ExclusiveArch: %{java_arches} noarch
- java-1.8.0-openjdk
ExclusiveArch: %{java_arches}
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- java-1.8.0-openjdk-portable
ExclusiveArch: %{java_arches}
- java-11-openjdk
ExclusiveArch: %{java_arches}
- java-11-openjdk-portable
ExclusiveArch: %{java_arches}
- java-17-openjdk
ExclusiveArch: %{java_arches}
- java-17-openjdk-portable
ExclusiveArch: %{java_arches}
- java-diff-utils
ExclusiveArch: %{java_arches} noarch
- java-dirq
ExclusiveArch: %{java_arches} noarch
- java-jd-decompiler
ExclusiveArch: %{java_arches} noarch
- java-latest-openjdk
ExclusiveArch: %{java_arches}
- java-latest-openjdk-portable
ExclusiveArch: %{java_arches}
- java-runtime-decompiler
ExclusiveArch: %{java_arches} noarch
- java-scrypt
ExclusiveArch: %{java_arches} noarch
- java_cup
ExclusiveArch: %{java_arches} noarch
- javacc
ExclusiveArch: %{java_arches} noarch
- javacc-maven-plugin
ExclusiveArch: %{java_arches} noarch
- javaewah
ExclusiveArch: %{java_arches} noarch
- javapackages-bootstrap
ExclusiveArch: %{java_arches}
- javaparser
ExclusiveArch: %{java_arches} noarch
- javapoet
ExclusiveArch: %{java_arches} noarch
- javassist
ExclusiveArch: %{java_arches} noarch
- jaxb
ExclusiveArch: %{java_arches} noarch
- jaxb-api
ExclusiveArch: %{java_arches} noarch
- jaxb-api2
ExclusiveArch: %{java_arches} noarch
- jaxb-dtd-parser
ExclusiveArch: %{java_arches} noarch
- jaxb-fi
ExclusiveArch: %{java_arches} noarch
- jaxb-istack-commons
ExclusiveArch: %{java_arches} noarch
- jaxb-stax-ex
ExclusiveArch: %{java_arches} noarch
- jaxen
ExclusiveArch: %{java_arches} noarch
- jboss-jaxrs-2.0-api
ExclusiveArch: %{java_arches} noarch
- jboss-logging
ExclusiveArch: %{java_arches} noarch
- jboss-logging-tools
ExclusiveArch: %{java_arches} noarch
- jboss-parent
ExclusiveArch: %{java_arches} noarch
- jchardet
ExclusiveArch: %{java_arches} noarch
- jcip-annotations
ExclusiveArch: %{java_arches} noarch
- jctools
ExclusiveArch: %{java_arches} noarch
- jcuber
ExclusiveArch: %{java_arches} noarch
- jdeparser
ExclusiveArch: %{java_arches} noarch
- jdepend
ExclusiveArch: %{java_arches} noarch
- jdependency
ExclusiveArch: %{java_arches} noarch
- jdom
ExclusiveArch: %{java_arches} noarch
- jdom2
ExclusiveArch: %{java_arches} noarch
- jericho-html
ExclusiveArch: %{java_arches} noarch
- jetty
ExclusiveArch: %{java_arches} noarch
- jflex
ExclusiveArch: %{java_arches} noarch
- jfreechart
ExclusiveArch: %{java_arches} noarch
- jgit
ExclusiveArch: %{java_arches} noarch
- jglobus
ExclusiveArch: %{java_arches} noarch
- jgoodies-common
ExclusiveArch: %{java_arches} noarch
- jgoodies-forms
ExclusiveArch: %{java_arches} noarch
- jgoodies-looks
ExclusiveArch: %{java_arches} noarch
- jigawatts
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- jline
ExclusiveArch: %{java_arches}
- jline2
ExclusiveArch: %{java_arches} noarch
- jmock
ExclusiveArch: %{java_arches} noarch
- jmol
ExclusiveArch: %{java_arches} noarch
- jna
ExclusiveArch: %{java_arches}
- jneuroml-core
ExclusiveArch: %{java_arches} noarch
- jni-inchi
ExclusiveArch: %{java_arches}
- jol
ExclusiveArch: %{java_arches} noarch
- jolokia-jvm-agent
ExclusiveArch: %{java_arches} noarch
- jopt-simple
ExclusiveArch: %{java_arches} noarch
- jorbis
ExclusiveArch: %{java_arches} noarch
- jowl
ExclusiveArch: %{nodejs_arches} noarch
- jpanoramamaker
ExclusiveArch: %{java_arches} noarch
- jsch
ExclusiveArch: %{java_arches} noarch
- jsch-agent-proxy
ExclusiveArch: %{java_arches} noarch
- json_simple
ExclusiveArch: %{java_arches} noarch
- jsr-305
ExclusiveArch: %{java_arches} noarch
- jss
ExclusiveArch: %{java_arches}
- jssc
ExclusiveArch: %{java_arches}
- jtidy
ExclusiveArch: %{java_arches} noarch
- julia
ExclusiveArch: x86_64
- junit
ExclusiveArch: %{java_arches} noarch
- junit5
ExclusiveArch: %{java_arches} noarch
- juniversalchardet
ExclusiveArch: %{java_arches} noarch
- jzlib
ExclusiveArch: %{java_arches} noarch
- kchmviewer
ExclusiveArch: %{qt5_qtwebengine_arches}
- kernel
ExclusiveArch: noarch x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- keylime-agent-rust
ExclusiveArch: %{rust_arches}
- keyring-ima-signer
ExclusiveArch: %{rust_arches}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-audiocd-kio
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kicad
ExclusiveArch: x86_64 aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- laf-plugin
ExclusiveArch: %{java_arches} noarch
- lazarus
ExclusiveArch: %{fpc_arches}
- lazpaint
ExclusiveArch: %{fpc_arches}
- ldapjdk
ExclusiveArch: %{java_arches} noarch
- ldc
ExclusiveArch: %{ldc_arches} ppc64le
- ldc1.30
ExclusiveArch: %{ldc_arches} ppc64le
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x x86_64
- libdispatch
ExclusiveArch: x86_64 aarch64 ppc64le
- libguestfs
ExclusiveArch: %{kernel_arches}
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libkgapi
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- libkrun
ExclusiveArch: x86_64 aarch64
- libkrunfw
ExclusiveArch: x86_64 aarch64
- libnxz
ExclusiveArch: ppc64le
- libocxl
ExclusiveArch: ppc64le
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libreoffice-TexMaths
ExclusiveArch: %{java_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunicode
ExclusiveArch: x86_64 aarch64
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvirt-java
ExclusiveArch: %{java_arches} noarch
- libvma
ExclusiveArch: x86_64 ppc64le ppc64 aarch64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzdnn
ExclusiveArch: s390x
- libzfcphbaapi
ExclusiveArch: s390 s390x
- libzpc
ExclusiveArch: s390x
- llhttp
ExclusiveArch: %{nodejs_arches}
- log4j
ExclusiveArch: %{java_arches} noarch
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- lucene
ExclusiveArch: %{java_arches} noarch
- lujavrite
ExclusiveArch: %{java_arches}
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- magicmirror
ExclusiveArch: %{nodejs_arches} noarch
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mariadb-java-client
ExclusiveArch: %{java_arches} noarch
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- matrix-synapse
ExclusiveArch: %{rust_arches}
- maui-mauikit
ExclusiveArch: %{ix86} s390x aarch64 x86_64
- maven
ExclusiveArch: %{java_arches} noarch
- maven-antrun-plugin
ExclusiveArch: %{java_arches} noarch
- maven-archetype
ExclusiveArch: %{java_arches} noarch
- maven-archiver
ExclusiveArch: %{java_arches} noarch
- maven-artifact-transfer
ExclusiveArch: %{java_arches} noarch
- maven-assembly-plugin
ExclusiveArch: %{java_arches} noarch
- maven-bundle-plugin
ExclusiveArch: %{java_arches} noarch
- maven-clean-plugin
ExclusiveArch: %{java_arches} noarch
- maven-common-artifact-filters
ExclusiveArch: %{java_arches} noarch
- maven-compiler-plugin
ExclusiveArch: %{java_arches} noarch
- maven-dependency-analyzer
ExclusiveArch: %{java_arches} noarch
- maven-dependency-plugin
ExclusiveArch: %{java_arches} noarch
- maven-dependency-tree
ExclusiveArch: %{java_arches} noarch
- maven-doxia
ExclusiveArch: %{java_arches} noarch
- maven-doxia-sitetools
ExclusiveArch: %{java_arches} noarch
- maven-enforcer
ExclusiveArch: %{java_arches} noarch
- maven-file-management
ExclusiveArch: %{java_arches} noarch
- maven-filtering
ExclusiveArch: %{java_arches} noarch
- maven-invoker
ExclusiveArch: %{java_arches} noarch
- maven-invoker-plugin
ExclusiveArch: %{java_arches} noarch
- maven-jar-plugin
ExclusiveArch: %{java_arches} noarch
- maven-mapping
ExclusiveArch: %{java_arches} noarch
- maven-native
ExclusiveArch: %{java_arches} noarch
- maven-parent
ExclusiveArch: %{java_arches} noarch
- maven-patch-plugin
ExclusiveArch: %{java_arches} noarch
- maven-plugin-testing
ExclusiveArch: %{java_arches} noarch
- maven-plugin-tools
ExclusiveArch: %{java_arches} noarch
- maven-remote-resources-plugin
ExclusiveArch: %{java_arches} noarch
- maven-reporting-api
ExclusiveArch: %{java_arches} noarch
- maven-reporting-impl
ExclusiveArch: %{java_arches} noarch
- maven-resolver
ExclusiveArch: %{java_arches} noarch
- maven-resources-plugin
ExclusiveArch: %{java_arches} noarch
- maven-script-interpreter
ExclusiveArch: %{java_arches} noarch
- maven-shade-plugin
ExclusiveArch: %{java_arches} noarch
- maven-shared-incremental
ExclusiveArch: %{java_arches} noarch
- maven-shared-io
ExclusiveArch: %{java_arches} noarch
- maven-shared-utils
ExclusiveArch: %{java_arches} noarch
- maven-source-plugin
ExclusiveArch: %{java_arches} noarch
- maven-surefire
ExclusiveArch: %{java_arches} noarch
- maven-verifier
ExclusiveArch: %{java_arches} noarch
- maven-verifier-plugin
ExclusiveArch: %{java_arches} noarch
- maven-wagon
ExclusiveArch: %{java_arches} noarch
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mcrouter
ExclusiveArch: x86_64 aarch64 ppc64le
- mecab-java
ExclusiveArch: %java_arches
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- memtest86+
ExclusiveArch: x86_64 %{ix86}
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64
- miglayout
ExclusiveArch: %{java_arches} noarch
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-libidn2
ExclusiveArch: %{ix86} x86_64 %{arm}
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- moby-engine
ExclusiveArch: %{golang_arches}
- mockito
ExclusiveArch: %{java_arches} noarch
- mod_mono
ExclusiveArch: %mono_arches
- modello
ExclusiveArch: %{java_arches} noarch
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- modulemaker-maven-plugin
ExclusiveArch: %{java_arches} noarch
- mojo-executor
ExclusiveArch: %{java_arches} noarch
- mojo-parent
ExclusiveArch: %{java_arches} noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64 %{arm}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- msr-tools
ExclusiveArch: %{ix86} x86_64
- munge-maven-plugin
ExclusiveArch: %{java_arches} noarch
- mxparser
ExclusiveArch: %{java_arches} noarch
- mysql-connector-java
ExclusiveArch: %{java_arches} noarch
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- naev
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- naga
ExclusiveArch: %{java_arches} noarch
- nant
ExclusiveArch: %mono_arches
- nativejit
ExclusiveArch: x86_64
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- nekohtml
ExclusiveArch: %{java_arches} noarch
- netavark
ExclusiveArch: %{golang_arches_future}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bash-language-server
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-less
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nodemon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs18
ExclusiveArch: %{nodejs_arches}
- nodejs20
ExclusiveArch: %{nodejs_arches}
- nom-tam-fits
ExclusiveArch: %{java_arches} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64 ppc64le
- objectweb-asm
ExclusiveArch: %{java_arches} noarch
- objenesis
ExclusiveArch: %{java_arches} noarch
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
ExclusiveArch: %{golang_arches_future}
- oidn
ExclusiveArch: x86_64
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- oneVPL
ExclusiveArch: x86_64
- oneVPL-intel-gpu
ExclusiveArch: x86_64
- oneapi-level-zero
ExclusiveArch: x86_64
- onednn
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- onedrive
ExclusiveArch: %{ldc_arches}
- ongres-scram
ExclusiveArch: %{java_arches} noarch
- ongres-stringprep
ExclusiveArch: %{java_arches} noarch
- opae
ExclusiveArch: x86_64
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64 aarch64
ExclusiveArch: %{ix86} x86_64 aarch64
ExclusiveArch: x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjdk-asmtools
ExclusiveArch: %{java_arches} noarch
- openjdk-asmtools7
ExclusiveArch: %{java_arches} noarch
- openjfx
ExclusiveArch: %{java_arches}
- openjfx8
ExclusiveArch: x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openms
ExclusiveArch: %{qt5_qtwebengine_arches}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openpgl
ExclusiveArch: aarch64 x86_64
- openssl-ibmca
ExclusiveArch: s390 s390x
- openstack-java-sdk
ExclusiveArch: %{java_arches} noarch
- opentest4j
ExclusiveArch: %{java_arches} noarch
- openvkl
ExclusiveArch: aarch64 x86_64
- optee_client
ExclusiveArch: aarch64
- options
ExclusiveArch: %{java_arches} noarch
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- osgi-annotation
ExclusiveArch: %{java_arches} noarch
- osgi-compendium
ExclusiveArch: %{java_arches} noarch
- osgi-core
ExclusiveArch: %{java_arches} noarch
- pacemaker
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 %{arm}
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- pageedit
ExclusiveArch: %{qt5_qtwebengine_arches}
- parserng
ExclusiveArch: %{java_arches} noarch
- pasdoc
ExclusiveArch: %{fpc_arches}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcfi
ExclusiveArch: %{java_arches} noarch
- pcm
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdbg
ExclusiveArch: ppc64le
- pdfbox
ExclusiveArch: %{java_arches} noarch
- pdfmod
ExclusiveArch: %mono_arches
- pdftk-java
ExclusiveArch: %{java_arches} noarch
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: x86_64
- picocli
ExclusiveArch: %{java_arches} noarch
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- plantuml
ExclusiveArch: %{java_arches} noarch
- plasma-dialer
ExclusiveArch: %{java_arches}
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- plexus-archiver
ExclusiveArch: %{java_arches} noarch
- plexus-build-api
ExclusiveArch: %{java_arches} noarch
- plexus-cipher
ExclusiveArch: %{java_arches} noarch
- plexus-classworlds
ExclusiveArch: %{java_arches} noarch
- plexus-compiler
ExclusiveArch: %{java_arches} noarch
- plexus-component-api
ExclusiveArch: %{java_arches} noarch
- plexus-components-pom
ExclusiveArch: %{java_arches} noarch
- plexus-containers
ExclusiveArch: %{java_arches} noarch
- plexus-i18n
ExclusiveArch: %{java_arches} noarch
- plexus-interpolation
ExclusiveArch: %{java_arches} noarch
- plexus-io
ExclusiveArch: %{java_arches} noarch
- plexus-languages
ExclusiveArch: %{java_arches} noarch
- plexus-pom
ExclusiveArch: %{java_arches} noarch
- plexus-resources
ExclusiveArch: %{java_arches} noarch
- plexus-sec-dispatcher
ExclusiveArch: %{java_arches} noarch
- plexus-utils
ExclusiveArch: %{java_arches} noarch
- plexus-velocity
ExclusiveArch: %{java_arches} noarch
- podman
ExclusiveArch: %{golang_arches_future}
ExclusiveArch: aarch64 ppc64le s390x x86_64
- pomchecker
ExclusiveArch: %{java_arches} noarch
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- postgresql-jdbc
ExclusiveArch: %{java_arches} noarch
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- procyon
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
- proguard
ExclusiveArch: %{java_arches} noarch
- prometheus-jmx-exporter
ExclusiveArch: %{java_arches} noarch
- prometheus-simpleclient-java
ExclusiveArch: %{java_arches} noarch
- proxygen
ExclusiveArch: x86_64 aarch64 ppc64le
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: x86_64
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-ast-monitor
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- python-cryptography
ExclusiveArch: %{rust_arches}
- python-damo
ExclusiveArch: x86_64 aarch64 ppc64le s390x noarch
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-javaobj
ExclusiveArch: %{java_arches} noarch
- python-jep
ExclusiveArch: %{java_arches}
- python-jupyter-polymake
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-pyqt6-webengine
ExclusiveArch: aarch64 x86_64
- python-setuptools-rust
ExclusiveArch: %{rust_arches}
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qatengine
ExclusiveArch: x86_64
- qatzip
ExclusiveArch: x86_64
- qbe
ExclusiveArch: x86_64 aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qdox
ExclusiveArch: %{java_arches} noarch
- qemu-sanity-check
ExclusiveArch: %{kernel_arches}
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt6-qtwebengine
ExclusiveArch: aarch64 x86_64
- qt6-qtwebview
ExclusiveArch: aarch64 x86_64
- quantum-espresso
ExclusiveArch: x86_64 %{ix86} aarch64 %{power64}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rEFInd
ExclusiveArch: %{efi}
- rachota
ExclusiveArch: %{java_arches} noarch
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- reflections
ExclusiveArch: %{java_arches} noarch
- reg
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- regexp
ExclusiveArch: %{java_arches} noarch
- replacer
ExclusiveArch: %{java_arches} noarch
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- rescene
ExclusiveArch: %{mono_arches}
- resteasy
ExclusiveArch: %{java_arches} noarch
- restool
ExclusiveArch: aarch64
- restsharp
ExclusiveArch: %{mono_arches}
- retsnoop
ExclusiveArch: %{rust_arches}
- rhino
ExclusiveArch: %{java_arches} noarch
- river
ExclusiveArch: %{zig_arches}
- rkcommon
ExclusiveArch: x86_64 aarch64
- rocclr
ExclusiveArch: x86_64 aarch64 ppc64le
- rocm-compilersupport
ExclusiveArch: x86_64 aarch64 ppc64le
- rocm-device-libs
ExclusiveArch: x86_64 aarch64 ppc64le
- rocm-runtime
ExclusiveArch: x86_64 aarch64 ppc64le
- rocminfo
ExclusiveArch: x86_64 aarch64 ppc64le
- rocprim
ExclusiveArch: x86_64
- rocrand
ExclusiveArch: x86_64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rr
ExclusiveArch: %{ix86} x86_64 aarch64
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rstudio
ExclusiveArch: %{java_arches}
- rsyntaxtextarea
ExclusiveArch: %{java_arches} noarch
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{golang_arches_future}
- rundoc
ExclusiveArch: %{java_arches} noarch
- rust
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-aparato
ExclusiveArch: %{rust_arches}
- rust-argmax
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-askama_derive
ExclusiveArch: %{rust_arches}
- rust-askama_escape
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-async-std
ExclusiveArch: %{rust_arches}
- rust-asyncgit
ExclusiveArch: %{rust_arches}
- rust-az
ExclusiveArch: %{rust_arches}
- rust-base-x
ExclusiveArch: %{rust_arches}
- rust-binascii
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bootupd
ExclusiveArch: x86_64 aarch64
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-btrd
ExclusiveArch: %{rust_arches}
- rust-bugreport
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-capnp-futures
ExclusiveArch: %{rust_arches}
- rust-capnp-rpc
ExclusiveArch: %{rust_arches}
- rust-cascade
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cdylib-link-lines
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-ciborium
ExclusiveArch: %{rust_arches}
- rust-ciborium-io
ExclusiveArch: %{rust_arches}
- rust-ciborium-ll
ExclusiveArch: %{rust_arches}
- rust-cint
ExclusiveArch: %{rust_arches}
- rust-clap_generate
ExclusiveArch: %{rust_arches}
- rust-clap_generate_fig
ExclusiveArch: %{rust_arches}
- rust-combine
ExclusiveArch: %{rust_arches}
- rust-comfy-table
ExclusiveArch: %{rust_arches}
- rust-compress-tools
ExclusiveArch: %{rust_arches}
- rust-const-oid0.6
ExclusiveArch: %{rust_arches}
- rust-const_fn
ExclusiveArch: %{rust_arches}
- rust-cookie-factory
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copydeps
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-cryptoki
ExclusiveArch: %{rust_arches}
- rust-cryptoki-sys
ExclusiveArch: %{rust_arches}
- rust-csscolorparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-ctr
ExclusiveArch: %{rust_arches}
- rust-dashmap4
ExclusiveArch: %{rust_arches}
- rust-data-encoding-macro
ExclusiveArch: %{rust_arches}
- rust-data-encoding-macro-internal
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-deflate0.8
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-des
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-directories3
ExclusiveArch: %{rust_arches}
- rust-downcast
ExclusiveArch: %{rust_arches}
- rust-drg
ExclusiveArch: %{rust_arches}
- rust-dua-cli
ExclusiveArch: %{rust_arches}
- rust-dummy
ExclusiveArch: %{rust_arches}
- rust-edit
ExclusiveArch: %{rust_arches}
- rust-enumset
ExclusiveArch: %{rust_arches}
- rust-enumset_derive
ExclusiveArch: %{rust_arches}
- rust-escape_string
ExclusiveArch: %{rust_arches}
- rust-escargot
ExclusiveArch: %{rust_arches}
- rust-esphome
ExclusiveArch: %{rust_arches}
- rust-event-listener
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-fedora
ExclusiveArch: %{rust_arches}
- rust-femme
ExclusiveArch: %{rust_arches}
- rust-filetreelist
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-firestorm
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-fixedbitset0.2
ExclusiveArch: %{rust_arches}
- rust-flume
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-format-bytes
ExclusiveArch: %{rust_arches}
- rust-format-bytes-macros
ExclusiveArch: %{rust_arches}
- rust-fscommon
ExclusiveArch: %{rust_arches}
- rust-fslock
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-gag
ExclusiveArch: %{rust_arches}
- rust-getch
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-gh-emoji
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git-delta
ExclusiveArch: %{rust_arches}
- rust-git2_0.13
ExclusiveArch: %{rust_arches}
- rust-gitui
ExclusiveArch: %{rust_arches}
- rust-glam
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-hamming
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown0.11
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hidapi
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-humantime-serde
ExclusiveArch: %{rust_arches}
- rust-hyperlocal
ExclusiveArch: %{rust_arches}
- rust-ifcfg-devname
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-image0.23
ExclusiveArch: %{rust_arches}
- rust-impls
ExclusiveArch: %{rust_arches}
- rust-indenter
ExclusiveArch: %{rust_arches}
- rust-inferno
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inlinable_string
ExclusiveArch: %{rust_arches}
- rust-inout
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-inventory0.1
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-ipnetwork0.17
ExclusiveArch: %{rust_arches}
- rust-is_ci
ExclusiveArch: %{rust_arches}
- rust-is_executable
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-josekit
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder0.1
ExclusiveArch: %{rust_arches}
- rust-json5
ExclusiveArch: %{rust_arches}
- rust-k9
ExclusiveArch: %{rust_arches}
- rust-konst
ExclusiveArch: %{rust_arches}
- rust-konst_macro_rules
ExclusiveArch: %{rust_arches}
- rust-konst_proc_macros
ExclusiveArch: %{rust_arches}
- rust-krunvm
ExclusiveArch: x86_64 aarch64
- rust-kstring
ExclusiveArch: %{rust_arches}
- rust-kvm-bindings
ExclusiveArch: %{rust_arches}
- rust-kvm-ioctls
ExclusiveArch: x86_64 aarch64
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lebe
ExclusiveArch: %{rust_arches}
- rust-lev_distance
ExclusiveArch: %{rust_arches}
- rust-libseccomp-sys
ExclusiveArch: %{rust_arches}
- rust-libslirp
ExclusiveArch: %{rust_arches}
- rust-libslirp-sys
ExclusiveArch: %{rust_arches}
- rust-libsodium-sys
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-local-channel
ExclusiveArch: %{rust_arches}
- rust-local-encoding
ExclusiveArch: %{rust_arches}
- rust-local-waker
ExclusiveArch: %{rust_arches}
- rust-local_ipaddress
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-madvr_parse
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-memcached-rs
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-micro-timer
ExclusiveArch: %{rust_arches}
- rust-micro-timer-macros
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mockall_double
ExclusiveArch: %{rust_arches}
- rust-nanorand
ExclusiveArch: %{rust_arches}
- rust-navi
ExclusiveArch: %{rust_arches}
- rust-netstat2
ExclusiveArch: %{rust_arches}
- rust-nix0.22
ExclusiveArch: %{rust_arches}
- rust-num-bigint-dig
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-oid
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-openat-ext
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssl-kdf
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-ordered-float2
ExclusiveArch: %{rust_arches}
- rust-os-release
ExclusiveArch: %{rust_arches}
- rust-os_display
ExclusiveArch: %{rust_arches}
- rust-os_type
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot0.11
ExclusiveArch: %{rust_arches}
- rust-passwd
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pathsearch
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-petgraph0.5
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf_macros
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-picky-asn1
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-der
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-x509
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pkcs1
ExclusiveArch: %{rust_arches}
- rust-pq-sys
ExclusiveArch: %{rust_arches}
- rust-pretty-bytes
ExclusiveArch: %{rust_arches}
- rust-pretty-hex
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-primal-bit
ExclusiveArch: %{rust_arches}
- rust-primal-check
ExclusiveArch: %{rust_arches}
- rust-primal-estimate
ExclusiveArch: %{rust_arches}
- rust-procfs0.9
ExclusiveArch: %{rust_arches}
- rust-procs
ExclusiveArch: %{rust_arches}
- rust-prost
ExclusiveArch: %{rust_arches}
- rust-prost-derive
ExclusiveArch: %{rust_arches}
- rust-prost-derive0.8
ExclusiveArch: %{rust_arches}
- rust-prost0.8
ExclusiveArch: %{rust_arches}
- rust-psa-crypto
ExclusiveArch: %{rust_arches}
- rust-psa-crypto-sys
ExclusiveArch: %{rust_arches}
- rust-psl-types
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-pwd
ExclusiveArch: %{rust_arches}
- rust-python-launcher
ExclusiveArch: %{rust_arches}
- rust-quick-xml0.22
ExclusiveArch: %{rust_arches}
- rust-r2d2
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_distr
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rav1e
ExclusiveArch: %{rust_arches}
- rust-rd-agent
ExclusiveArch: %{rust_arches}
- rust-rd-agent-intf
ExclusiveArch: %{rust_arches}
- rust-rd-hashd
ExclusiveArch: %{rust_arches}
- rust-rd-hashd-intf
ExclusiveArch: %{rust_arches}
- rust-rd-util
ExclusiveArch: %{rust_arches}
- rust-resctl-bench
ExclusiveArch: %{rust_arches}
- rust-resctl-bench-intf
ExclusiveArch: %{rust_arches}
- rust-resctl-demo
ExclusiveArch: %{rust_arches}
- rust-retry
ExclusiveArch: %{rust_arches}
- rust-rle-decode-fast
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmpv
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rustcat
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-schemafy_core
ExclusiveArch: %{rust_arches}
- rust-schemafy_lib
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-sequoia-sqv
ExclusiveArch: %{rust_arches}
- rust-serde-big-array
ExclusiveArch: %{rust_arches}
- rust-serde_qs
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_with
ExclusiveArch: %{rust_arches}
- rust-serde_with_macros
ExclusiveArch: %{rust_arches}
- rust-serde_yaml0.8
ExclusiveArch: %{rust_arches}
- rust-serial_test0.5
ExclusiveArch: %{rust_arches}
- rust-serial_test_derive0.5
ExclusiveArch: %{rust_arches}
- rust-sev
ExclusiveArch: x86_64
- rust-sevctl
ExclusiveArch: x86_64
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sharded-slab
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shellexpand
ExclusiveArch: %{rust_arches}
- rust-signal-hook-mio
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-similar-asserts
ExclusiveArch: %{rust_arches}
- rust-simple_asn1
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-sinit
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-spin0.5
ExclusiveArch: %{rust_arches}
- rust-ssh-key-dir
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-statrs
ExclusiveArch: %{rust_arches}
- rust-strict
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum0.21
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-strum_macros0.21
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-sval_json
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-syntect4
ExclusiveArch: %{rust_arches}
- rust-sysinfo0.19
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-temp_testdir
ExclusiveArch: %{rust_arches}
- rust-temptree
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termbg
ExclusiveArch: %{rust_arches}
- rust-textwrap0.14
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-tiff0.6
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinyvec
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio-compat
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.6
ExclusiveArch: %{rust_arches}
- rust-totp-lite
ExclusiveArch: %{rust_arches}
- rust-tower-layer
ExclusiveArch: %{rust_arches}
- rust-tower-service
ExclusiveArch: %{rust_arches}
- rust-tpm2-policy
ExclusiveArch: %{rust_arches}
- rust-tracing-log
ExclusiveArch: %{rust_arches}
- rust-trash
ExclusiveArch: %{rust_arches}
- rust-tree-sitter
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-cli
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-config
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-highlight
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-loader
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-tags
ExclusiveArch: %{rust_arches}
- rust-ttf-parser0.12
ExclusiveArch: %{rust_arches}
- rust-tui-react
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-typed-arena1
ExclusiveArch: %{rust_arches}
- rust-tzfile
ExclusiveArch: %{rust_arches}
- rust-ubyte
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-uefi-run
ExclusiveArch: %{rust_arches}
- rust-unicode-linebreak
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-uriparse
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-utf8-width
ExclusiveArch: %{rust_arches}
- rust-uucore
ExclusiveArch: %{rust_arches}
- rust-uucore_procs
ExclusiveArch: %{rust_arches}
- rust-uuid0.8
ExclusiveArch: %{rust_arches}
- rust-v_frame
ExclusiveArch: %{rust_arches}
- rust-value-bag
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-vhost-user-backend
ExclusiveArch: %{rust_arches}
- rust-virtio-bindings
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmm-sys-util
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vtparse
ExclusiveArch: %{rust_arches}
- rust-web-ext-native-messaging
ExclusiveArch: %{rust_arches}
- rust-webbrowser
ExclusiveArch: %{rust_arches}
- rust-weezl
ExclusiveArch: %{rust_arches}
- rust-wezterm-color-types
ExclusiveArch: %{rust_arches}
- rust-wezterm-dynamic
ExclusiveArch: %{rust_arches}
- rust-wezterm-dynamic-derive
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-xkbcommon
ExclusiveArch: %{rust_arches}
- rust-xxhash-c-sys
ExclusiveArch: %{rust_arches}
- rust-xxhash-rust
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-yansi
ExclusiveArch: %{rust_arches}
- rust-z85
ExclusiveArch: %{rust_arches}
- rust-zbus1
ExclusiveArch: %{rust_arches}
- rust-zbus_macros1
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zvariant2
ExclusiveArch: %{rust_arches}
- rust-zvariant_derive2
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- sagemath
ExclusiveArch: aarch64 x86_64
- sat4j
ExclusiveArch: %{java_arches} noarch
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sblim-cim-client
ExclusiveArch: %{java_arches} noarch
- sblim-cim-client2
ExclusiveArch: %{java_arches} noarch
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- scala
ExclusiveArch: %{java_arches} noarch
- scalacheck
ExclusiveArch: %{java_arches} noarch
- scannotation
ExclusiveArch: %{java_arches} noarch
- sdljava
ExclusiveArch: %{java_arches}
- sdrangel
ExclusiveArch: %{qt5_qtwebengine_arches}
- sdsl-lite
ExclusiveArch: %{power64} x86_64 aarch64
- seabios
ExclusiveArch: x86_64
- seadrive-gui
ExclusiveArch: %{qt5_qtwebengine_arches}
- seafile-client
ExclusiveArch: %{qt5_qtwebengine_arches}
- seamonkey
ExclusiveArch: x86_64
- seqan3
ExclusiveArch: %{power64} x86_64 aarch64
- sequence-library
ExclusiveArch: %{java_arches} noarch
- serp
ExclusiveArch: %{java_arches} noarch
- servicelog
ExclusiveArch: ppc %{power64}
- shaman
ExclusiveArch: %{java_arches} noarch
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- singularity-ce
ExclusiveArch: %{go_arches}
- sisu
ExclusiveArch: %{java_arches} noarch
- sisu-mojos
ExclusiveArch: %{java_arches} noarch
- skopeo
ExclusiveArch: %{golang_arches_future}
- skychart
ExclusiveArch: %{fpc_arches}
- slf4j
ExclusiveArch: %{java_arches} noarch
- slirp4netns
ExclusiveArch: %{golang_arches_future}
- snakeyaml
ExclusiveArch: %{java_arches} noarch
- snapd
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm} aarch64 ppc64le s390x}
- snip
ExclusiveArch: %{java_arches} noarch
- softnet-stat
ExclusiveArch: %{rust_arches}
- soup-sharp
ExclusiveArch: %{mono_arches}
- spacebar
ExclusiveArch: %{java_arches}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spec-version-maven-plugin
ExclusiveArch: %{java_arches} noarch
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- spice-parent
ExclusiveArch: %{java_arches} noarch
- springlobby
ExclusiveArch: %{ix86} x86_64
- sqljet
ExclusiveArch: %{java_arches} noarch
- squeekboard
ExclusiveArch: %{rust_arches}
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- stats-collect
ExclusiveArch: %{ix86} x86_64 noarch
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
ExclusiveArch: %{rust_arches}
ExclusiveArch: %{rust_arches}
- string-template-maven-plugin
ExclusiveArch: %{java_arches} noarch
- stringtemplate
ExclusiveArch: %{java_arches} noarch
- stringtemplate4
ExclusiveArch: %{java_arches} noarch
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- subscription-manager-cockpit
ExclusiveArch: %{nodejs_arches} noarch
- supercollider
ExclusiveArch: %{qt5_qtwebengine_arches}
- supermin
ExclusiveArch: %{kernel_arches}
- svnkit
ExclusiveArch: %{java_arches} noarch
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- swing-layout
ExclusiveArch: %{java_arches} noarch
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64le s390x
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- system-rules
ExclusiveArch: %{java_arches} noarch
- system76-keyboard-configurator
ExclusiveArch: %{rust_arches}
- systemd-boot
ExclusiveArch: %efi
- t-digest
ExclusiveArch: %{java_arches} noarch
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tagsoup
ExclusiveArch: %{java_arches} noarch
- tarantool
ExclusiveArch: %{ix86} x86_64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64 aarch64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- ternimal
ExclusiveArch: %{rust_arches}
- test-interface
ExclusiveArch: %{java_arches} noarch
- testcloud
ExclusiveArch: %{kernel_arches} noarch
- testng
ExclusiveArch: %{java_arches} noarch
- texlive
ExclusiveArch: %{java_arches} noarch
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- tomcat
ExclusiveArch: %{java_arches} noarch
- tomcat-native
ExclusiveArch: %{java_arches}
- tomcat-taglibs-parent
ExclusiveArch: %{java_arches} noarch
- tomcatjss
ExclusiveArch: %{java_arches} noarch
- torbrowser-launcher
ExclusiveArch: %{ix86} x86_64
- treelayout
ExclusiveArch: %{java_arches} noarch
- trilead-ssh2
ExclusiveArch: %{java_arches} noarch
- truth
ExclusiveArch: %{java_arches} noarch
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- typescript
ExclusiveArch: %{nodejs_arches} noarch
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- umr
ExclusiveArch: x86_64 aarch64 ppc64le
- unetbootin
ExclusiveArch: %{ix86} x86_64
- univocity-parsers
ExclusiveArch: %{java_arches} noarch
- ursa-major
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- usd
ExclusiveArch: aarch64 x86_64
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- vakzination
ExclusiveArch: %{java_arches}
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vecmath1.2
ExclusiveArch: %{java_arches} noarch
- velocity
ExclusiveArch: %{java_arches} noarch
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- vim-syntastic
ExclusiveArch: %{java_arches} noarch
- virt-p2v
ExclusiveArch: x86_64
- virt-v2v
ExclusiveArch: x86_64
- virtiofsd
ExclusiveArch: %{rust_arches}
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- voms-api-java
ExclusiveArch: %{java_arches} noarch
- voms-clients-java
ExclusiveArch: %{java_arches} noarch
- vrq
ExclusiveArch: %{ix86} x86_64
- wangle
ExclusiveArch: x86_64 aarch64 ppc64le
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- wasmedge
ExclusiveArch: x86_64 aarch64
- watchman
ExclusiveArch: x86_64 aarch64 ppc64le
- wdt
ExclusiveArch: x86_64 aarch64 ppc64le
- webkit2-sharp
ExclusiveArch: %mono_arches
- weld-parent
ExclusiveArch: %{java_arches} noarch
- why3
ExclusiveArch: %{java_arches}
- wine
ExclusiveArch: %{ix86} x86_64 aarch64
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- ws-commons-util
ExclusiveArch: %{java_arches} noarch
- wsdl4j
ExclusiveArch: %{java_arches} noarch
- wult
ExclusiveArch: x86_64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- x86-simd-sort
ExclusiveArch: x86_64
- xalan-j2
ExclusiveArch: %{java_arches} noarch
- xbean
ExclusiveArch: %{java_arches} noarch
- xbyak
ExclusiveArch: x86_64
- xbyak_aarch64
ExclusiveArch: aarch64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: x86_64 aarch64
- xerces-j2
ExclusiveArch: %{java_arches} noarch
- xgap
ExclusiveArch: %{gap_arches}
- xml-commons-apis
ExclusiveArch: %{java_arches} noarch
- xml-commons-resolver
ExclusiveArch: %{java_arches} noarch
- xml-maven-plugin
ExclusiveArch: %{java_arches} noarch
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xmlgraphics-commons
ExclusiveArch: %{java_arches} noarch
- xmlpull
ExclusiveArch: %{java_arches} noarch
- xmlstreambuffer
ExclusiveArch: %{java_arches} noarch
- xmlunit
ExclusiveArch: %{java_arches} noarch
- xmpcore
ExclusiveArch: %{java_arches} noarch
- xmvn
ExclusiveArch: %{java_arches} noarch
- xmvn-connector-ivy
ExclusiveArch: %{java_arches} noarch
- xmvn-generator
ExclusiveArch: %{java_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- xstream
ExclusiveArch: %{java_arches} noarch
- xz-java
ExclusiveArch: %{java_arches} noarch
- yarnpkg
ExclusiveArch: %{nodejs_arches} noarch
- zcfan
ExclusiveArch: x86_64
- zeal
ExclusiveArch: aarch64 x86_64
- zenon
ExclusiveArch: %{java_arches}
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zig
ExclusiveArch: %{zig_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ng
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- zola
ExclusiveArch: %{rust_arches}
10 months, 1 week
[Report] Packages Restricting Arches
by root
Package no longer excluding arches (15)
==================================
- flute
- i3status-rs
- jcommon
- jcommon-serializer
- libbase
- libfonts
- libformula
- liblayout
- libloader
- librepository
- libserializer
- pentaho-libxml
- pentaho-reporting-flow-engine
- sac
- writer2latex
List of packages currently excluding arches (1375)
===========================================
- 0ad
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- 90-Second-Portraits
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- BareBonesBrowserLaunch
ExclusiveArch: %{java_arches} noarch
- CFR
ExclusiveArch: %{java_arches} noarch
- CardManager
ExclusiveArch: %{java_arches} noarch
- GAPDoc
ExclusiveArch: %{gap_arches} noarch
- GoldenCheetah
ExclusiveArch: %{qt5_qtwebengine_arches}
- GtkAda
ExclusiveArch: %{GPRbuild_arches}
- GtkAda3
ExclusiveArch: %{GPRbuild_arches}
- IPAddress
ExclusiveArch: %{java_arches} noarch
- Mars
ExclusiveArch: %{java_arches} noarch
- OpenColorIO
ExclusiveArch: x86_64 ppc64le
- OpenImageIO
ExclusiveArch: x86_64 ppc64le
- OpenMolcas
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- OpenStego
ExclusiveArch: %{java_arches} noarch
- PragmARC
ExclusiveArch: %{GPRbuild_arches}
- R-V8
ExclusiveArch: %{nodejs_arches}
- R-rJava
ExclusiveArch: %{java_arches}
- RdRand
ExclusiveArch: %{ix86} x86_64
- RediSearch
ExclusiveArch: x86_64
- SLOF
ExclusiveArch: ppc64le
- YafaRay
ExclusiveArch: %{ix86} x86_64
- aardvark-dns
ExclusiveArch: %{golang_arches_future}
- accel-config
ExclusiveArch: %{ix86} x86_64
- acpid
ExclusiveArch: ia64 x86_64 %{ix86} %{arm} aarch64
- ahven
ExclusiveArch: %{GPRbuild_arches}
- algobox
ExclusiveArch: %{qt5_qtwebengine_arches}
- american-fuzzy-lop
ExclusiveArch: %{ix86} x86_64 s390x
- anet
ExclusiveArch: %{GPRbuild_arches}
- ant
ExclusiveArch: %{java_arches} noarch
- ant-antunit
ExclusiveArch: %{java_arches} noarch
- antlr
ExclusiveArch: %{java_arches}
- antlr-maven-plugin
ExclusiveArch: %{java_arches} noarch
- antlr3
ExclusiveArch: %{java_arches}
- antlr32
ExclusiveArch: %{java_arches} noarch
- antlr4-project
ExclusiveArch: %{java_arches}
- antlrworks
ExclusiveArch: %{java_arches} noarch
- aopalliance
ExclusiveArch: %{java_arches} noarch
- apache-commons-beanutils
ExclusiveArch: %{java_arches} noarch
- apache-commons-cli
ExclusiveArch: %{java_arches} noarch
- apache-commons-codec
ExclusiveArch: %{java_arches} noarch
- apache-commons-collections
ExclusiveArch: %{java_arches} noarch
- apache-commons-collections4
ExclusiveArch: %{java_arches} noarch
- apache-commons-compress
ExclusiveArch: %{java_arches} noarch
- apache-commons-digester
ExclusiveArch: %{java_arches} noarch
- apache-commons-exec
ExclusiveArch: %{java_arches} noarch
- apache-commons-fileupload
ExclusiveArch: %{java_arches} noarch
- apache-commons-io
ExclusiveArch: %{java_arches} noarch
- apache-commons-jxpath
ExclusiveArch: %{java_arches} noarch
- apache-commons-lang3
ExclusiveArch: %{java_arches} noarch
- apache-commons-logging
ExclusiveArch: %{java_arches} noarch
- apache-commons-math
ExclusiveArch: %{java_arches} noarch
- apache-commons-modeler
ExclusiveArch: %{java_arches} noarch
- apache-commons-net
ExclusiveArch: %{java_arches} noarch
- apache-commons-parent
ExclusiveArch: %{java_arches} noarch
- apache-commons-pool
ExclusiveArch: %{java_arches} noarch
- apache-ivy
ExclusiveArch: %{java_arches} noarch
- apache-parent
ExclusiveArch: %{java_arches} noarch
- apache-resource-bundles
ExclusiveArch: %{java_arches} noarch
- apache-sshd
ExclusiveArch: %{java_arches} noarch
- apiguardian
ExclusiveArch: %{java_arches} noarch
- apmd
ExclusiveArch: %{ix86}
- appstream-generator
ExclusiveArch: %{ldc_arches}
- aqute-bnd
ExclusiveArch: %{java_arches} noarch
- args4j
ExclusiveArch: %{java_arches} noarch
- arianna
ExclusiveArch: %{qt5_qtwebengine_arches}
- arm-trusted-firmware
ExclusiveArch: aarch64
- assertj-core
ExclusiveArch: %{java_arches} noarch
- atinject
ExclusiveArch: %{java_arches} noarch
- aunit
ExclusiveArch: %GPRbuild_arches
- auto
ExclusiveArch: %{java_arches} noarch
- avgtime
ExclusiveArch: %{ldc_arches}
- aws
ExclusiveArch: %GPRbuild_arches
- azure-cli
ExclusiveArch: %{java_arches} noarch
- batik
ExclusiveArch: %{java_arches} noarch
- bcal
ExclusiveArch: x86_64 aarch64 ia64 ppc64 ppc64le s390x
- bcc
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
- bcel
ExclusiveArch: %{java_arches} noarch
- bcm283x-firmware
ExclusiveArch: aarch64
- beansbinding
ExclusiveArch: %{java_arches} noarch
- belle-sip
ExclusiveArch: %{java_arches}
- berusky2
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{mips}
- beust-jcommander
ExclusiveArch: %{java_arches} noarch
- bibletime
ExclusiveArch: %{java_arches}
- biosdevname
ExclusiveArch: %{ix86} x86_64
- bless
ExclusiveArch: %mono_arches
- bodhi-server
ExclusiveArch: %{golang_arches_future}
- bolzplatz2006
ExclusiveArch: %{java_arches}
- bouncycastle
ExclusiveArch: %{java_arches} noarch
- bpftrace
ExclusiveArch: x86_64 %{power64} aarch64 s390x
- brazil
ExclusiveArch: %{java_arches} noarch
- bsf
ExclusiveArch: %{java_arches} noarch
- bsh
ExclusiveArch: %{java_arches} noarch
- build-helper-maven-plugin
ExclusiveArch: %{java_arches} noarch
- buildah
ExclusiveArch: %{golang_arches_future}
- byte-buddy
ExclusiveArch: %{java_arches} noarch
- byteman
ExclusiveArch: %{java_arches} noarch
- cachelib
ExclusiveArch: x86_64 aarch64 ppc64le
- calamares
ExclusiveArch: %{ix86} x86_64 aarch64
- calibre
ExclusiveArch: aarch64 x86_64
- cambozola
ExclusiveArch: %{java_arches} noarch
- canl-java
ExclusiveArch: %{java_arches} noarch
- catatonit
ExclusiveArch: aarch64 ppc64le s390x x86_64
ExclusiveArch: %{golang_arches_future}
- ccdciel
ExclusiveArch: %{fpc_arches}
- cdcollect
ExclusiveArch: %{mono_arches}
- cdi-api
ExclusiveArch: %{java_arches} noarch
- ceph
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- cglib
ExclusiveArch: %{java_arches} noarch
- chromium
ExclusiveArch: x86_64
ExclusiveArch: x86_64 aarch64
ExclusiveArch: x86_64 aarch64
- cjdns
ExclusiveArch: %{nodejs_arches}
- classloader-leak-test-framework
ExclusiveArch: %{java_arches} noarch
- classpathless-compiler
ExclusiveArch: %{java_arches} noarch
- clevis-pin-tpm2
ExclusiveArch: %{rust_arches}
- clojure
ExclusiveArch: %{java_arches} noarch
- clojure-core-specs-alpha
ExclusiveArch: %{java_arches} noarch
- clojure-maven-plugin
ExclusiveArch: %{java_arches} noarch
- clojure-spec-alpha
ExclusiveArch: %{java_arches} noarch
- cmospwd
ExclusiveArch: %{ix86} x86_64
- cmrt
ExclusiveArch: %{ix86} x86_64 ia64
- codehaus-parent
ExclusiveArch: %{java_arches} noarch
- colorful
ExclusiveArch: %{fpc_arches}
- colossus
ExclusiveArch: %{java_arches} noarch
- conmon
ExclusiveArch: %{golang_arches_future}
- console-image-viewer
ExclusiveArch: %{java_arches} noarch
- containernetworking-plugins
ExclusiveArch: %{golang_arches}
- coq
ExclusiveArch: %{java_arches}
- cortado
ExclusiveArch: %{java_arches} noarch
- cpu-x
ExclusiveArch: i686 x86_64
- cpufetch
ExclusiveArch: %{arm} aarch64 x86_64 ppc ppc64 ppc64le
- cpuid
ExclusiveArch: %{ix86} x86_64
- cqrlog
ExclusiveArch: %{fpc_arches}
- crash
ExclusiveArch: %{ix86} ia64 x86_64 ppc ppc64 s390 s390x %{arm} aarch64 ppc64le
- crash-gcore-command
ExclusiveArch: aarch64 ppc64le x86_64
- crash-trace-command
ExclusiveArch: aarch64 ppc64le s390x x86_64
- credentials-fetcher
ExclusiveArch: x86_64 aarch64 s390x
- cri-o
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- cri-tools
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- criu
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- crun
ExclusiveArch: %{golang_arches_future}
- cryptlib
ExclusiveArch: x86_64 aarch64 ppc64le
- crypto-policies
ExclusiveArch: %{java_arches} noarch
- cryptobone
ExclusiveArch: x86_64 ppc64le aarch64
- csslint
ExclusiveArch: %{nodejs_arches} noarch
- cvc4
ExclusiveArch: %{java_arches}
- daq
ExclusiveArch: x86_64 aarch64
- dbus-sharp
ExclusiveArch: %mono_arches
- dbus-sharp-glib
ExclusiveArch: %mono_arches
- decentxml
ExclusiveArch: %{java_arches} noarch
- deepin-daemon
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- deepin-desktop-schemas
ExclusiveArch: %{go_arches}
- directory-maven-plugin
ExclusiveArch: %{java_arches} noarch
- dirgra
ExclusiveArch: %{java_arches} noarch
- disruptor
ExclusiveArch: %{java_arches} noarch
- ditaa
ExclusiveArch: %{java_arches} noarch
- dlm
ExclusiveArch: i686 x86_64
- dmidecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- dmtcp
ExclusiveArch: x86_64
- docker-distribution
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- dogtag-pki
ExclusiveArch: %{java_arches}
- dolphin-emu
ExclusiveArch: x86_64 aarch64
- dom4j
ExclusiveArch: %{java_arches} noarch
- dotnet6.0
ExclusiveArch: aarch64 x86_64 s390x
ExclusiveArch: x86_64
- dotnet7.0
ExclusiveArch: aarch64 ppc64le s390x x86_64
ExclusiveArch: x86_64
- doublecmd
ExclusiveArch: %{ix86} x86_64
- dpdk
ExclusiveArch: x86_64 i686 aarch64 ppc64le
- dub
ExclusiveArch: %{ldc_arches}
- dxvk-native
ExclusiveArch: %{ix86} x86_64
- dyninst
ExclusiveArch: %{ix86} x86_64 ppc64le aarch64
- e3
ExclusiveArch: %{ix86} x86_64
- easymock
ExclusiveArch: %{java_arches} noarch
- ecj
ExclusiveArch: %{java_arches} noarch
- eclipse-swt
ExclusiveArch: %{java_arches}
- ed25519-java
ExclusiveArch: %{java_arches} noarch
- edk2
ExclusiveArch: x86_64 aarch64
- efibootmgr
ExclusiveArch: %{efi}
- efifs
ExclusiveArch: %{efi}
- efitools
ExclusiveArch: %{efi}
- efivar
ExclusiveArch: %{efi}
- elk
ExclusiveArch: x86_64 %{ix86}
ExclusiveArch: x86_64 %{ix86} aarch64 %{arm} %{power64}
- emacs-slime
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- embree
ExclusiveArch: aarch64 x86_64
- embree3
ExclusiveArch: aarch64 x86_64
- enjarify
ExclusiveArch: %{java_arches} noarch
- enki
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- envytools
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- eric
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- erlang-corba
ExclusiveArch: %{java_arches}
- esmi_ib_library
ExclusiveArch: x86_64
- eth-tools
ExclusiveArch: x86_64
- exec-maven-plugin
ExclusiveArch: %{java_arches} noarch
- external-editor-revived
ExclusiveArch: %{rust_arches}
- extra-enforcer-rules
ExclusiveArch: %{java_arches} noarch
- fasterxml-oss-parent
ExclusiveArch: %{java_arches} noarch
- fb303
ExclusiveArch: x86_64 aarch64 ppc64le
- fbthrift
ExclusiveArch: x86_64 aarch64 ppc64le
- fcitx-libpinyin
ExclusiveArch: %{qt5_qtwebengine_arches}
- fedora-dockerfiles
ExclusiveArch: %{go_arches}
- felix-parent
ExclusiveArch: %{java_arches} noarch
- felix-utils
ExclusiveArch: %{java_arches} noarch
- fernflower
ExclusiveArch: %{java_arches} noarch
- fes
ExclusiveArch: %{ix86} x86_64
- filedrop
ExclusiveArch: %{java_arches} noarch
- firecracker
ExclusiveArch: aarch64 x86_64
- fishbowl
ExclusiveArch: %{java_arches} noarch
- fizz
ExclusiveArch: x86_64 aarch64 ppc64le
- flocq
ExclusiveArch: %{java_arches}
- florist
ExclusiveArch: %{GPRbuild_arches}
- fluent-bit
ExclusiveArch: x86_64 aarch64
- folly
ExclusiveArch: x86_64 aarch64 ppc64le
- fop
ExclusiveArch: %{java_arches} noarch
- forge-parent
ExclusiveArch: %{java_arches} noarch
- fpc
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64 ppc64le
- frama-c
ExclusiveArch: %{java_arches}
- freecol
ExclusiveArch: %{java_arches} noarch
- freemarker
ExclusiveArch: %{java_arches} noarch
- freerouting
ExclusiveArch: %{java_arches} noarch
- frescobaldi
ExclusiveArch: %{qt5_qtwebengine_arches}
- frysk
ExclusiveArch: x86_64 ppc64
- fuse-overlayfs
ExclusiveArch: %{arm64} ppc64le s390x x86_64
- fusesource-pom
ExclusiveArch: %{java_arches} noarch
- fwts
ExclusiveArch: x86_64 %{arm} aarch64 s390x riscv64 %{power64}
- fwupd-efi
ExclusiveArch: x86_64 aarch64
- ga
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 ppc64le
- gap
ExclusiveArch: %{gap_arches}
- gap-pkg-ace
ExclusiveArch: %{gap_arches}
- gap-pkg-aclib
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-alnuth
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-atlasrep
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-autodoc
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-automata
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-autpgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-browse
ExclusiveArch: %{gap_arches}
- gap-pkg-caratinterface
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-circle
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-cohomolo
ExclusiveArch: %{gap_arches}
- gap-pkg-congruence
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-corelg
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crime
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crisp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crypting
ExclusiveArch: %{gap_arches}
- gap-pkg-cryst
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-crystcat
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-ctbllib
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-curlinterface
ExclusiveArch: %{gap_arches}
- gap-pkg-cvec
ExclusiveArch: %{gap_arches}
- gap-pkg-datastructures
ExclusiveArch: %{gap_arches}
- gap-pkg-design
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-digraphs
ExclusiveArch: %{gap_arches}
- gap-pkg-edim
ExclusiveArch: %{gap_arches}
- gap-pkg-factint
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-ferret
ExclusiveArch: %{gap_arches}
- gap-pkg-fga
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-fining
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-float
ExclusiveArch: %{gap_arches}
- gap-pkg-format
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-forms
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-fr
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-francy
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-gbnp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-genss
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-grape
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-groupoids
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-grpconst
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-guava
ExclusiveArch: %{gap_arches}
- gap-pkg-hap
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-hapcryst
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-hecke
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-images
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-io
ExclusiveArch: %{gap_arches}
- gap-pkg-irredsol
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-json
ExclusiveArch: %{gap_arches}
- gap-pkg-jupyterkernel
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-jupyterviz
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-laguna
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-liealgdb
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-liepring
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-liering
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-loops
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-lpres
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-mapclass
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-nautytracesinterface
ExclusiveArch: %{gap_arches}
- gap-pkg-nq
ExclusiveArch: %{gap_arches}
- gap-pkg-openmath
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-orb
ExclusiveArch: %{gap_arches}
- gap-pkg-polenta
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-polycyclic
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-polymaking
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-primgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-profiling
ExclusiveArch: %{gap_arches}
- gap-pkg-qpa
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-quagroup
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-radiroot
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-recog
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-repsn
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-resclasses
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-scscp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-semigroups
ExclusiveArch: %{gap_arches}
- gap-pkg-singular
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-sla
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-smallgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-smallsemi
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-sonata
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-sophus
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-spinsym
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-standardff
ExclusiveArch: %{gap_arches}
- gap-pkg-tomlib
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-toric
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-transgrp
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-utils
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-uuid
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-xmod
ExclusiveArch: %{gap_arches} noarch
- gap-pkg-zeromqinterface
ExclusiveArch: %{gap_arches}
- gappalib-coq
ExclusiveArch: %{java_arches}
- gbrainy
ExclusiveArch: %mono_arches
- gdb
ExclusiveArch: %{ix86} x86_64
- gdb-exploitable
ExclusiveArch: x86_64 i386
ExclusiveArch: x86_64 noarch
- gearhead1
ExclusiveArch: %{fpc_arches}
- gearhead2
ExclusiveArch: %{fpc_arches}
- ghdl
ExclusiveArch: %{GNAT_arches}
- ghostwriter
ExclusiveArch: %{qt5_qtwebengine_arches}
- gio-sharp
ExclusiveArch: %mono_arches
- gir-to-d
ExclusiveArch: %{ldc_arches}
- git-octopus
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- gitqlient
ExclusiveArch: %{qt5_qtwebengine_arches}
- giver
ExclusiveArch: %{mono_arches}
- gkeyfile-sharp
ExclusiveArch: %mono_arches
- glibc32
ExclusiveArch: x86_64
- glibd
ExclusiveArch: %{ldc_arches}
- gnatcoll
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-bindings
ExclusiveArch: %{GPRbuild_arches}
- gnatcoll-db
ExclusiveArch: %{GPRbuild_arches}
- gnome-boxes
ExclusiveArch: x86_64
- gnome-desktop-sharp
ExclusiveArch: %mono_arches
- gnome-do
ExclusiveArch: %mono_arches
- gnome-keyring-sharp
ExclusiveArch: %mono_arches
- gnome-rdp
ExclusiveArch: %{mono_arches}
- gnome-sharp
ExclusiveArch: %mono_arches
- gnome-subtitles
ExclusiveArch: %mono_arches
- gnu-efi
ExclusiveArch: %{efi}
- go-bindata
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- godep
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- golang
ExclusiveArch: %{golang_arches}
- google-gson
ExclusiveArch: %{java_arches} noarch
- google-guice
ExclusiveArch: %{java_arches} noarch
- gotun
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
ExclusiveArch: x86_64
- goverlay
ExclusiveArch: %{fpc_arches}
- gprbuild
ExclusiveArch: %{GPRbuild_arches}
- gprolog
ExclusiveArch: x86_64 %{ix86} ppc alpha aarch64
- grafana
ExclusiveArch: %{grafana_arches}
- grafana-pcp
ExclusiveArch: %{grafanapcp_arches}
- gtk-sharp-beans
ExclusiveArch: %mono_arches
- gtk-sharp2
ExclusiveArch: %mono_arches
- gtk-sharp3
ExclusiveArch: %{mono_arches}
- gtkd
ExclusiveArch: %{ldc_arches}
- guava
ExclusiveArch: %{java_arches} noarch
- gudev-sharp
ExclusiveArch: %mono_arches
- guestfs-tools
ExclusiveArch: %{kernel_arches}
- hamcrest
ExclusiveArch: %{java_arches} noarch
- harec
ExclusiveArch: x86_64 aarch64
- hawtjni
ExclusiveArch: %{java_arches} noarch
- hedgewars
ExclusiveArch: %{fpc_arches}
- hibernate-jpa-2.0-api
ExclusiveArch: %{java_arches} noarch
- hibernate-jpa-2.1-api
ExclusiveArch: %{java_arches} noarch
- hid4java
ExclusiveArch: %{java_arches} noarch
- hsakmt
ExclusiveArch: x86_64 aarch64 ppc64le
- httpcomponents-client
ExclusiveArch: %{java_arches} noarch
- httpcomponents-core
ExclusiveArch: %{java_arches} noarch
- httpcomponents-project
ExclusiveArch: %{java_arches} noarch
- hyena
ExclusiveArch: %{mono_arches}
- hyperscan
ExclusiveArch: x86_64
- hyperv-daemons
ExclusiveArch: i686 x86_64 aarch64
- icaro
ExclusiveArch: %{ix86} x86_64 noarch
- icedtea-web
ExclusiveArch: %{java_arches}
- icu4j
ExclusiveArch: %{java_arches} noarch
- imagej
ExclusiveArch: %{java_arches} noarch
- imhex
ExclusiveArch: x86_64 %{arm64}
- imvirt
ExclusiveArch: %{ix86} x86_64 ia64
- indistarter
ExclusiveArch: %{fpc_arches}
- infinipath-psm
ExclusiveArch: x86_64
- intel-cm-compiler
ExclusiveArch: i686 x86_64
- intel-cmt-cat
ExclusiveArch: x86_64 i686 i586
ExclusiveArch: x86_64 i686 i586
- intel-compute-runtime
ExclusiveArch: x86_64
- intel-gmmlib
ExclusiveArch: x86_64 i686
- intel-igc
ExclusiveArch: x86_64
- intel-ipp-crypto-mb
ExclusiveArch: x86_64
- intel-ipsec-mb
ExclusiveArch: x86_64
ExclusiveArch: x86_64
- intel-mediasdk
ExclusiveArch: x86_64
- intel-undervolt
ExclusiveArch: i386 x86_64
- ioport
ExclusiveArch: %{ix86} x86_64
- ipmctl
ExclusiveArch: x86_64
- ispc
ExclusiveArch: x86_64 aarch64
- iucode-tool
ExclusiveArch: %{ix86} x86_64
- iyfct
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- jFormatString
ExclusiveArch: %{java_arches} noarch
- jackson-annotations
ExclusiveArch: %{java_arches} noarch
- jackson-bom
ExclusiveArch: %{java_arches} noarch
- jackson-core
ExclusiveArch: %{java_arches} noarch
- jackson-databind
ExclusiveArch: %{java_arches} noarch
- jackson-dataformats-binary
ExclusiveArch: %{java_arches} noarch
- jackson-dataformats-text
ExclusiveArch: %{java_arches} noarch
- jackson-jaxrs-providers
ExclusiveArch: %{java_arches} noarch
- jackson-modules-base
ExclusiveArch: %{java_arches} noarch
- jackson-parent
ExclusiveArch: %{java_arches} noarch
- jacoco
ExclusiveArch: %{java_arches} noarch
- jacop
ExclusiveArch: %{java_arches} noarch
- jakarta-activation
ExclusiveArch: %{java_arches} noarch
- jakarta-activation1
ExclusiveArch: %{java_arches} noarch
- jakarta-annotations
ExclusiveArch: %{java_arches} noarch
- jakarta-el
ExclusiveArch: %{java_arches} noarch
- jakarta-interceptors
ExclusiveArch: %{java_arches} noarch
- jakarta-json
ExclusiveArch: %{java_arches} noarch
- jakarta-mail
ExclusiveArch: %{java_arches} noarch
- jakarta-oro
ExclusiveArch: %{java_arches} noarch
- jakarta-saaj
ExclusiveArch: %{java_arches} noarch
- jakarta-server-pages
ExclusiveArch: %{java_arches} noarch
- jakarta-servlet
ExclusiveArch: %{java_arches} noarch
- jakarta-xml-ws
ExclusiveArch: %{java_arches} noarch
- janino
ExclusiveArch: %{java_arches} noarch
- jansi
ExclusiveArch: %{java_arches}
- jansi-native
ExclusiveArch: %{java_arches}
- jansi1
ExclusiveArch: %{java_arches} noarch
- java-1.8.0-openjdk
ExclusiveArch: %{java_arches}
- java-1.8.0-openjdk-aarch32
ExclusiveArch: %{arm}
- java-1.8.0-openjdk-portable
ExclusiveArch: %{java_arches}
- java-11-openjdk
ExclusiveArch: %{java_arches}
- java-11-openjdk-portable
ExclusiveArch: %{java_arches}
- java-17-openjdk
ExclusiveArch: %{java_arches}
- java-17-openjdk-portable
ExclusiveArch: %{java_arches}
- java-diff-utils
ExclusiveArch: %{java_arches} noarch
- java-dirq
ExclusiveArch: %{java_arches} noarch
- java-jd-decompiler
ExclusiveArch: %{java_arches} noarch
- java-latest-openjdk
ExclusiveArch: %{java_arches}
- java-latest-openjdk-portable
ExclusiveArch: %{java_arches}
- java-runtime-decompiler
ExclusiveArch: %{java_arches} noarch
- java-scrypt
ExclusiveArch: %{java_arches} noarch
- java_cup
ExclusiveArch: %{java_arches} noarch
- javacc
ExclusiveArch: %{java_arches} noarch
- javacc-maven-plugin
ExclusiveArch: %{java_arches} noarch
- javaewah
ExclusiveArch: %{java_arches} noarch
- javapackages-bootstrap
ExclusiveArch: %{java_arches}
- javaparser
ExclusiveArch: %{java_arches} noarch
- javapoet
ExclusiveArch: %{java_arches} noarch
- javassist
ExclusiveArch: %{java_arches} noarch
- jaxb
ExclusiveArch: %{java_arches} noarch
- jaxb-api
ExclusiveArch: %{java_arches} noarch
- jaxb-api2
ExclusiveArch: %{java_arches} noarch
- jaxb-dtd-parser
ExclusiveArch: %{java_arches} noarch
- jaxb-fi
ExclusiveArch: %{java_arches} noarch
- jaxb-istack-commons
ExclusiveArch: %{java_arches} noarch
- jaxb-stax-ex
ExclusiveArch: %{java_arches} noarch
- jaxen
ExclusiveArch: %{java_arches} noarch
- jboss-jaxrs-2.0-api
ExclusiveArch: %{java_arches} noarch
- jboss-logging
ExclusiveArch: %{java_arches} noarch
- jboss-logging-tools
ExclusiveArch: %{java_arches} noarch
- jboss-parent
ExclusiveArch: %{java_arches} noarch
- jchardet
ExclusiveArch: %{java_arches} noarch
- jcip-annotations
ExclusiveArch: %{java_arches} noarch
- jctools
ExclusiveArch: %{java_arches} noarch
- jcuber
ExclusiveArch: %{java_arches} noarch
- jdeparser
ExclusiveArch: %{java_arches} noarch
- jdepend
ExclusiveArch: %{java_arches} noarch
- jdependency
ExclusiveArch: %{java_arches} noarch
- jdom
ExclusiveArch: %{java_arches} noarch
- jdom2
ExclusiveArch: %{java_arches} noarch
- jericho-html
ExclusiveArch: %{java_arches} noarch
- jetty
ExclusiveArch: %{java_arches} noarch
- jflex
ExclusiveArch: %{java_arches} noarch
- jfreechart
ExclusiveArch: %{java_arches} noarch
- jgit
ExclusiveArch: %{java_arches} noarch
- jglobus
ExclusiveArch: %{java_arches} noarch
- jgoodies-common
ExclusiveArch: %{java_arches} noarch
- jgoodies-forms
ExclusiveArch: %{java_arches} noarch
- jgoodies-looks
ExclusiveArch: %{java_arches} noarch
- jigawatts
ExclusiveArch: x86_64 %{arm} ppc64le aarch64 s390x
- jline
ExclusiveArch: %{java_arches}
- jline2
ExclusiveArch: %{java_arches} noarch
- jmock
ExclusiveArch: %{java_arches} noarch
- jmol
ExclusiveArch: %{java_arches} noarch
- jna
ExclusiveArch: %{java_arches}
- jneuroml-core
ExclusiveArch: %{java_arches} noarch
- jni-inchi
ExclusiveArch: %{java_arches}
- jol
ExclusiveArch: %{java_arches} noarch
- jolokia-jvm-agent
ExclusiveArch: %{java_arches} noarch
- jopt-simple
ExclusiveArch: %{java_arches} noarch
- jorbis
ExclusiveArch: %{java_arches} noarch
- jowl
ExclusiveArch: %{nodejs_arches} noarch
- jpanoramamaker
ExclusiveArch: %{java_arches} noarch
- jsch
ExclusiveArch: %{java_arches} noarch
- jsch-agent-proxy
ExclusiveArch: %{java_arches} noarch
- json_simple
ExclusiveArch: %{java_arches} noarch
- jsr-305
ExclusiveArch: %{java_arches} noarch
- jss
ExclusiveArch: %{java_arches}
- jssc
ExclusiveArch: %{java_arches}
- jtidy
ExclusiveArch: %{java_arches} noarch
- julia
ExclusiveArch: x86_64
- junit
ExclusiveArch: %{java_arches} noarch
- junit5
ExclusiveArch: %{java_arches} noarch
- juniversalchardet
ExclusiveArch: %{java_arches} noarch
- jzlib
ExclusiveArch: %{java_arches} noarch
- kchmviewer
ExclusiveArch: %{qt5_qtwebengine_arches}
- kernel
ExclusiveArch: noarch x86_64 s390x %{arm} aarch64 ppc64le
ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le
- keylime-agent-rust
ExclusiveArch: %{rust_arches}
- keyring-ima-signer
ExclusiveArch: %{rust_arches}
- kf5-akonadi-search
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-audiocd-kio
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kblog
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarcore
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kcalendarutils
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-kitinerary
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-ktnef
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- kf5-libkdcraw
ExclusiveArch: x86_64 ppc64le %{arm}
- kicad
ExclusiveArch: x86_64 aarch64 ppc64le
- kiwix-desktop
ExclusiveArch: %{qt5_qtwebengine_arches}
- knot-resolver
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- knotes
ExclusiveArch: x86_64 %{arm}
- kubernetes
ExclusiveArch: x86_64 aarch64 ppc64le s390x %{arm}
- laf-plugin
ExclusiveArch: %{java_arches} noarch
- lazarus
ExclusiveArch: %{fpc_arches}
- lazpaint
ExclusiveArch: %{fpc_arches}
- ldapjdk
ExclusiveArch: %{java_arches} noarch
- ldc
ExclusiveArch: %{ldc_arches} ppc64le
- ldc1.30
ExclusiveArch: %{ldc_arches} ppc64le
- libclc
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64 %{power64} s390x
- libcxl
ExclusiveArch: %{power64}
- libdfp
ExclusiveArch: ppc ppc64 ppc64le s390 s390x x86_64
- libdispatch
ExclusiveArch: x86_64 aarch64 ppc64le
- libguestfs
ExclusiveArch: %{kernel_arches}
- libica
ExclusiveArch: s390 s390x
- libipt
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- libkgapi
ExclusiveArch: x86_64 ppc64le aarch64 %{arm}
- libkrun
ExclusiveArch: x86_64 aarch64
- libkrunfw
ExclusiveArch: x86_64 aarch64
- libnxz
ExclusiveArch: ppc64le
- libocxl
ExclusiveArch: ppc64le
- libpsm2
ExclusiveArch: x86_64
- libquentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- libreoffice-TexMaths
ExclusiveArch: %{java_arches}
- libretro-desmume2015
ExclusiveArch: i686 x86_64
- librtas
ExclusiveArch: %{power64}
- libservicelog
ExclusiveArch: ppc %{power64}
- libsmbios
ExclusiveArch: x86_64 %{ix86}
- libunicode
ExclusiveArch: x86_64 aarch64
- libunwind
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
- libva-intel-hybrid-driver
ExclusiveArch: %{ix86} x86_64 ia64
- libvirt-java
ExclusiveArch: %{java_arches} noarch
- libvma
ExclusiveArch: x86_64 ppc64le ppc64 aarch64
- libvmi
ExclusiveArch: x86_64
- libvpd
ExclusiveArch: %{power64}
- libxsmm
ExclusiveArch: x86_64
- libzdnn
ExclusiveArch: s390x
- libzfcphbaapi
ExclusiveArch: s390 s390x
- libzpc
ExclusiveArch: s390x
- llhttp
ExclusiveArch: %{nodejs_arches}
- log4j
ExclusiveArch: %{java_arches} noarch
- log4net
ExclusiveArch: %mono_arches
- lrmi
ExclusiveArch: %{ix86}
- lsvpd
ExclusiveArch: %{power64}
- luajit
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- lucene
ExclusiveArch: %{java_arches} noarch
- lujavrite
ExclusiveArch: %{java_arches}
- luxcorerender
ExclusiveArch: x86_64
- mactel-boot
ExclusiveArch: x86_64
- magicmirror
ExclusiveArch: %{nodejs_arches} noarch
- manifest-tool
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- mariadb-java-client
ExclusiveArch: %{java_arches} noarch
- marked
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- matreshka
ExclusiveArch: %GPRbuild_arches
- matrix-synapse
ExclusiveArch: %{rust_arches}
- maui-mauikit
ExclusiveArch: %{ix86} s390x aarch64 x86_64
- maven
ExclusiveArch: %{java_arches} noarch
- maven-antrun-plugin
ExclusiveArch: %{java_arches} noarch
- maven-archetype
ExclusiveArch: %{java_arches} noarch
- maven-archiver
ExclusiveArch: %{java_arches} noarch
- maven-artifact-transfer
ExclusiveArch: %{java_arches} noarch
- maven-assembly-plugin
ExclusiveArch: %{java_arches} noarch
- maven-bundle-plugin
ExclusiveArch: %{java_arches} noarch
- maven-clean-plugin
ExclusiveArch: %{java_arches} noarch
- maven-common-artifact-filters
ExclusiveArch: %{java_arches} noarch
- maven-compiler-plugin
ExclusiveArch: %{java_arches} noarch
- maven-dependency-analyzer
ExclusiveArch: %{java_arches} noarch
- maven-dependency-plugin
ExclusiveArch: %{java_arches} noarch
- maven-dependency-tree
ExclusiveArch: %{java_arches} noarch
- maven-doxia
ExclusiveArch: %{java_arches} noarch
- maven-doxia-sitetools
ExclusiveArch: %{java_arches} noarch
- maven-enforcer
ExclusiveArch: %{java_arches} noarch
- maven-file-management
ExclusiveArch: %{java_arches} noarch
- maven-filtering
ExclusiveArch: %{java_arches} noarch
- maven-invoker
ExclusiveArch: %{java_arches} noarch
- maven-invoker-plugin
ExclusiveArch: %{java_arches} noarch
- maven-jar-plugin
ExclusiveArch: %{java_arches} noarch
- maven-mapping
ExclusiveArch: %{java_arches} noarch
- maven-native
ExclusiveArch: %{java_arches} noarch
- maven-parent
ExclusiveArch: %{java_arches} noarch
- maven-patch-plugin
ExclusiveArch: %{java_arches} noarch
- maven-plugin-testing
ExclusiveArch: %{java_arches} noarch
- maven-plugin-tools
ExclusiveArch: %{java_arches} noarch
- maven-remote-resources-plugin
ExclusiveArch: %{java_arches} noarch
- maven-reporting-api
ExclusiveArch: %{java_arches} noarch
- maven-reporting-impl
ExclusiveArch: %{java_arches} noarch
- maven-resolver
ExclusiveArch: %{java_arches} noarch
- maven-resources-plugin
ExclusiveArch: %{java_arches} noarch
- maven-script-interpreter
ExclusiveArch: %{java_arches} noarch
- maven-shade-plugin
ExclusiveArch: %{java_arches} noarch
- maven-shared-incremental
ExclusiveArch: %{java_arches} noarch
- maven-shared-io
ExclusiveArch: %{java_arches} noarch
- maven-shared-utils
ExclusiveArch: %{java_arches} noarch
- maven-source-plugin
ExclusiveArch: %{java_arches} noarch
- maven-surefire
ExclusiveArch: %{java_arches} noarch
- maven-verifier
ExclusiveArch: %{java_arches} noarch
- maven-verifier-plugin
ExclusiveArch: %{java_arches} noarch
- maven-wagon
ExclusiveArch: %{java_arches} noarch
- maxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
ExclusiveArch: %{ix86} x86_64 ppc sparcv9
- mbpfan
ExclusiveArch: x86_64
- mcelog
ExclusiveArch: i686 x86_64
- mcrouter
ExclusiveArch: x86_64 aarch64 ppc64le
- mecab-java
ExclusiveArch: %java_arches
- mediaconch
ExclusiveArch: %{qt5_qtwebengine_arches}
- mellowplayer
ExclusiveArch: %{qt5_qtwebengine_arches}
- memkind
ExclusiveArch: x86_64 ppc64 ppc64le s390x aarch64
- memtest86+
ExclusiveArch: x86_64 %{ix86}
- microcode_ctl
ExclusiveArch: %{ix86} x86_64
- micropython
ExclusiveArch: %{arm} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64
- miglayout
ExclusiveArch: %{java_arches} noarch
- mine_detector
ExclusiveArch: %{GPRbuild_arches}
- minetest
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- mingw-libidn2
ExclusiveArch: %{ix86} x86_64 %{arm}
- mingw-wine-gecko
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- mirrorlist-server
ExclusiveArch: %{rust_arches}
- mkbootdisk
ExclusiveArch: %{ix86} sparc sparc64 x86_64
- moby-engine
ExclusiveArch: %{golang_arches}
- mockito
ExclusiveArch: %{java_arches} noarch
- mod_mono
ExclusiveArch: %mono_arches
- modello
ExclusiveArch: %{java_arches} noarch
- module-build-service
ExclusiveArch: %{ix86} x86_64 noarch
- modulemaker-maven-plugin
ExclusiveArch: %{java_arches} noarch
- mojo-executor
ExclusiveArch: %{java_arches} noarch
- mojo-parent
ExclusiveArch: %{java_arches} noarch
- mokutil
ExclusiveArch: %{ix86} x86_64 aarch64 %{arm}
- mono
ExclusiveArch: %mono_arches
- mono-addins
ExclusiveArch: %mono_arches
- mono-basic
ExclusiveArch: %{mono_arches}
- mono-bouncycastle
ExclusiveArch: %mono_arches
- mono-cecil
ExclusiveArch: %mono_arches
- mono-cecil-flowanalysis
ExclusiveArch: %mono_arches
- mono-reflection
ExclusiveArch: %mono_arches
- mono-tools
ExclusiveArch: %mono_arches
- mono-zeroconf
ExclusiveArch: %mono_arches
- monodevelop
ExclusiveArch: %mono_arches
- monodevelop-debugger-gdb
ExclusiveArch: %{mono_arches}
- mrrescue
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- msr-tools
ExclusiveArch: %{ix86} x86_64
- munge-maven-plugin
ExclusiveArch: %{java_arches} noarch
- mxparser
ExclusiveArch: %{java_arches} noarch
- mysql-connector-java
ExclusiveArch: %{java_arches} noarch
- mysql-connector-net
ExclusiveArch: %{mono_arches}
- naev
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
- naga
ExclusiveArch: %{java_arches} noarch
- nant
ExclusiveArch: %mono_arches
- nativejit
ExclusiveArch: x86_64
- nbc
ExclusiveArch: %{fpc_arches}
- nbdkit
ExclusiveArch: x86_64
- ndesk-dbus
ExclusiveArch: %{mono_arches}
- ndesk-dbus-glib
ExclusiveArch: %{mono_arches}
- nekohtml
ExclusiveArch: %{java_arches} noarch
- netavark
ExclusiveArch: %{golang_arches_future}
- newtonsoft-json
ExclusiveArch: %{mono_arches}
- nodejs-acorn-object-spread
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-backbone
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-bash-language-server
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-buble
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-colors
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-generic-pool
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-less
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-linefix
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs-nodemon
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-packaging
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-replace-require-self
ExclusiveArch: %{nodejs_arches} noarch
- nodejs-underscore
ExclusiveArch: %{nodejs_arches} noarch
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
- nodejs18
ExclusiveArch: %{nodejs_arches}
- nodejs20
ExclusiveArch: %{nodejs_arches}
- nom-tam-fits
ExclusiveArch: %{java_arches} noarch
- notify-sharp
ExclusiveArch: %{mono_arches}
- notify-sharp3
ExclusiveArch: %{mono_arches}
- nuget
ExclusiveArch: %{mono_arches}
- numatop
ExclusiveArch: x86_64 ppc64le
- nunit
ExclusiveArch: %{mono_arches}
- nunit2
ExclusiveArch: %{mono_arches}
- nvml
ExclusiveArch: x86_64 ppc64le
- objectweb-asm
ExclusiveArch: %{java_arches} noarch
- objenesis
ExclusiveArch: %{java_arches} noarch
- obs-service-rust2rpm
ExclusiveArch: %{rust_arches} noarch
- oci-seccomp-bpf-hook
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
ExclusiveArch: %{golang_arches_future}
- oidn
ExclusiveArch: x86_64
- olpc-utils
ExclusiveArch: %{ix86} %{arm}
- oneVPL
ExclusiveArch: x86_64
- oneVPL-intel-gpu
ExclusiveArch: x86_64
- oneapi-level-zero
ExclusiveArch: x86_64
- onednn
ExclusiveArch: x86_64 aarch64 ppc64le s390x
- onedrive
ExclusiveArch: %{ldc_arches}
- ongres-scram
ExclusiveArch: %{java_arches} noarch
- ongres-stringprep
ExclusiveArch: %{java_arches} noarch
- opae
ExclusiveArch: x86_64
- opal-prd
ExclusiveArch: ppc64le
- open-vm-tools
ExclusiveArch: x86_64 aarch64
ExclusiveArch: %{ix86} x86_64 aarch64
ExclusiveArch: x86_64
- openblas
ExclusiveArch: %{openblas_arches}
- openjdk-asmtools
ExclusiveArch: %{java_arches} noarch
- openjdk-asmtools7
ExclusiveArch: %{java_arches} noarch
- openjfx
ExclusiveArch: %{java_arches}
- openjfx8
ExclusiveArch: x86_64
- openlibm
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 %{power64}
- openms
ExclusiveArch: %{qt5_qtwebengine_arches}
- openni
ExclusiveArch: %{ix86} x86_64 %{arm}
- openni-primesense
ExclusiveArch: %{ix86} x86_64 %{arm}
- openpgl
ExclusiveArch: aarch64 x86_64
- openssl-ibmca
ExclusiveArch: s390 s390x
- openstack-java-sdk
ExclusiveArch: %{java_arches} noarch
- opentest4j
ExclusiveArch: %{java_arches} noarch
- openvkl
ExclusiveArch: aarch64 x86_64
- optee_client
ExclusiveArch: aarch64
- options
ExclusiveArch: %{java_arches} noarch
- orthorobot
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- osgi-annotation
ExclusiveArch: %{java_arches} noarch
- osgi-compendium
ExclusiveArch: %{java_arches} noarch
- osgi-core
ExclusiveArch: %{java_arches} noarch
- pacemaker
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64 %{arm}
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- pageedit
ExclusiveArch: %{qt5_qtwebengine_arches}
- parserng
ExclusiveArch: %{java_arches} noarch
- pasdoc
ExclusiveArch: %{fpc_arches}
- pcc
ExclusiveArch: %{ix86} x86_64
- pcfi
ExclusiveArch: %{java_arches} noarch
- pcm
ExclusiveArch: %{ix86} x86_64
- pcmciautils
ExclusiveArch: %{ix86} x86_64 ia64 ppc ppc64 %{arm}
- pdbg
ExclusiveArch: ppc64le
- pdfbox
ExclusiveArch: %{java_arches} noarch
- pdfmod
ExclusiveArch: %mono_arches
- pdftk-java
ExclusiveArch: %{java_arches} noarch
- perl-Dumbbench
ExclusiveArch: %{ix86} x86_64 noarch
- perl-Parse-DMIDecode
ExclusiveArch: %{ix86} x86_64 ia64 aarch64
- pesign
ExclusiveArch: %{ix86} x86_64 ia64 aarch64 %{arm}
- pesign-test-app
ExclusiveArch: x86_64
- picocli
ExclusiveArch: %{java_arches} noarch
- pinta
ExclusiveArch: %mono_arches
- pioneer
ExclusiveArch: %{ix86} x86_64
- plantuml
ExclusiveArch: %{java_arches} noarch
- plasma-dialer
ExclusiveArch: %{java_arches}
- playonlinux
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- plexus-archiver
ExclusiveArch: %{java_arches} noarch
- plexus-build-api
ExclusiveArch: %{java_arches} noarch
- plexus-cipher
ExclusiveArch: %{java_arches} noarch
- plexus-classworlds
ExclusiveArch: %{java_arches} noarch
- plexus-compiler
ExclusiveArch: %{java_arches} noarch
- plexus-component-api
ExclusiveArch: %{java_arches} noarch
- plexus-components-pom
ExclusiveArch: %{java_arches} noarch
- plexus-containers
ExclusiveArch: %{java_arches} noarch
- plexus-i18n
ExclusiveArch: %{java_arches} noarch
- plexus-interpolation
ExclusiveArch: %{java_arches} noarch
- plexus-io
ExclusiveArch: %{java_arches} noarch
- plexus-languages
ExclusiveArch: %{java_arches} noarch
- plexus-pom
ExclusiveArch: %{java_arches} noarch
- plexus-resources
ExclusiveArch: %{java_arches} noarch
- plexus-sec-dispatcher
ExclusiveArch: %{java_arches} noarch
- plexus-utils
ExclusiveArch: %{java_arches} noarch
- plexus-velocity
ExclusiveArch: %{java_arches} noarch
- podman
ExclusiveArch: %{golang_arches_future}
ExclusiveArch: aarch64 ppc64le s390x x86_64
- pomchecker
ExclusiveArch: %{java_arches} noarch
- poppler-sharp
ExclusiveArch: %mono_arches
- popub
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- postgresql-jdbc
ExclusiveArch: %{java_arches} noarch
- powerpc-utils
ExclusiveArch: ppc %{power64}
- ppc64-diag
ExclusiveArch: ppc %{power64}
- procyon
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
ExclusiveArch: %{java_arches} noarch
- proguard
ExclusiveArch: %{java_arches} noarch
- prometheus-jmx-exporter
ExclusiveArch: %{java_arches} noarch
- prometheus-simpleclient-java
ExclusiveArch: %{java_arches} noarch
- proxygen
ExclusiveArch: x86_64 aarch64 ppc64le
- pveclib
ExclusiveArch: ppc %{power64}
- pvs-sbcl
ExclusiveArch: x86_64
- pyqtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- python-ast-monitor
ExclusiveArch: %{qt5_qtwebengine_arches} noarch
- python-cryptography
ExclusiveArch: %{rust_arches}
- python-damo
ExclusiveArch: x86_64 aarch64 ppc64le s390x noarch
- python-etcd
ExclusiveArch: noarch %{ix86} x86_64 %{arm} aarch64 ppc64le s390x
- python-javaobj
ExclusiveArch: %{java_arches} noarch
- python-jep
ExclusiveArch: %{java_arches}
- python-jupyter-polymake
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- python-openoffice
ExclusiveArch: noarch x86_64
- python-pymoc
ExclusiveArch: aarch64 ppc64 ppc64le x86_64 s390x
- python-pyqt6-webengine
ExclusiveArch: aarch64 x86_64
- python-setuptools-rust
ExclusiveArch: %{rust_arches}
- q4wine
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- qatengine
ExclusiveArch: x86_64
- qatzip
ExclusiveArch: x86_64
- qbe
ExclusiveArch: x86_64 aarch64
- qcint
ExclusiveArch: x86_64
- qclib
ExclusiveArch: s390 s390x
- qdox
ExclusiveArch: %{java_arches} noarch
- qemu-sanity-check
ExclusiveArch: %{kernel_arches}
- qevercloud
ExclusiveArch: %{qt5_qtwebengine_arches}
- qmapshack
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt4pas
ExclusiveArch: %{fpc_arches}
- qt5-qtwebengine
ExclusiveArch: %{qt5_qtwebengine_arches}
- qt6-qtwebengine
ExclusiveArch: aarch64 x86_64
- qt6-qtwebview
ExclusiveArch: aarch64 x86_64
- quantum-espresso
ExclusiveArch: x86_64 %{ix86} aarch64 %{power64}
- quentier
ExclusiveArch: %{qt5_qtwebengine_arches}
- rEFInd
ExclusiveArch: %{efi}
- rachota
ExclusiveArch: %{java_arches} noarch
- rear
ExclusiveArch: %ix86 x86_64 ppc ppc64 ppc64le ia64
- reflections
ExclusiveArch: %{java_arches} noarch
- reg
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 aarch64 %{arm}}
- regexp
ExclusiveArch: %{java_arches} noarch
- replacer
ExclusiveArch: %{java_arches} noarch
- reptyr
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- rescene
ExclusiveArch: %{mono_arches}
- resteasy
ExclusiveArch: %{java_arches} noarch
- restool
ExclusiveArch: aarch64
- restsharp
ExclusiveArch: %{mono_arches}
- retsnoop
ExclusiveArch: %{rust_arches}
- rhino
ExclusiveArch: %{java_arches} noarch
- river
ExclusiveArch: %{zig_arches}
- rkcommon
ExclusiveArch: x86_64 aarch64
- rocclr
ExclusiveArch: x86_64 aarch64 ppc64le
- rocm-compilersupport
ExclusiveArch: x86_64 aarch64 ppc64le
- rocm-device-libs
ExclusiveArch: x86_64 aarch64 ppc64le
- rocm-runtime
ExclusiveArch: x86_64 aarch64 ppc64le
- rocminfo
ExclusiveArch: x86_64 aarch64 ppc64le
- rocprim
ExclusiveArch: x86_64
- rocrand
ExclusiveArch: x86_64
- rpm-ostree
ExclusiveArch: %{rust_arches}
- rr
ExclusiveArch: %{ix86} x86_64 aarch64
- rssguard
ExclusiveArch: %{qt5_qtwebengine_arches}
- rstudio
ExclusiveArch: %{java_arches}
- rsyntaxtextarea
ExclusiveArch: %{java_arches} noarch
- rubygem-childprocess
ExclusiveArch: %{ix86} x86_64 noarch
- runc
ExclusiveArch: %{golang_arches_future}
- rundoc
ExclusiveArch: %{java_arches} noarch
- rust
ExclusiveArch: %{rust_arches}
- rust-actix
ExclusiveArch: %{rust_arches}
- rust-actix-router
ExclusiveArch: %{rust_arches}
- rust-actix-service
ExclusiveArch: %{rust_arches}
- rust-actix-tls
ExclusiveArch: %{rust_arches}
- rust-aparato
ExclusiveArch: %{rust_arches}
- rust-argmax
ExclusiveArch: %{rust_arches}
- rust-askalono-cli
ExclusiveArch: %{rust_arches}
- rust-askama_derive
ExclusiveArch: %{rust_arches}
- rust-askama_escape
ExclusiveArch: %{rust_arches}
- rust-assert-json-diff
ExclusiveArch: %{rust_arches}
- rust-async-std
ExclusiveArch: %{rust_arches}
- rust-asyncgit
ExclusiveArch: %{rust_arches}
- rust-az
ExclusiveArch: %{rust_arches}
- rust-base-x
ExclusiveArch: %{rust_arches}
- rust-binascii
ExclusiveArch: %{rust_arches}
- rust-bit-set
ExclusiveArch: %{rust_arches}
- rust-bitflags
ExclusiveArch: %{rust_arches}
- rust-bootupd
ExclusiveArch: x86_64 aarch64
- rust-brotli
ExclusiveArch: %{rust_arches}
- rust-btrd
ExclusiveArch: %{rust_arches}
- rust-bugreport
ExclusiveArch: %{rust_arches}
- rust-bytecount
ExclusiveArch: %{rust_arches}
- rust-capnp-futures
ExclusiveArch: %{rust_arches}
- rust-capnp-rpc
ExclusiveArch: %{rust_arches}
- rust-cascade
ExclusiveArch: %{rust_arches}
- rust-cast
ExclusiveArch: %{rust_arches}
- rust-cdylib-link-lines
ExclusiveArch: %{rust_arches}
- rust-chrono-humanize
ExclusiveArch: %{rust_arches}
- rust-chrono-tz
ExclusiveArch: %{rust_arches}
- rust-ciborium
ExclusiveArch: %{rust_arches}
- rust-ciborium-io
ExclusiveArch: %{rust_arches}
- rust-ciborium-ll
ExclusiveArch: %{rust_arches}
- rust-cint
ExclusiveArch: %{rust_arches}
- rust-clap_generate
ExclusiveArch: %{rust_arches}
- rust-clap_generate_fig
ExclusiveArch: %{rust_arches}
- rust-combine
ExclusiveArch: %{rust_arches}
- rust-comfy-table
ExclusiveArch: %{rust_arches}
- rust-compress-tools
ExclusiveArch: %{rust_arches}
- rust-const-oid0.6
ExclusiveArch: %{rust_arches}
- rust-const_fn
ExclusiveArch: %{rust_arches}
- rust-cookie-factory
ExclusiveArch: %{rust_arches}
- rust-cookie_store
ExclusiveArch: %{rust_arches}
- rust-copydeps
ExclusiveArch: %{rust_arches}
- rust-coreos-installer
ExclusiveArch: %{rust_arches}
- rust-crossbeam
ExclusiveArch: %{rust_arches}
- rust-cryptoki
ExclusiveArch: %{rust_arches}
- rust-cryptoki-sys
ExclusiveArch: %{rust_arches}
- rust-csscolorparser
ExclusiveArch: %{rust_arches}
- rust-cssparser-macros
ExclusiveArch: %{rust_arches}
- rust-ctr
ExclusiveArch: %{rust_arches}
- rust-dashmap4
ExclusiveArch: %{rust_arches}
- rust-data-encoding-macro
ExclusiveArch: %{rust_arches}
- rust-data-encoding-macro-internal
ExclusiveArch: %{rust_arches}
- rust-deflate
ExclusiveArch: %{rust_arches}
- rust-deflate0.8
ExclusiveArch: %{rust_arches}
- rust-derive_more
ExclusiveArch: %{rust_arches}
- rust-des
ExclusiveArch: %{rust_arches}
- rust-diff
ExclusiveArch: %{rust_arches}
- rust-directories
ExclusiveArch: %{rust_arches}
- rust-directories3
ExclusiveArch: %{rust_arches}
- rust-downcast
ExclusiveArch: %{rust_arches}
- rust-drg
ExclusiveArch: %{rust_arches}
- rust-dua-cli
ExclusiveArch: %{rust_arches}
- rust-dummy
ExclusiveArch: %{rust_arches}
- rust-edit
ExclusiveArch: %{rust_arches}
- rust-enumset
ExclusiveArch: %{rust_arches}
- rust-enumset_derive
ExclusiveArch: %{rust_arches}
- rust-escape_string
ExclusiveArch: %{rust_arches}
- rust-escargot
ExclusiveArch: %{rust_arches}
- rust-esphome
ExclusiveArch: %{rust_arches}
- rust-event-listener
ExclusiveArch: %{rust_arches}
- rust-fail
ExclusiveArch: %{rust_arches}
- rust-fedora
ExclusiveArch: %{rust_arches}
- rust-femme
ExclusiveArch: %{rust_arches}
- rust-filetreelist
ExclusiveArch: %{rust_arches}
- rust-findshlibs
ExclusiveArch: %{rust_arches}
- rust-firestorm
ExclusiveArch: %{rust_arches}
- rust-fixedbitset
ExclusiveArch: %{rust_arches}
- rust-fixedbitset0.2
ExclusiveArch: %{rust_arches}
- rust-flume
ExclusiveArch: %{rust_arches}
- rust-foreign-types-shared
ExclusiveArch: %{rust_arches}
- rust-format-bytes
ExclusiveArch: %{rust_arches}
- rust-format-bytes-macros
ExclusiveArch: %{rust_arches}
- rust-fscommon
ExclusiveArch: %{rust_arches}
- rust-fslock
ExclusiveArch: %{rust_arches}
- rust-futf
ExclusiveArch: %{rust_arches}
- rust-gag
ExclusiveArch: %{rust_arches}
- rust-getch
ExclusiveArch: %{rust_arches}
- rust-gethostname
ExclusiveArch: %{rust_arches}
- rust-gh-emoji
ExclusiveArch: %{rust_arches}
- rust-gif
ExclusiveArch: %{rust_arches}
- rust-gir-format-check
ExclusiveArch: %{rust_arches}
- rust-git-delta
ExclusiveArch: %{rust_arches}
- rust-git2_0.13
ExclusiveArch: %{rust_arches}
- rust-gitui
ExclusiveArch: %{rust_arches}
- rust-glam
ExclusiveArch: %{rust_arches}
- rust-gzip-header
ExclusiveArch: %{rust_arches}
- rust-hamming
ExclusiveArch: %{rust_arches}
- rust-handlebars
ExclusiveArch: %{rust_arches}
- rust-hashbrown0.11
ExclusiveArch: %{rust_arches}
- rust-headers
ExclusiveArch: %{rust_arches}
- rust-hex-literal-impl
ExclusiveArch: %{rust_arches}
- rust-hidapi
ExclusiveArch: %{rust_arches}
- rust-hkdf
ExclusiveArch: %{rust_arches}
- rust-hmac
ExclusiveArch: %{rust_arches}
- rust-http-body
ExclusiveArch: %{rust_arches}
- rust-httparse
ExclusiveArch: %{rust_arches}
- rust-humantime-serde
ExclusiveArch: %{rust_arches}
- rust-hyperlocal
ExclusiveArch: %{rust_arches}
- rust-ifcfg-devname
ExclusiveArch: %{rust_arches}
- rust-im-rc
ExclusiveArch: %{rust_arches}
- rust-image
ExclusiveArch: %{rust_arches}
- rust-image0.23
ExclusiveArch: %{rust_arches}
- rust-impls
ExclusiveArch: %{rust_arches}
- rust-indenter
ExclusiveArch: %{rust_arches}
- rust-inferno
ExclusiveArch: %{rust_arches}
- rust-inflate
ExclusiveArch: %{rust_arches}
- rust-inlinable_string
ExclusiveArch: %{rust_arches}
- rust-inout
ExclusiveArch: %{rust_arches}
- rust-input_buffer
ExclusiveArch: %{rust_arches}
- rust-inventory0.1
ExclusiveArch: %{rust_arches}
- rust-ipnetwork
ExclusiveArch: %{rust_arches}
- rust-ipnetwork0.17
ExclusiveArch: %{rust_arches}
- rust-is_ci
ExclusiveArch: %{rust_arches}
- rust-is_executable
ExclusiveArch: %{rust_arches}
- rust-iso8601
ExclusiveArch: %{rust_arches}
- rust-itertools
ExclusiveArch: %{rust_arches}
- rust-josekit
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder
ExclusiveArch: %{rust_arches}
- rust-jpeg-decoder0.1
ExclusiveArch: %{rust_arches}
- rust-json5
ExclusiveArch: %{rust_arches}
- rust-k9
ExclusiveArch: %{rust_arches}
- rust-konst
ExclusiveArch: %{rust_arches}
- rust-konst_macro_rules
ExclusiveArch: %{rust_arches}
- rust-konst_proc_macros
ExclusiveArch: %{rust_arches}
- rust-krunvm
ExclusiveArch: x86_64 aarch64
- rust-kstring
ExclusiveArch: %{rust_arches}
- rust-kvm-bindings
ExclusiveArch: %{rust_arches}
- rust-kvm-ioctls
ExclusiveArch: x86_64 aarch64
- rust-language-tags
ExclusiveArch: %{rust_arches}
- rust-lebe
ExclusiveArch: %{rust_arches}
- rust-lev_distance
ExclusiveArch: %{rust_arches}
- rust-libseccomp-sys
ExclusiveArch: %{rust_arches}
- rust-libslirp
ExclusiveArch: %{rust_arches}
- rust-libslirp-sys
ExclusiveArch: %{rust_arches}
- rust-libsodium-sys
ExclusiveArch: %{rust_arches}
- rust-linked-hash-map
ExclusiveArch: %{rust_arches}
- rust-local-channel
ExclusiveArch: %{rust_arches}
- rust-local-encoding
ExclusiveArch: %{rust_arches}
- rust-local-waker
ExclusiveArch: %{rust_arches}
- rust-local_ipaddress
ExclusiveArch: %{rust_arches}
- rust-log
ExclusiveArch: %{rust_arches}
- rust-loopdev
ExclusiveArch: %{rust_arches}
- rust-lsd
ExclusiveArch: %{rust_arches}
- rust-madvr_parse
ExclusiveArch: %{rust_arches}
- rust-mailparse
ExclusiveArch: %{rust_arches}
- rust-md-5
ExclusiveArch: %{rust_arches}
- rust-memcached-rs
ExclusiveArch: %{rust_arches}
- rust-memchr
ExclusiveArch: %{rust_arches}
- rust-micro-timer
ExclusiveArch: %{rust_arches}
- rust-micro-timer-macros
ExclusiveArch: %{rust_arches}
- rust-mint
ExclusiveArch: %{rust_arches}
- rust-mockall_double
ExclusiveArch: %{rust_arches}
- rust-nanorand
ExclusiveArch: %{rust_arches}
- rust-navi
ExclusiveArch: %{rust_arches}
- rust-netstat2
ExclusiveArch: %{rust_arches}
- rust-nix0.22
ExclusiveArch: %{rust_arches}
- rust-num-bigint-dig
ExclusiveArch: %{rust_arches}
- rust-num-integer
ExclusiveArch: %{rust_arches}
- rust-num-iter
ExclusiveArch: %{rust_arches}
- rust-num-rational
ExclusiveArch: %{rust_arches}
- rust-num-traits
ExclusiveArch: %{rust_arches}
- rust-oid
ExclusiveArch: %{rust_arches}
- rust-onig
ExclusiveArch: %{rust_arches}
- rust-openat-ext
ExclusiveArch: %{rust_arches}
- rust-opener
ExclusiveArch: %{rust_arches}
- rust-openssl-kdf
ExclusiveArch: %{rust_arches}
- rust-openssl-probe
ExclusiveArch: %{rust_arches}
- rust-ordered-float2
ExclusiveArch: %{rust_arches}
- rust-os-release
ExclusiveArch: %{rust_arches}
- rust-os_display
ExclusiveArch: %{rust_arches}
- rust-os_type
ExclusiveArch: %{rust_arches}
- rust-pager
ExclusiveArch: %{rust_arches}
- rust-parking_lot
ExclusiveArch: %{rust_arches}
- rust-parking_lot0.11
ExclusiveArch: %{rust_arches}
- rust-passwd
ExclusiveArch: %{rust_arches}
- rust-pathdiff
ExclusiveArch: %{rust_arches}
- rust-pathsearch
ExclusiveArch: %{rust_arches}
- rust-percent-encoding
ExclusiveArch: %{rust_arches}
- rust-petgraph0.5
ExclusiveArch: %{rust_arches}
- rust-phf
ExclusiveArch: %{rust_arches}
- rust-phf_macros
ExclusiveArch: %{rust_arches}
- rust-phf_shared
ExclusiveArch: %{rust_arches}
- rust-picky-asn1
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-der
ExclusiveArch: %{rust_arches}
- rust-picky-asn1-x509
ExclusiveArch: %{rust_arches}
- rust-pin-project-lite
ExclusiveArch: %{rust_arches}
- rust-pkcs1
ExclusiveArch: %{rust_arches}
- rust-pq-sys
ExclusiveArch: %{rust_arches}
- rust-pretty-bytes
ExclusiveArch: %{rust_arches}
- rust-pretty-hex
ExclusiveArch: %{rust_arches}
- rust-pretty_assertions
ExclusiveArch: %{rust_arches}
- rust-prettytable-rs
ExclusiveArch: %{rust_arches}
- rust-primal-bit
ExclusiveArch: %{rust_arches}
- rust-primal-check
ExclusiveArch: %{rust_arches}
- rust-primal-estimate
ExclusiveArch: %{rust_arches}
- rust-procfs0.9
ExclusiveArch: %{rust_arches}
- rust-procs
ExclusiveArch: %{rust_arches}
- rust-prost
ExclusiveArch: %{rust_arches}
- rust-prost-derive
ExclusiveArch: %{rust_arches}
- rust-prost-derive0.8
ExclusiveArch: %{rust_arches}
- rust-prost0.8
ExclusiveArch: %{rust_arches}
- rust-psa-crypto
ExclusiveArch: %{rust_arches}
- rust-psa-crypto-sys
ExclusiveArch: %{rust_arches}
- rust-psl-types
ExclusiveArch: %{rust_arches}
- rust-psm
ExclusiveArch: %{rust_arches}
- rust-pwd
ExclusiveArch: %{rust_arches}
- rust-python-launcher
ExclusiveArch: %{rust_arches}
- rust-quick-xml0.22
ExclusiveArch: %{rust_arches}
- rust-r2d2
ExclusiveArch: %{rust_arches}
- rust-rand
ExclusiveArch: %{rust_arches}
- rust-rand_core
ExclusiveArch: %{rust_arches}
- rust-rand_distr
ExclusiveArch: %{rust_arches}
- rust-rand_isaac
ExclusiveArch: %{rust_arches}
- rust-rav1e
ExclusiveArch: %{rust_arches}
- rust-rd-agent
ExclusiveArch: %{rust_arches}
- rust-rd-agent-intf
ExclusiveArch: %{rust_arches}
- rust-rd-hashd
ExclusiveArch: %{rust_arches}
- rust-rd-hashd-intf
ExclusiveArch: %{rust_arches}
- rust-rd-util
ExclusiveArch: %{rust_arches}
- rust-resctl-bench
ExclusiveArch: %{rust_arches}
- rust-resctl-bench-intf
ExclusiveArch: %{rust_arches}
- rust-resctl-demo
ExclusiveArch: %{rust_arches}
- rust-retry
ExclusiveArch: %{rust_arches}
- rust-rle-decode-fast
ExclusiveArch: %{rust_arches}
- rust-rmp
ExclusiveArch: %{rust_arches}
- rust-rmpv
ExclusiveArch: %{rust_arches}
- rust-rpick
ExclusiveArch: %{rust_arches}
- rust-rustcat
ExclusiveArch: %{rust_arches}
- rust-rustfix
ExclusiveArch: %{rust_arches}
- rust-schemafy_core
ExclusiveArch: %{rust_arches}
- rust-schemafy_lib
ExclusiveArch: %{rust_arches}
- rust-scroll
ExclusiveArch: %{rust_arches}
- rust-seahash
ExclusiveArch: %{rust_arches}
- rust-secret-service
ExclusiveArch: %{rust_arches}
- rust-sequoia-sqv
ExclusiveArch: %{rust_arches}
- rust-serde-big-array
ExclusiveArch: %{rust_arches}
- rust-serde_qs
ExclusiveArch: %{rust_arches}
- rust-serde_urlencoded
ExclusiveArch: %{rust_arches}
- rust-serde_with
ExclusiveArch: %{rust_arches}
- rust-serde_with_macros
ExclusiveArch: %{rust_arches}
- rust-serde_yaml0.8
ExclusiveArch: %{rust_arches}
- rust-serial_test0.5
ExclusiveArch: %{rust_arches}
- rust-serial_test_derive0.5
ExclusiveArch: %{rust_arches}
- rust-sev
ExclusiveArch: x86_64
- rust-sevctl
ExclusiveArch: x86_64
- rust-sha1
ExclusiveArch: %{rust_arches}
- rust-sharded-slab
ExclusiveArch: %{rust_arches}
- rust-shell-words
ExclusiveArch: %{rust_arches}
- rust-shellexpand
ExclusiveArch: %{rust_arches}
- rust-signal-hook-mio
ExclusiveArch: %{rust_arches}
- rust-silver
ExclusiveArch: %{rust_arches}
- rust-similar-asserts
ExclusiveArch: %{rust_arches}
- rust-simple_asn1
ExclusiveArch: %{rust_arches}
- rust-simple_logger
ExclusiveArch: %{rust_arches}
- rust-sinit
ExclusiveArch: %{rust_arches}
- rust-siphasher
ExclusiveArch: %{rust_arches}
- rust-slog-term
ExclusiveArch: %{rust_arches}
- rust-smallvec
ExclusiveArch: %{rust_arches}
- rust-spin0.5
ExclusiveArch: %{rust_arches}
- rust-ssh-key-dir
ExclusiveArch: %{rust_arches}
- rust-stacker
ExclusiveArch: %{rust_arches}
- rust-statrs
ExclusiveArch: %{rust_arches}
- rust-strict
ExclusiveArch: %{rust_arches}
- rust-string_cache_codegen
ExclusiveArch: %{rust_arches}
- rust-structopt
ExclusiveArch: %{rust_arches}
- rust-strum
ExclusiveArch: %{rust_arches}
- rust-strum0.21
ExclusiveArch: %{rust_arches}
- rust-strum_macros
ExclusiveArch: %{rust_arches}
- rust-strum_macros0.21
ExclusiveArch: %{rust_arches}
- rust-sval
ExclusiveArch: %{rust_arches}
- rust-sval_derive
ExclusiveArch: %{rust_arches}
- rust-sval_json
ExclusiveArch: %{rust_arches}
- rust-syntect
ExclusiveArch: %{rust_arches}
- rust-syntect4
ExclusiveArch: %{rust_arches}
- rust-sysinfo0.19
ExclusiveArch: %{rust_arches}
- rust-tar
ExclusiveArch: %{rust_arches}
- rust-temp_testdir
ExclusiveArch: %{rust_arches}
- rust-temptree
ExclusiveArch: %{rust_arches}
- rust-tendril
ExclusiveArch: %{rust_arches}
- rust-term_size
ExclusiveArch: %{rust_arches}
- rust-termbg
ExclusiveArch: %{rust_arches}
- rust-textwrap0.14
ExclusiveArch: %{rust_arches}
- rust-tiff
ExclusiveArch: %{rust_arches}
- rust-tiff0.6
ExclusiveArch: %{rust_arches}
- rust-timebomb
ExclusiveArch: %{rust_arches}
- rust-tiny_http
ExclusiveArch: %{rust_arches}
- rust-tinyvec
ExclusiveArch: %{rust_arches}
- rust-tokei
ExclusiveArch: %{rust_arches}
- rust-tokio-compat
ExclusiveArch: %{rust_arches}
- rust-tokio-util0.6
ExclusiveArch: %{rust_arches}
- rust-totp-lite
ExclusiveArch: %{rust_arches}
- rust-tower-layer
ExclusiveArch: %{rust_arches}
- rust-tower-service
ExclusiveArch: %{rust_arches}
- rust-tpm2-policy
ExclusiveArch: %{rust_arches}
- rust-tracing-log
ExclusiveArch: %{rust_arches}
- rust-trash
ExclusiveArch: %{rust_arches}
- rust-tree-sitter
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-cli
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-config
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-highlight
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-loader
ExclusiveArch: %{rust_arches}
- rust-tree-sitter-tags
ExclusiveArch: %{rust_arches}
- rust-ttf-parser0.12
ExclusiveArch: %{rust_arches}
- rust-tui-react
ExclusiveArch: %{rust_arches}
- rust-tuikit
ExclusiveArch: %{rust_arches}
- rust-typed-arena1
ExclusiveArch: %{rust_arches}
- rust-tzfile
ExclusiveArch: %{rust_arches}
- rust-ubyte
ExclusiveArch: %{rust_arches}
- rust-ucd-parse
ExclusiveArch: %{rust_arches}
- rust-ucd-trie
ExclusiveArch: %{rust_arches}
- rust-uefi-run
ExclusiveArch: %{rust_arches}
- rust-unicode-linebreak
ExclusiveArch: %{rust_arches}
- rust-unicode-normalization
ExclusiveArch: %{rust_arches}
- rust-unicode-width
ExclusiveArch: %{rust_arches}
- rust-unicode-xid
ExclusiveArch: %{rust_arches}
- rust-uriparse
ExclusiveArch: %{rust_arches}
- rust-urlencoding
ExclusiveArch: %{rust_arches}
- rust-utf8-width
ExclusiveArch: %{rust_arches}
- rust-uucore
ExclusiveArch: %{rust_arches}
- rust-uucore_procs
ExclusiveArch: %{rust_arches}
- rust-uuid0.8
ExclusiveArch: %{rust_arches}
- rust-v_frame
ExclusiveArch: %{rust_arches}
- rust-value-bag
ExclusiveArch: %{rust_arches}
- rust-varlink-cli
ExclusiveArch: %{rust_arches}
- rust-varlink_generator
ExclusiveArch: %{rust_arches}
- rust-varlink_parser
ExclusiveArch: %{rust_arches}
- rust-version-sync
ExclusiveArch: %{rust_arches}
- rust-version_check
ExclusiveArch: %{rust_arches}
- rust-vhost-user-backend
ExclusiveArch: %{rust_arches}
- rust-virtio-bindings
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vmm-sys-util
ExclusiveArch: x86_64 aarch64 ppc64le
- rust-vtparse
ExclusiveArch: %{rust_arches}
- rust-web-ext-native-messaging
ExclusiveArch: %{rust_arches}
- rust-webbrowser
ExclusiveArch: %{rust_arches}
- rust-weezl
ExclusiveArch: %{rust_arches}
- rust-wezterm-color-types
ExclusiveArch: %{rust_arches}
- rust-wezterm-dynamic
ExclusiveArch: %{rust_arches}
- rust-wezterm-dynamic-derive
ExclusiveArch: %{rust_arches}
- rust-wild
ExclusiveArch: %{rust_arches}
- rust-xkbcommon
ExclusiveArch: %{rust_arches}
- rust-xxhash-c-sys
ExclusiveArch: %{rust_arches}
- rust-xxhash-rust
ExclusiveArch: %{rust_arches}
- rust-xz2
ExclusiveArch: %{rust_arches}
- rust-yansi
ExclusiveArch: %{rust_arches}
- rust-z85
ExclusiveArch: %{rust_arches}
- rust-zbus1
ExclusiveArch: %{rust_arches}
- rust-zbus_macros1
ExclusiveArch: %{rust_arches}
- rust-zincati
ExclusiveArch: %{rust_arches}
- rust-zvariant2
ExclusiveArch: %{rust_arches}
- rust-zvariant_derive2
ExclusiveArch: %{rust_arches}
- s390utils
ExclusiveArch: s390 s390x
- safetyblanket
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc64le
- sagemath
ExclusiveArch: aarch64 x86_64
- sat4j
ExclusiveArch: %{java_arches} noarch
- sbcl
ExclusiveArch: %{arm} %{ix86} x86_64 ppc sparcv9 aarch64
- sbd
ExclusiveArch: i686 x86_64 s390x aarch64 ppc64le
- sblim-cim-client
ExclusiveArch: %{java_arches} noarch
- sblim-cim-client2
ExclusiveArch: %{java_arches} noarch
- sbsigntools
ExclusiveArch: x86_64 aarch64 %{arm} %{ix86}
- scala
ExclusiveArch: %{java_arches} noarch
- scalacheck
ExclusiveArch: %{java_arches} noarch
- scannotation
ExclusiveArch: %{java_arches} noarch
- sdljava
ExclusiveArch: %{java_arches}
- sdrangel
ExclusiveArch: %{qt5_qtwebengine_arches}
- sdsl-lite
ExclusiveArch: %{power64} x86_64 aarch64
- seabios
ExclusiveArch: x86_64
- seadrive-gui
ExclusiveArch: %{qt5_qtwebengine_arches}
- seafile-client
ExclusiveArch: %{qt5_qtwebengine_arches}
- seamonkey
ExclusiveArch: x86_64
- seqan3
ExclusiveArch: %{power64} x86_64 aarch64
- sequence-library
ExclusiveArch: %{java_arches} noarch
- serp
ExclusiveArch: %{java_arches} noarch
- servicelog
ExclusiveArch: ppc %{power64}
- shaman
ExclusiveArch: %{java_arches} noarch
- sharpfont
ExclusiveArch: %mono_arches
- sharpziplib
ExclusiveArch: %{mono_arches}
- shim
ExclusiveArch: %{efi}
- shim-unsigned-aarch64
ExclusiveArch: aarch64
- shim-unsigned-x64
ExclusiveArch: x86_64
- sigul
ExclusiveArch: x86_64
- singularity-ce
ExclusiveArch: %{go_arches}
- sisu
ExclusiveArch: %{java_arches} noarch
- sisu-mojos
ExclusiveArch: %{java_arches} noarch
- skopeo
ExclusiveArch: %{golang_arches_future}
- skychart
ExclusiveArch: %{fpc_arches}
- slf4j
ExclusiveArch: %{java_arches} noarch
- slirp4netns
ExclusiveArch: %{golang_arches_future}
- snakeyaml
ExclusiveArch: %{java_arches} noarch
- snapd
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm} aarch64 ppc64le s390x}
- snip
ExclusiveArch: %{java_arches} noarch
- softnet-stat
ExclusiveArch: %{rust_arches}
- soup-sharp
ExclusiveArch: %{mono_arches}
- spacebar
ExclusiveArch: %{java_arches}
- sparkleshare
ExclusiveArch: %{mono_arches}
- spec-version-maven-plugin
ExclusiveArch: %{java_arches} noarch
- spicctrl
ExclusiveArch: %{ix86} x86_64
- spice
ExclusiveArch: x86_64
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- spice-parent
ExclusiveArch: %{java_arches} noarch
- springlobby
ExclusiveArch: %{ix86} x86_64
- sqljet
ExclusiveArch: %{java_arches} noarch
- squeekboard
ExclusiveArch: %{rust_arches}
- startdde
ExclusiveArch: %{?go_arches:%{go_arches}}%{!?go_arches:%{ix86} x86_64 %{arm}}
- stats-collect
ExclusiveArch: %{ix86} x86_64 noarch
- statsd
ExclusiveArch: %{nodejs_arches} noarch
- stratis-cli
ExclusiveArch: %{rust_arches} noarch
- stratisd
ExclusiveArch: %{rust_arches}
ExclusiveArch: %{rust_arches}
ExclusiveArch: %{rust_arches}
- string-template-maven-plugin
ExclusiveArch: %{java_arches} noarch
- stringtemplate
ExclusiveArch: %{java_arches} noarch
- stringtemplate4
ExclusiveArch: %{java_arches} noarch
- stripesnoop
ExclusiveArch: %{ix86} x86_64
- subscription-manager-cockpit
ExclusiveArch: %{nodejs_arches} noarch
- supercollider
ExclusiveArch: %{qt5_qtwebengine_arches}
- supermin
ExclusiveArch: %{kernel_arches}
- svnkit
ExclusiveArch: %{java_arches} noarch
- svt-vp9
ExclusiveArch: x86_64
- swift-lang
ExclusiveArch: x86_64 aarch64
- swing-layout
ExclusiveArch: %{java_arches} noarch
- sysbench
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips} aarch64 ppc64le s390x
- syslinux
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86} x86_64
- system-rules
ExclusiveArch: %{java_arches} noarch
- system76-keyboard-configurator
ExclusiveArch: %{rust_arches}
- systemd-boot
ExclusiveArch: %efi
- t-digest
ExclusiveArch: %{java_arches} noarch
- taglib-sharp
ExclusiveArch: %{mono_arches}
- tagsoup
ExclusiveArch: %{java_arches} noarch
- tarantool
ExclusiveArch: %{ix86} x86_64
- tboot
ExclusiveArch: %{ix86} x86_64
- tdlib
ExclusiveArch: x86_64 aarch64
- templates_parser
ExclusiveArch: %GPRbuild_arches
- ternimal
ExclusiveArch: %{rust_arches}
- test-interface
ExclusiveArch: %{java_arches} noarch
- testcloud
ExclusiveArch: %{kernel_arches} noarch
- testng
ExclusiveArch: %{java_arches} noarch
- texlive
ExclusiveArch: %{java_arches} noarch
- thermald
ExclusiveArch: %{ix86} x86_64
- tilix
ExclusiveArch: %{ldc_arches}
- tomboy
ExclusiveArch: %{mono_arches}
- tomcat
ExclusiveArch: %{java_arches} noarch
- tomcat-native
ExclusiveArch: %{java_arches}
- tomcat-taglibs-parent
ExclusiveArch: %{java_arches} noarch
- tomcatjss
ExclusiveArch: %{java_arches} noarch
- torbrowser-launcher
ExclusiveArch: %{ix86} x86_64
- treelayout
ExclusiveArch: %{java_arches} noarch
- trilead-ssh2
ExclusiveArch: %{java_arches} noarch
- truth
ExclusiveArch: %{java_arches} noarch
- tuned-profiles-nfv-host-bin
ExclusiveArch: %{ix86} x86_64
- typescript
ExclusiveArch: %{nodejs_arches} noarch
- uClibc
ExclusiveArch: %{arm} %{ix86} x86_64 %{mips}
- ucx
ExclusiveArch: aarch64 ppc64le x86_64
- uglify-js
ExclusiveArch: %{nodejs_arches} noarch
- umr
ExclusiveArch: x86_64 aarch64 ppc64le
- unetbootin
ExclusiveArch: %{ix86} x86_64
- univocity-parsers
ExclusiveArch: %{java_arches} noarch
- ursa-major
ExclusiveArch: noarch aarch64 ppc64le s390x x86_64
- usd
ExclusiveArch: aarch64 x86_64
- v8-314
ExclusiveArch: %{ix86} x86_64 %{arm} mips mipsel ppc ppc64
- vakzination
ExclusiveArch: %{java_arches}
- valgrind
ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7hl aarch64
- vboot-utils
ExclusiveArch: %{arm} aarch64 %{ix86} x86_64
- vecmath1.2
ExclusiveArch: %{java_arches} noarch
- velocity
ExclusiveArch: %{java_arches} noarch
- vim-go
ExclusiveArch: %{?golang_arches}%{!?golang_arches:%{ix86} x86_64 %{arm}}
- vim-syntastic
ExclusiveArch: %{java_arches} noarch
- virt-p2v
ExclusiveArch: x86_64
- virt-v2v
ExclusiveArch: x86_64
- virtiofsd
ExclusiveArch: %{rust_arches}
- virtualbox-guest-additions
ExclusiveArch: i686 x86_64
- vkd3d
ExclusiveArch: %{ix86} x86_64 %{arm}
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- vmaf
ExclusiveArch: x86_64
- voms-api-java
ExclusiveArch: %{java_arches} noarch
- voms-clients-java
ExclusiveArch: %{java_arches} noarch
- vrq
ExclusiveArch: %{ix86} x86_64
- wangle
ExclusiveArch: x86_64 aarch64 ppc64le
- warsow
ExclusiveArch: %{ix86} x86_64 %{arm}
- warsow-data
ExclusiveArch: %{ix86} x86_64 %{arm} noarch
ExclusiveArch: %{ix86} x86_64 %{arm}
- wasmedge
ExclusiveArch: x86_64 aarch64
- watchman
ExclusiveArch: x86_64 aarch64 ppc64le
- wdt
ExclusiveArch: x86_64 aarch64 ppc64le
- webkit2-sharp
ExclusiveArch: %mono_arches
- weld-parent
ExclusiveArch: %{java_arches} noarch
- why3
ExclusiveArch: %{java_arches}
- wine
ExclusiveArch: %{ix86} x86_64 aarch64
ExclusiveArch: %{ix86} x86_64
ExclusiveArch: %{ix86}
- wine-dxvk
ExclusiveArch: %{ix86} x86_64
- winetricks
ExclusiveArch: %{ix86} x86_64 %{arm} aarch64
- ws-commons-util
ExclusiveArch: %{java_arches} noarch
- wsdl4j
ExclusiveArch: %{java_arches} noarch
- wult
ExclusiveArch: x86_64
- wxMaxima
ExclusiveArch: %{arm} %{ix86} x86_64 aarch64 ppc sparcv9
- x2goclient
ExclusiveArch: x86_64
- x86-simd-sort
ExclusiveArch: x86_64
- xalan-j2
ExclusiveArch: %{java_arches} noarch
- xbean
ExclusiveArch: %{java_arches} noarch
- xbyak
ExclusiveArch: x86_64
- xbyak_aarch64
ExclusiveArch: aarch64
- xe-guest-utilities-latest
ExclusiveArch: %{ix86} x86_64
- xen
ExclusiveArch: x86_64 aarch64
- xerces-j2
ExclusiveArch: %{java_arches} noarch
- xgap
ExclusiveArch: %{gap_arches}
- xml-commons-apis
ExclusiveArch: %{java_arches} noarch
- xml-commons-resolver
ExclusiveArch: %{java_arches} noarch
- xml-maven-plugin
ExclusiveArch: %{java_arches} noarch
- xmlada
ExclusiveArch: %{GPRbuild_arches}
- xmlgraphics-commons
ExclusiveArch: %{java_arches} noarch
- xmlpull
ExclusiveArch: %{java_arches} noarch
- xmlstreambuffer
ExclusiveArch: %{java_arches} noarch
- xmlunit
ExclusiveArch: %{java_arches} noarch
- xmpcore
ExclusiveArch: %{java_arches} noarch
- xmvn
ExclusiveArch: %{java_arches} noarch
- xmvn-connector-ivy
ExclusiveArch: %{java_arches} noarch
- xmvn-generator
ExclusiveArch: %{java_arches}
- xorg-x11-drv-armsoc
ExclusiveArch: %{arm} aarch64
- xorg-x11-drv-intel
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-openchrome
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vesa
ExclusiveArch: %{ix86} x86_64
- xorg-x11-drv-vmware
ExclusiveArch: %{ix86} x86_64 ia64
- xsp
ExclusiveArch: %mono_arches
- xstream
ExclusiveArch: %{java_arches} noarch
- xz-java
ExclusiveArch: %{java_arches} noarch
- yarnpkg
ExclusiveArch: %{nodejs_arches} noarch
- zcfan
ExclusiveArch: x86_64
- zeal
ExclusiveArch: aarch64 x86_64
- zenon
ExclusiveArch: %{java_arches}
- zeromq-ada
ExclusiveArch: %{GPRbuild_arches}
- zig
ExclusiveArch: %{zig_arches}
- zlib-ada
ExclusiveArch: %{GPRbuild_arches}
- zlib-ng
ExclusiveArch: aarch64 i686 ppc64le s390x x86_64
- zola
ExclusiveArch: %{rust_arches}
10 months, 1 week