if (WARN_ON(!wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp, msecs_to_jiffies(3000)))) { kbasep_print(kbpr, "Failed to wait for completion of dump request\\n"); timed_out = true; }
mutex_lock(&kctx->csf.lock); if (!timed_out && kctx->csf.cpu_queue.buffer) { WARN_ON(atomic_read(&kctx->csf.cpu_queue.dump_req_status) != BASE_CSF_CPU_QUEUE_DUMP_PENDING);
/* The CPU queue dump is returned as a single formatted string */ kbasep_puts(kbpr, kctx->csf.cpu_queue.buffer); kbasep_puts(kbpr, "\\n");
此时可以自然地想到 Mali 作为 GPU 驱动所提供的直接处理内存的能力,而且从 Mali 拿到的内存可以被直接映射到用户态,非常好用。Mali 的 mem pool allocator 会在 mem pool 中的 page 不足时直接从 buddy allocator 拿 page,只要一次性申请大量的 GPU 内存,就可以拿到刚 kfree 到 buddy allocator 的 page。
diff --git a/driver-r52p0/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c b/driver-r53p0/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c index 087cdb4..2a1bdaa 100644 --- a/driver-r52p0/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c +++ b/driver-r53p0/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note /* * - * (C) COPYRIGHT 2023 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2023-2024 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -93,6 +93,8 @@ int kbase_csf_cpu_queue_dump_buffer(struct kbase_context *kctx, u64 buffer, size int kbasep_csf_cpu_queue_dump_print(struct kbase_context *kctx, struct kbasep_printer *kbpr) { + bool timed_out = false; + mutex_lock(&kctx->csf.lock); if (atomic_read(&kctx->csf.cpu_queue.dump_req_status) != BASE_CSF_CPU_QUEUE_DUMP_COMPLETE) { kbasep_print(kbpr, "Dump request already started! (try again)\\n"); @@ -108,10 +110,14 @@ int kbasep_csf_cpu_queue_dump_print(struct kbase_context *kctx, struct kbasep_pr kbasep_print(kbpr, "CPU Queues table (version:v" __stringify( MALI_CSF_CPU_QUEUE_DUMP_VERSION) "):\\n"); - wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp, msecs_to_jiffies(3000)); + if (WARN_ON(!wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp, + msecs_to_jiffies(3000)))) { + kbasep_print(kbpr, "Failed to wait for completion of dump request\\n"); + timed_out = true; + } mutex_lock(&kctx->csf.lock); - if (kctx->csf.cpu_queue.buffer) { + if (!timed_out && kctx->csf.cpu_queue.buffer) { WARN_ON(atomic_read(&kctx->csf.cpu_queue.dump_req_status) != BASE_CSF_CPU_QUEUE_DUMP_PENDING); /* The CPU queue dump is returned as a single formatted string */ @@ -122,7 +128,7 @@ int kbasep_csf_cpu_queue_dump_print(struct kbase_context *kctx, struct kbasep_pr kctx->csf.cpu_queue.buffer = NULL; kctx->csf.cpu_queue.buffer_size = 0; } else - kbasep_print(kbpr, "Dump error! (time out)\\n"); + kbasep_print(kbpr, "Dump error! (timed_out = %d)\\n", timed_out); atomic_set(&kctx->csf.cpu_queue.dump_req_status, BASE_CSF_CPU_QUEUE_DUMP_COMPLETE);
diff --git a/driver-r54p0/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c b/driver-r54p1/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c index 2a1bdaa..087cdb4 100644 --- a/driver-r54p0/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c +++ b/driver-r54p1/drivers/gpu/arm/midgard/csf/mali_kbase_csf_cpu_queue.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note /* * - * (C) COPYRIGHT 2023-2024 ARM Limited. All rights reserved. + * (C) COPYRIGHT 2023 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software @@ -93,8 +93,6 @@ int kbase_csf_cpu_queue_dump_buffer(struct kbase_context *kctx, u64 buffer, size int kbasep_csf_cpu_queue_dump_print(struct kbase_context *kctx, struct kbasep_printer *kbpr) { - bool timed_out = false; - mutex_lock(&kctx->csf.lock); if (atomic_read(&kctx->csf.cpu_queue.dump_req_status) != BASE_CSF_CPU_QUEUE_DUMP_COMPLETE) { kbasep_print(kbpr, "Dump request already started! (try again)\\n"); @@ -110,14 +108,10 @@ int kbasep_csf_cpu_queue_dump_print(struct kbase_context *kctx, struct kbasep_pr kbasep_print(kbpr, "CPU Queues table (version:v" __stringify( MALI_CSF_CPU_QUEUE_DUMP_VERSION) "):\\n"); - if (WARN_ON(!wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp, - msecs_to_jiffies(3000)))) { - kbasep_print(kbpr, "Failed to wait for completion of dump request\\n"); - timed_out = true; - } + wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp, msecs_to_jiffies(3000)); mutex_lock(&kctx->csf.lock); - if (!timed_out && kctx->csf.cpu_queue.buffer) { + if (kctx->csf.cpu_queue.buffer) { WARN_ON(atomic_read(&kctx->csf.cpu_queue.dump_req_status) != BASE_CSF_CPU_QUEUE_DUMP_PENDING); /* The CPU queue dump is returned as a single formatted string */ @@ -128,7 +122,7 @@ int kbasep_csf_cpu_queue_dump_print(struct kbase_context *kctx, struct kbasep_pr kctx->csf.cpu_queue.buffer = NULL; kctx->csf.cpu_queue.buffer_size = 0; } else - kbasep_print(kbpr, "Dump error! (timed_out = %d)\\n", timed_out); + kbasep_print(kbpr, "Dump error! (time out)\\n"); atomic_set(&kctx->csf.cpu_queue.dump_req_status, BASE_CSF_CPU_QUEUE_DUMP_COMPLETE);
A local non-privileged user process can perform improper GPU processing operations to expose sensitive data. This issue has been assigned the identifier CVE-2025-2879.
A local non-privileged user process can perform improper GPU memory processing operations to gain access to already freed memory. This issue has been assigned the identifier CVE-2025-6349.
A local non-privileged user process can perform improper GPU processing operations to gain access to already freed memory. This issue has been assigned the identifier CVE-2025-8045.
影响范围分别为:
CVE-2025-2879: All versions from r29p0-r49p4, r50p0-r54p0