root/arch/x86/boot/copy.S
/* SPDX-License-Identifier: GPL-2.0-only */
/* ----------------------------------------------------------------------- *
 *
 *   Copyright (C) 1991, 1992 Linus Torvalds
 *   Copyright 2007 rPath, Inc. - All Rights Reserved
 *
 * ----------------------------------------------------------------------- */

#include <linux/linkage.h>

/*
 * Memory copy routines
 */

        .code16
        .text

SYM_FUNC_START_NOALIGN(memcpy)
        pushw   %si
        pushw   %di
        movw    %ax, %di
        movw    %dx, %si
        pushw   %cx
        shrw    $2, %cx
        rep movsl
        popw    %cx
        andw    $3, %cx
        rep movsb
        popw    %di
        popw    %si
        retl
SYM_FUNC_END(memcpy)

SYM_FUNC_START_NOALIGN(memset)
        pushw   %di
        movw    %ax, %di
        movzbl  %dl, %eax
        imull   $0x01010101,%eax
        pushw   %cx
        shrw    $2, %cx
        rep stosl
        popw    %cx
        andw    $3, %cx
        rep stosb
        popw    %di
        retl
SYM_FUNC_END(memset)

SYM_FUNC_START_NOALIGN(copy_from_fs)
        pushw   %ds
        pushw   %fs
        popw    %ds
        calll   memcpy
        popw    %ds
        retl
SYM_FUNC_END(copy_from_fs)

SYM_FUNC_START_NOALIGN(copy_to_fs)
        pushw   %es
        pushw   %fs
        popw    %es
        calll   memcpy
        popw    %es
        retl
SYM_FUNC_END(copy_to_fs)