mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-04-29 04:04:05 +00:00
1. make memcpy_erms as a public API; add a new one memcpy_erms_backwards, which supports to copy data from tail to head. 2. improve to use right/left/home/end key to move cursor, and support delete/backspace key to modify current input command. Tracked-On: #7931 Signed-off-by: Minggui Cao <minggui.cao@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
71 lines
1.6 KiB
C
71 lines
1.6 KiB
C
/*
|
|
* Copyright (C) 2018-2022 Intel Corporation.
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#include <types.h>
|
|
|
|
static inline void memset_erms(void *base, uint8_t v, size_t n)
|
|
{
|
|
asm volatile("rep ; stosb"
|
|
: "+D"(base)
|
|
: "a" (v), "c"(n));
|
|
}
|
|
|
|
void *memset(void *base, uint8_t v, size_t n)
|
|
{
|
|
/*
|
|
* Some CPUs support enhanced REP MOVSB/STOSB feature. It is recommended
|
|
* to use it when possible.
|
|
*/
|
|
if ((base != NULL) && (n != 0U)) {
|
|
memset_erms(base, v, n);
|
|
}
|
|
|
|
return base;
|
|
}
|
|
|
|
void memcpy_erms(void *d, const void *s, size_t slen)
|
|
{
|
|
asm volatile ("rep; movsb"
|
|
: "=&D"(d), "=&S"(s)
|
|
: "c"(slen), "0" (d), "1" (s)
|
|
: "memory");
|
|
}
|
|
|
|
/* copy data from tail to head (backwards) with ERMS (Enhanced REP MOVSB/STOSB) */
|
|
void memcpy_erms_backwards(void *d, const void *s, size_t slen)
|
|
{
|
|
asm volatile ("std; rep; movsb; cld"
|
|
: "=&D"(d), "=&S"(s)
|
|
: "c"(slen), "0" (d), "1" (s)
|
|
: "memory");
|
|
}
|
|
|
|
/*
|
|
* @brief Copies at most slen bytes from src address to dest address, up to dmax.
|
|
*
|
|
* INPUTS
|
|
*
|
|
* @param[in] d pointer to Destination address
|
|
* @param[in] dmax maximum length of dest
|
|
* @param[in] s pointer to Source address
|
|
* @param[in] slen maximum number of bytes of src to copy
|
|
*
|
|
* @return 0 for success and -1 for runtime-constraint violation.
|
|
*/
|
|
int32_t memcpy_s(void *d, size_t dmax, const void *s, size_t slen)
|
|
{
|
|
int32_t ret = -1;
|
|
|
|
if ((d != NULL) && (s != NULL) && (dmax >= slen) && ((d > (s + slen)) || (s > (d + dmax)))) {
|
|
if (slen != 0U) {
|
|
memcpy_erms(d, s, slen);
|
|
}
|
|
ret = 0;
|
|
} else {
|
|
(void)memset(d, 0U, dmax);
|
|
}
|
|
|
|
return ret;
|
|
}
|