[igt-dev] [PATCH i-g-t 07/12] i915/gem_mmap_offset: Verify all regions with ptrace
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Fri Sep 2 03:46:26 UTC 2022
On Thu, Sep 01, 2022 at 01:44:37PM +0200, Zbigniew Kempczyński wrote:
> From: Chris Wilson <chris.p.wilson at intel.com>
>
> Check we can use ptrace to query *ptr of each mmap for each region.
Looks we haven't checked local memory before, so:
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
--
Zbigniew
>
> Signed-off-by: Chris Wilson <chris.p.wilson at intel.com>
> ---
> tests/i915/gem_mmap_offset.c | 84 ++++++++++++++++++++----------------
> 1 file changed, 46 insertions(+), 38 deletions(-)
>
> diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
> index faadbd4ee6..806a9d68f4 100644
> --- a/tests/i915/gem_mmap_offset.c
> +++ b/tests/i915/gem_mmap_offset.c
> @@ -370,64 +370,72 @@ static void test_ptrace(int i915)
> const unsigned int SZ = 3 * 4096;
> unsigned long *ptr, *cpy;
> unsigned long AA, CC;
> - uint32_t bo;
>
> memset(&AA, 0xaa, sizeof(AA));
> memset(&CC, 0x55, sizeof(CC));
>
> cpy = malloc(SZ);
> - bo = gem_create(i915, SZ);
> + igt_assert(cpy);
>
> - for_each_mmap_offset_type(i915, t) {
> - ptr = __mmap_offset(i915, bo, 0, SZ,
> - PROT_READ | PROT_WRITE,
> - t->type);
> - if (!ptr)
> - continue;
> + for_each_memory_region(r, i915) {
> + uint64_t size = SZ;
> + uint32_t bo;
>
> - igt_dynamic_f("%s", t->name) {
> - pid_t pid;
> + igt_assert_eq(__gem_create_in_memory_region_list(i915, &bo, &size, 0, &r->ci, 1), 0);
> + make_resident(i915, 0, bo);
>
> - memset(cpy, AA, SZ);
> - memset(ptr, CC, SZ);
> + for_each_mmap_offset_type(i915, t) {
> + ptr = __mmap_offset(i915, bo, 0, size,
> + PROT_READ | PROT_WRITE,
> + t->type);
> + if (!ptr)
> + continue;
>
> - igt_assert(!memchr_inv(ptr, CC, SZ));
> - igt_assert(!memchr_inv(cpy, AA, SZ));
> + igt_dynamic_f("%s-%s", r->name, t->name) {
> + pid_t pid;
>
> - igt_fork(child, 1) {
> - ptrace(PTRACE_TRACEME, 0, NULL, NULL);
> - raise(SIGSTOP);
> - }
> + memset(cpy, AA, SZ);
> + memset(ptr, CC, SZ);
>
> - /* Wait for the child to ready themselves [SIGSTOP] */
> - pid = wait(NULL);
> + igt_assert(!memchr_inv(ptr, CC, SZ));
> + igt_assert(!memchr_inv(cpy, AA, SZ));
>
> - ptrace(PTRACE_ATTACH, pid, NULL, NULL);
> - for (int i = 0; i < SZ / sizeof(long); i++) {
> - long ret;
> + igt_fork(child, 1) {
> + ptrace(PTRACE_TRACEME, 0, NULL, NULL);
> + raise(SIGSTOP);
> + }
>
> - ret = ptrace(PTRACE_PEEKDATA, pid, ptr + i);
> - igt_assert_eq_u64(ret, CC);
> - cpy[i] = ret;
> + /* Wait for the child to ready themselves [SIGSTOP] */
> + pid = wait(NULL);
>
> - ret = ptrace(PTRACE_POKEDATA, pid, ptr + i, AA);
> - igt_assert_eq(ret, 0l);
> - }
> - ptrace(PTRACE_DETACH, pid, NULL, NULL);
> + ptrace(PTRACE_ATTACH, pid, NULL, NULL);
> + for (int i = 0; i < SZ / sizeof(long); i++) {
> + long ret;
> +
> + ret = ptrace(PTRACE_PEEKDATA, pid, ptr + i);
> + igt_assert_eq_u64(ret, CC);
> + cpy[i] = ret;
> +
> + ret = ptrace(PTRACE_POKEDATA, pid, ptr + i, AA);
> + igt_assert_eq(ret, 0l);
> + }
> + ptrace(PTRACE_DETACH, pid, NULL, NULL);
>
> - /* Wakeup the child for it to exit */
> - kill(SIGCONT, pid);
> - igt_waitchildren();
> + /* Wakeup the child for it to exit */
> + kill(SIGCONT, pid);
> + igt_waitchildren();
>
> - /* The two buffers should now be swapped */
> - igt_assert(!memchr_inv(ptr, AA, SZ));
> - igt_assert(!memchr_inv(cpy, CC, SZ));
> + /* The two buffers should now be swapped */
> + igt_assert(!memchr_inv(ptr, AA, SZ));
> + igt_assert(!memchr_inv(cpy, CC, SZ));
> + }
> +
> + munmap(ptr, size);
> }
>
> - munmap(ptr, SZ);
> + gem_close(i915, bo);
> }
>
> - gem_close(i915, bo);
> free(cpy);
> }
>
> --
> 2.34.1
>
More information about the igt-dev
mailing list