qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [qemu-s390x] [PATCH v6 04/12] s390-ccw: update libc


From: Thomas Huth
Subject: Re: [Qemu-devel] [qemu-s390x] [PATCH v6 04/12] s390-ccw: update libc
Date: Fri, 16 Feb 2018 17:05:39 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0

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 <address@hidden>
> Acked-by: Christian Borntraeger <address@hidden>
> Reviewed-by: Janosch Frank <address@hidden>
> ---
>  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 <address@hidden>
> + *
> + * 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 <address@hidden>
> + *
>   * 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)
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]