On Sun, Apr 17, 2022 at 01:56:25PM -0700, Linus Torvalds wrote: > That 'movq %rcx,%rax' can't be right. The caller expects it to be zero > on input and stay zero on output. > > But I think "xorl %eax,%eax" is good, since %eax was used as a > temporary in that function. Yah, wanted to singlestep that whole asm anyway to make sure it is good. And just started going through it - I think it can be even optimized a bit to use %rax for the rest bytes and decrement it into 0 eventually. The "xorl %eax,%eax" is still there, though, in case we fault on the user access and so that we can clear it to the compiler's expectation. I've added comments too so that it is clear what happens at a quick glance. SYM_FUNC_START(clear_user_original) mov %rcx,%rax shr $3,%rcx # qwords and $7,%rax # rest bytes test %rcx,%rcx jz 1f # do the qwords first .p2align 4 0: movq $0,(%rdi) lea 8(%rdi),%rdi dec %rcx jnz 0b 1: test %rax,%rax jz 3f # now do the rest bytes 2: movb $0,(%rdi) inc %rdi decl %eax jnz 2b 3: xorl %eax,%eax RET -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette