[Skiboot] [PATCH 05/15] libc/string: Add memcpy_ci

Balbir Singh bsingharora at gmail.com
Fri Sep 2 23:06:35 AEST 2016



On 02/09/16 23:02, Balbir Singh wrote:
> 
> 
> On 11/08/16 15:23, Claudio Carvalho wrote:
>> This adds memcpy_ci, it's a cache inhibited version of memcpy.
>>
>> We use memcpy_ci to copy the verification code from the secure ROM
>> to memory. Due to performance issues we opted to run it from memory.
>>
>> Signed-off-by: Claudio Carvalho <cclaudio at linux.vnet.ibm.com>
>> ---
>>  libc/include/string.h    |  3 ++-
>>  libc/string/Makefile.inc |  9 +++++----
>>  libc/string/memcpy_ci.c  | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 57 insertions(+), 5 deletions(-)
>>  create mode 100644 libc/string/memcpy_ci.c
>>
>> diff --git a/libc/include/string.h b/libc/include/string.h
>> index 890ffc2..a53e4f4 100644
>> --- a/libc/include/string.h
>> +++ b/libc/include/string.h
>> @@ -1,5 +1,5 @@
>>  /******************************************************************************
>> - * Copyright (c) 2004, 2008 IBM Corporation
>> + * Copyright (c) 2004, 2016 IBM Corporation
>>   * All rights reserved.
>>   * This program and the accompanying materials
>>   * are made available under the terms of the BSD License
>> @@ -32,6 +32,7 @@ char *strdup(const char *src);
>>  void *memset(void *s, int c, size_t n);
>>  void *memchr(const void *s, int c, size_t n);
>>  void *memcpy(void *dest, const void *src, size_t n);
>> +const void *memcpy_ci(const void *destpp, const void *srcpp, size_t len);
>>  void *memmove(void *dest, const void *src, size_t n);
>>  int memcmp(const void *s1, const void *s2, size_t n);
>>  
>> diff --git a/libc/string/Makefile.inc b/libc/string/Makefile.inc
>> index 3b7c8ce..5f7fa27 100644
>> --- a/libc/string/Makefile.inc
>> +++ b/libc/string/Makefile.inc
>> @@ -1,5 +1,5 @@
>>  # *****************************************************************************
>> -# * Copyright (c) 2004, 2008 IBM Corporation
>> +# * Copyright (c) 2004, 2016 IBM Corporation
>>  # * All rights reserved.
>>  # * This program and the accompanying materials
>>  # * are made available under the terms of the BSD License
>> @@ -12,9 +12,10 @@
>>  
>>  SUBDIRS += $(LIBCDIR)/string
>>  
>> -STRING_OBJS = strcat.o strchr.o strcmp.o strcpy.o strlen.o strncmp.o \
>> -	      strncpy.o strstr.o memset.o memcpy.o memmove.o memchr.o \
>> -	      memcmp.o strcasecmp.o strncasecmp.o strtok.o strdup.o
>> +STRING_OBJS = strcat.o strchr.o strcmp.o strcpy.o strlen.o \
>> +	      strncmp.o strncpy.o strstr.o memset.o memcpy.o memcpy_ci.o \
>> +	      memmove.o memchr.o memcmp.o strcasecmp.o strncasecmp.o \
>> +	      strtok.o strdup.o
>>  STRING = $(LIBCDIR)/string/built-in.o
>>  $(STRING): $(STRING_OBJS:%=$(LIBCDIR)/string/%)
>>  
>> diff --git a/libc/string/memcpy_ci.c b/libc/string/memcpy_ci.c
>> new file mode 100644
>> index 0000000..9af45dc
>> --- /dev/null
>> +++ b/libc/string/memcpy_ci.c
>> @@ -0,0 +1,50 @@
>> +/* Copyright 2013-2016 IBM Corp
>> + *
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> + * implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +
>> +#include <string.h>
>> +#include <io.h>
>> +
>> +const void* memcpy_ci(const void *destpp, const void *srcpp, size_t len)
> 
> Why isn't len also a const?

Ignore this comment, I missed the len modifications below

> 
>> +{
>> +	size_t i;
>> +	const size_t block = sizeof(uint32_t);
> 
> Why not 64 bit alignment?
> 
>> +
>> +	unsigned long int destp = (long int) destpp;
>> +	unsigned long int srcp = (long int) srcpp;
>> +
>> +	/* copy just a few bytes to make dst aligned */
>> +	i = len % block;
> 
> 
> I would do some basic sanity tests around len, like
> 
> is len > RAM size?
> 
>> +	while (i > 0)
>> +	{
>> +		*((uint8_t*) destp) = in_8((uint8_t*)srcp);
>> +		srcp += 1;
>> +		destp += 1;
>> +		i--;
>> +	}
>> +
> 
> 
> Why not align to an 8 byte boundary and use in_be64 instead?
> 
>> +	len -= len % block;
>> +
>> +	/* copy the aligned bytes */
>> +	while(len > 0)
>> +	{
>> +		*((uint32_t*) destp) = in_be32((uint32_t*)srcp);
>> +		srcp += block;
>> +		destp += block;
>> +		len -= block;
>> +	}
>> +
>> +	return destpp;
>> +}
>>


More information about the Skiboot mailing list