From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9A83366546 for ; Fri, 16 Jan 2026 11:03:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768561421; cv=none; b=PqMRlr0Wr8BY2amQj8lQKQUG2xoDVEdsNs2b7k8vEPWJtYRDXknAs8ixXYkO62xJkYZ5EzfhTh0Byjldnpyq2Ayacc/doe1q2B/CQ0Tw3GNXu9JlJqhOyYxNt7jPJAIiR7bR08RSF8OqT5lnDCT0YnoyeWJGjKjoGT1tkwZgUyo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768561421; c=relaxed/simple; bh=KT7sSpPOVFq1dLJRYLfBJmzOQvCC3qG5DvqQjKnk6RY=; h=Message-ID:Date:MIME-Version:Subject:From:To:Cc:References: In-Reply-To:Content-Type; b=EXfL1vPlhC7Ir8tiWRRQoGt8fbapRD3SyOR46g0n9GXisG3Pw+RzEoEFxADK9+Ts0I3YK3O0MBbtYOzqeL13EEmECceDH2s4QAEuJUwku9Hi0lXHDAR49/VllArjwkfHvcgH8LRUgT+VpVWz4TgYcFDWmrEKONyQN5x4ax2tdSs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 645A2C116C6; Fri, 16 Jan 2026 11:03:39 +0000 (UTC) Message-ID: <5c2730c2-d969-44af-85f9-4d57c0ad387d@linux-m68k.org> Date: Fri, 16 Jan 2026 21:03:26 +1000 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] m68k: nommu: fix memmove() with differently aligned src and dest for 68000 From: Greg Ungerer To: Daniel Palmer , geert@linux-m68k.org Cc: linux-m68k@lists.linux-m68k.org, linux-kernel@vger.kernel.org References: <20251213120401.3992567-1-daniel@thingy.jp> Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Daniel, I'll add this to the m68knommu git tree, for-next branch. Thanks Greg On 19/12/25 21:58, Greg Ungerer wrote: > Hi Daniel, > > On 13/12/25 22:04, Daniel Palmer wrote: >> 68000 has different alignment needs to 68020+. >> memcpy() checks if the destination is aligned and does a smaller copy >> to fix the alignment and then critically for 68000 it checks if the >> source is still unaligned and if it is reverts to smaller copies. >> >> memmove() does not currently do the second part and malfunctions if >> one of the pointers is aligned and the other isn't. > > What is the nature of the failure, is it a trap? > > >> This is apparently getting triggered by printk. If I put breakpoints >> into the new checks added by this commit the first hit looks like this: >> >> memmove (n=205, src=0x2f3971 , dest=0x2f3980 ) at arch/m68k/lib/memmove.c:82 >> >> Signed-off-by: Daniel Palmer > > Seems to make sense from what we have in memcpy.c. > > Acked-by: Greg Ungerer > > Geert: if you are ok with this I can take it via the m68knommu tree? > > Regards > Greg > > > >> --- >> >> This is from my "make 68000 work again" backlog. >> >> I have had this fix for years and I think the few other people that >> have various 68000 hobby builds must have something similar. >> >> /root # uname -a >> uClinux buildroot 6.18.0-12420-gdc1a468a2724 #120 Sat Dec 13 20:42:45 JST 2025 m68k GNU/Linux >> /root # cat /proc/cpuinfo >> CPU:            68000 >> MMU:            none >> FPU:            none >> Clocking:       1179.1MHz >> BogoMips:       1758.00 >> Calibration:    879001600 loops >> /root # >> >>   arch/m68k/lib/memmove.c | 18 ++++++++++++++++++ >>   1 file changed, 18 insertions(+) >> >> diff --git a/arch/m68k/lib/memmove.c b/arch/m68k/lib/memmove.c >> index 6519f7f349f6..e33f00b02e4c 100644 >> --- a/arch/m68k/lib/memmove.c >> +++ b/arch/m68k/lib/memmove.c >> @@ -24,6 +24,15 @@ void *memmove(void *dest, const void *src, size_t n) >>               src = csrc; >>               n--; >>           } >> +#if defined(CONFIG_M68000) >> +        if ((long)src & 1) { >> +            char *cdest = dest; >> +            const char *csrc = src; >> +            for (; n; n--) >> +                *cdest++ = *csrc++; >> +            return xdest; >> +        } >> +#endif >>           if (n > 2 && (long)dest & 2) { >>               short *sdest = dest; >>               const short *ssrc = src; >> @@ -66,6 +75,15 @@ void *memmove(void *dest, const void *src, size_t n) >>               src = csrc; >>               n--; >>           } >> +#if defined(CONFIG_M68000) >> +        if ((long)src & 1) { >> +            char *cdest = dest; >> +            const char *csrc = src; >> +            for (; n; n--) >> +                *--cdest = *--csrc; >> +            return xdest; >> +        } >> +#endif >>           if (n > 2 && (long)dest & 2) { >>               short *sdest = dest; >>               const short *ssrc = src; >