Moved:
memcmp from bootmap.h to libc.h (renamed from _memcmp)
strlen from sclp.c to libc.h (renamed from _strlen)
Added C standard functions:
isdigit
Added non C-standard function:
uitoa
atoui
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/Makefile | 2 +-
pc-bios/s390-ccw/libc.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++
pc-bios/s390-ccw/libc.h | 37 ++++++++++++++++++--
pc-bios/s390-ccw/main.c | 17 +--------
4 files changed, 126 insertions(+), 19 deletions(-)
create mode 100644 pc-bios/s390-ccw/libc.c
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 6d0c2ee..9f7904f 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw)
.PHONY : all clean build-all
-OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o
+OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o
QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS))
QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float
QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing
diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c
new file mode 100644
index 0000000..a144388
--- /dev/null
+++ b/pc-bios/s390-ccw/libc.c
@@ -0,0 +1,89 @@
+/*
+ * libc-style definitions and functions
+ *
+ * Copyright 2018 IBM Corp.
+ * Author(s): Collin L. Walling <walling@linux.vnet.ibm.com>
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include "libc.h"
+#include "s390-ccw.h"
+
+/**
+ * atoui:
+ * @str: the string to be converted.
+ *
+ * Given a string @str, convert it to an integer. Leading spaces are
+ * ignored. Any other non-numerical value will terminate the conversion
+ * and return 0. This function only handles numbers between 0 and
+ * UINT64_MAX inclusive.
+ *
+ * Returns: an integer converted from the string @str, or the number 0
+ * if an error occurred.
+ */
+uint64_t atoui(const char *str)
+{
+ int val = 0;
+
+ if (!str || !str[0]) {
+ return 0;
+ }
+
+ while (*str == ' ') {
+ str++;
+ }
+
+ while (*str) {
+ if (!isdigit(*str)) {
+ break;
+ }
+ val = val * 10 + *str - '0';
+ str++;
+ }
+
+ return val;
+}
+
+/**
+ * uitoa:
+ * @num: an integer (base 10) to be converted.
+ * @str: a pointer to a string to store the conversion.
+ * @len: the length of the passed string.
+ *
+ * Given an integer @num, convert it to a string. The string @str must be
+ * allocated beforehand. The resulting string will be null terminated and
+ * returned. This function only handles numbers between 0 and UINT64_MAX
+ * inclusive.
+ *
+ * Returns: the string @str of the converted integer @num
+ */
+char *uitoa(uint64_t num, char *str, size_t len)
+{
+ size_t num_idx = 0;
+ uint64_t tmp = num;
+
+ IPL_assert(str != NULL, "uitoa: no space allocated to store string");
+
+ /* Get index to ones place */
+ while ((tmp /= 10) != 0) {
+ num_idx++;
+ }
+
+ /* Check if we have enough space for num and null */
+ IPL_assert(len > num_idx, "uitoa: array too small for conversion");
+
+ str[num_idx + 1] = '\0';
+
+ /* Convert int to string */
+ while (num_idx >= 0) {
+ str[num_idx] = num % 10 + '0';
+ num /= 10;
+ num_idx--;
+ }
+
+ return str;
+}
diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h
index 0142ea8..63ece70 100644
--- a/pc-bios/s390-ccw/libc.h
+++ b/pc-bios/s390-ccw/libc.h
@@ -1,6 +1,8 @@
/*
* libc-style definitions and functions
*
+ * Copyright (c) 2013 Alexander Graf <agraf@suse.de>
+ *
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
@@ -19,7 +21,7 @@ typedef unsigned long long uint64_t;
static inline void *memset(void *s, int c, size_t n)
{
- int i;
+ size_t i;
unsigned char *p = s;
for (i = 0; i < n; i++) {
@@ -33,7 +35,7 @@ static inline void *memcpy(void *s1, const void *s2, size_t n)
{
uint8_t *dest = s1;
const uint8_t *src = s2;
- int i;
+ size_t i;
for (i = 0; i < n; i++) {
dest[i] = src[i];
@@ -42,4 +44,35 @@ static inline void *memcpy(void *s1, const void *s2, size_t n)
return s1;
}
+static inline int memcmp(const void *s1, const void *s2, size_t n)
+{
+ size_t i;
+ const uint8_t *p1 = s1, *p2 = s2;
+
+ for (i = 0; i < n; i++) {
+ if (p1[i] != p2[i]) {
+ return p1[i] > p2[i] ? 1 : -1;
+ }
+ }
+
+ return 0;
+}
+
+static inline size_t strlen(const char *str)
+{
+ size_t i;
+ for (i = 0; *str; i++) {
+ str++;
+ }
+ return i;
+}
+
+static inline int isdigit(int c)
+{
+ return (c >= '0') && (c <= '9');
+}
+
+uint64_t atoui(const char *str);
+char *uitoa(uint64_t num, char *str, size_t len);
+
#endif
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 401e9db..e857ce4 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -40,22 +40,7 @@ void panic(const char *string)
unsigned int get_loadparm_index(void)
{
- const char *lp = loadparm;
- int i;
- unsigned int idx = 0;
-
- for (i = 0; i < 8; i++) {
- char c = lp[i];
-
- if (c < '0' || c > '9') {
- break;
- }
-
- idx *= 10;
- idx += c - '0';
- }
-
- return idx;
+ return atoui(loadparm);
}
static bool find_dev(Schib *schib, int dev_no)
--
2.7.4
On 15.02.2018 23:54, Collin L. Walling wrote: > Moved: > memcmp from bootmap.h to libc.h (renamed from _memcmp) > strlen from sclp.c to libc.h (renamed from _strlen) What happened to the renames of _strlen to strlen and _memcmp to memcmp? The hunks now seem to be missing from this patch? Or do I miss something? Thomas > Added C standard functions: > isdigit > > Added non C-standard function: > uitoa > atoui > > Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com> > Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> > Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com> > --- > pc-bios/s390-ccw/Makefile | 2 +- > pc-bios/s390-ccw/libc.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++ > pc-bios/s390-ccw/libc.h | 37 ++++++++++++++++++-- > pc-bios/s390-ccw/main.c | 17 +-------- > 4 files changed, 126 insertions(+), 19 deletions(-) > create mode 100644 pc-bios/s390-ccw/libc.c > > diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile > index 6d0c2ee..9f7904f 100644 > --- a/pc-bios/s390-ccw/Makefile > +++ b/pc-bios/s390-ccw/Makefile > @@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw) > > .PHONY : all clean build-all > > -OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o > +OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o > QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS)) > QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float > QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing > diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c > new file mode 100644 > index 0000000..a144388 > --- /dev/null > +++ b/pc-bios/s390-ccw/libc.c > @@ -0,0 +1,89 @@ > +/* > + * libc-style definitions and functions > + * > + * Copyright 2018 IBM Corp. > + * Author(s): Collin L. Walling <walling@linux.vnet.ibm.com> > + * > + * This code is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License as published by the > + * Free Software Foundation; either version 2 of the License, or (at your > + * option) any later version. > + */ > + > +#include "libc.h" > +#include "s390-ccw.h" > + > +/** > + * atoui: > + * @str: the string to be converted. > + * > + * Given a string @str, convert it to an integer. Leading spaces are > + * ignored. Any other non-numerical value will terminate the conversion > + * and return 0. This function only handles numbers between 0 and > + * UINT64_MAX inclusive. > + * > + * Returns: an integer converted from the string @str, or the number 0 > + * if an error occurred. > + */ > +uint64_t atoui(const char *str) > +{ > + int val = 0; > + > + if (!str || !str[0]) { > + return 0; > + } > + > + while (*str == ' ') { > + str++; > + } > + > + while (*str) { > + if (!isdigit(*str)) { > + break; > + } > + val = val * 10 + *str - '0'; > + str++; > + } > + > + return val; > +} > + > +/** > + * uitoa: > + * @num: an integer (base 10) to be converted. > + * @str: a pointer to a string to store the conversion. > + * @len: the length of the passed string. > + * > + * Given an integer @num, convert it to a string. The string @str must be > + * allocated beforehand. The resulting string will be null terminated and > + * returned. This function only handles numbers between 0 and UINT64_MAX > + * inclusive. > + * > + * Returns: the string @str of the converted integer @num > + */ > +char *uitoa(uint64_t num, char *str, size_t len) > +{ > + size_t num_idx = 0; > + uint64_t tmp = num; > + > + IPL_assert(str != NULL, "uitoa: no space allocated to store string"); > + > + /* Get index to ones place */ > + while ((tmp /= 10) != 0) { > + num_idx++; > + } > + > + /* Check if we have enough space for num and null */ > + IPL_assert(len > num_idx, "uitoa: array too small for conversion"); > + > + str[num_idx + 1] = '\0'; > + > + /* Convert int to string */ > + while (num_idx >= 0) { > + str[num_idx] = num % 10 + '0'; > + num /= 10; > + num_idx--; > + } > + > + return str; > +} > diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h > index 0142ea8..63ece70 100644 > --- a/pc-bios/s390-ccw/libc.h > +++ b/pc-bios/s390-ccw/libc.h > @@ -1,6 +1,8 @@ > /* > * libc-style definitions and functions > * > + * Copyright (c) 2013 Alexander Graf <agraf@suse.de> > + * > * This code is free software; you can redistribute it and/or modify it > * under the terms of the GNU General Public License as published by the > * Free Software Foundation; either version 2 of the License, or (at your > @@ -19,7 +21,7 @@ typedef unsigned long long uint64_t; > > static inline void *memset(void *s, int c, size_t n) > { > - int i; > + size_t i; > unsigned char *p = s; > > for (i = 0; i < n; i++) { > @@ -33,7 +35,7 @@ static inline void *memcpy(void *s1, const void *s2, size_t n) > { > uint8_t *dest = s1; > const uint8_t *src = s2; > - int i; > + size_t i; > > for (i = 0; i < n; i++) { > dest[i] = src[i]; > @@ -42,4 +44,35 @@ static inline void *memcpy(void *s1, const void *s2, size_t n) > return s1; > } > > +static inline int memcmp(const void *s1, const void *s2, size_t n) > +{ > + size_t i; > + const uint8_t *p1 = s1, *p2 = s2; > + > + for (i = 0; i < n; i++) { > + if (p1[i] != p2[i]) { > + return p1[i] > p2[i] ? 1 : -1; > + } > + } > + > + return 0; > +} > + > +static inline size_t strlen(const char *str) > +{ > + size_t i; > + for (i = 0; *str; i++) { > + str++; > + } > + return i; > +} > + > +static inline int isdigit(int c) > +{ > + return (c >= '0') && (c <= '9'); > +} > + > +uint64_t atoui(const char *str); > +char *uitoa(uint64_t num, char *str, size_t len); > + > #endif > diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c > index 401e9db..e857ce4 100644 > --- a/pc-bios/s390-ccw/main.c > +++ b/pc-bios/s390-ccw/main.c > @@ -40,22 +40,7 @@ void panic(const char *string) > > unsigned int get_loadparm_index(void) > { > - const char *lp = loadparm; > - int i; > - unsigned int idx = 0; > - > - for (i = 0; i < 8; i++) { > - char c = lp[i]; > - > - if (c < '0' || c > '9') { > - break; > - } > - > - idx *= 10; > - idx += c - '0'; > - } > - > - return idx; > + return atoui(loadparm); > } > > static bool find_dev(Schib *schib, int dev_no) >
On 02/16/2018 11:05 AM, Thomas Huth wrote: > On 15.02.2018 23:54, Collin L. Walling wrote: >> Moved: >> memcmp from bootmap.h to libc.h (renamed from _memcmp) >> strlen from sclp.c to libc.h (renamed from _strlen) > What happened to the renames of _strlen to strlen and _memcmp to memcmp? > The hunks now seem to be missing from this patch? Or do I miss something? > > Thomas Oh shoot... yeah, the _* functions didn't seem to get removed... sorry about that. Odd rebasing failure on my end :( > > >> Added C standard functions: >> isdigit >> >> Added non C-standard function: >> uitoa >> atoui >> >> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com> >> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> >> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com> >> --- >> pc-bios/s390-ccw/Makefile | 2 +- >> pc-bios/s390-ccw/libc.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++ >> pc-bios/s390-ccw/libc.h | 37 ++++++++++++++++++-- >> pc-bios/s390-ccw/main.c | 17 +-------- >> 4 files changed, 126 insertions(+), 19 deletions(-) >> create mode 100644 pc-bios/s390-ccw/libc.c >> >> diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile >> index 6d0c2ee..9f7904f 100644 >> --- a/pc-bios/s390-ccw/Makefile >> +++ b/pc-bios/s390-ccw/Makefile >> @@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw) >> >> .PHONY : all clean build-all >> >> -OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o >> +OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o >> QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS)) >> QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float >> QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing >> diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c >> new file mode 100644 >> index 0000000..a144388 >> --- /dev/null >> +++ b/pc-bios/s390-ccw/libc.c >> @@ -0,0 +1,89 @@ >> +/* >> + * libc-style definitions and functions >> + * >> + * Copyright 2018 IBM Corp. >> + * Author(s): Collin L. Walling <walling@linux.vnet.ibm.com> >> + * >> + * This code is free software; you can redistribute it and/or modify it >> + * under the terms of the GNU General Public License as published by the >> + * Free Software Foundation; either version 2 of the License, or (at your >> + * option) any later version. >> + */ >> + >> +#include "libc.h" >> +#include "s390-ccw.h" >> + >> +/** >> + * atoui: >> + * @str: the string to be converted. >> + * >> + * Given a string @str, convert it to an integer. Leading spaces are >> + * ignored. Any other non-numerical value will terminate the conversion >> + * and return 0. This function only handles numbers between 0 and >> + * UINT64_MAX inclusive. >> + * >> + * Returns: an integer converted from the string @str, or the number 0 >> + * if an error occurred. >> + */ >> +uint64_t atoui(const char *str) >> +{ >> + int val = 0; >> + >> + if (!str || !str[0]) { >> + return 0; >> + } >> + >> + while (*str == ' ') { >> + str++; >> + } >> + >> + while (*str) { >> + if (!isdigit(*str)) { >> + break; >> + } >> + val = val * 10 + *str - '0'; >> + str++; >> + } >> + >> + return val; >> +} >> + >> +/** >> + * uitoa: >> + * @num: an integer (base 10) to be converted. >> + * @str: a pointer to a string to store the conversion. >> + * @len: the length of the passed string. >> + * >> + * Given an integer @num, convert it to a string. The string @str must be >> + * allocated beforehand. The resulting string will be null terminated and >> + * returned. This function only handles numbers between 0 and UINT64_MAX >> + * inclusive. >> + * >> + * Returns: the string @str of the converted integer @num >> + */ >> +char *uitoa(uint64_t num, char *str, size_t len) >> +{ >> + size_t num_idx = 0; >> + uint64_t tmp = num; >> + >> + IPL_assert(str != NULL, "uitoa: no space allocated to store string"); >> + >> + /* Get index to ones place */ >> + while ((tmp /= 10) != 0) { >> + num_idx++; >> + } >> + >> + /* Check if we have enough space for num and null */ >> + IPL_assert(len > num_idx, "uitoa: array too small for conversion"); >> + >> + str[num_idx + 1] = '\0'; >> + >> + /* Convert int to string */ >> + while (num_idx >= 0) { >> + str[num_idx] = num % 10 + '0'; >> + num /= 10; >> + num_idx--; >> + } >> + >> + return str; >> +} >> diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h >> index 0142ea8..63ece70 100644 >> --- a/pc-bios/s390-ccw/libc.h >> +++ b/pc-bios/s390-ccw/libc.h >> @@ -1,6 +1,8 @@ >> /* >> * libc-style definitions and functions >> * >> + * Copyright (c) 2013 Alexander Graf <agraf@suse.de> >> + * >> * This code is free software; you can redistribute it and/or modify it >> * under the terms of the GNU General Public License as published by the >> * Free Software Foundation; either version 2 of the License, or (at your >> @@ -19,7 +21,7 @@ typedef unsigned long long uint64_t; >> >> static inline void *memset(void *s, int c, size_t n) >> { >> - int i; >> + size_t i; >> unsigned char *p = s; >> >> for (i = 0; i < n; i++) { >> @@ -33,7 +35,7 @@ static inline void *memcpy(void *s1, const void *s2, size_t n) >> { >> uint8_t *dest = s1; >> const uint8_t *src = s2; >> - int i; >> + size_t i; >> >> for (i = 0; i < n; i++) { >> dest[i] = src[i]; >> @@ -42,4 +44,35 @@ static inline void *memcpy(void *s1, const void *s2, size_t n) >> return s1; >> } >> >> +static inline int memcmp(const void *s1, const void *s2, size_t n) >> +{ >> + size_t i; >> + const uint8_t *p1 = s1, *p2 = s2; >> + >> + for (i = 0; i < n; i++) { >> + if (p1[i] != p2[i]) { >> + return p1[i] > p2[i] ? 1 : -1; >> + } >> + } >> + >> + return 0; >> +} >> + >> +static inline size_t strlen(const char *str) >> +{ >> + size_t i; >> + for (i = 0; *str; i++) { >> + str++; >> + } >> + return i; >> +} >> + >> +static inline int isdigit(int c) >> +{ >> + return (c >= '0') && (c <= '9'); >> +} >> + >> +uint64_t atoui(const char *str); >> +char *uitoa(uint64_t num, char *str, size_t len); >> + >> #endif >> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c >> index 401e9db..e857ce4 100644 >> --- a/pc-bios/s390-ccw/main.c >> +++ b/pc-bios/s390-ccw/main.c >> @@ -40,22 +40,7 @@ void panic(const char *string) >> >> unsigned int get_loadparm_index(void) >> { >> - const char *lp = loadparm; >> - int i; >> - unsigned int idx = 0; >> - >> - for (i = 0; i < 8; i++) { >> - char c = lp[i]; >> - >> - if (c < '0' || c > '9') { >> - break; >> - } >> - >> - idx *= 10; >> - idx += c - '0'; >> - } >> - >> - return idx; >> + return atoui(loadparm); >> } >> >> static bool find_dev(Schib *schib, int dev_no) >> > -- - Collin L Walling
© 2016 - 2025 Red Hat, Inc.