Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/sysinfo/sysinfo.c

    r311bc25 r7a0359b  
    4040#include <arch/asm.h>
    4141#include <errno.h>
    42 #include <macros.h>
    4342
    4443/** Maximal sysinfo path length */
     
    297296 */
    298297void sysinfo_set_item_val(const char *name, sysinfo_item_t **root,
    299     sysarg_t val)
     298    unative_t val)
    300299{
    301300        /* Protect sysinfo tree consistency */
     
    482481                sysinfo_indent(depth);
    483482               
    484                 sysarg_t val;
     483                unative_t val;
    485484                size_t size;
    486485               
     
    495494                        break;
    496495                case SYSINFO_VAL_DATA:
    497                         printf("+ %s (%zu bytes)\n", cur->name,
     496                        printf("+ %s (%" PRIs" bytes)\n", cur->name,
    498497                            cur->val.data.size);
    499498                        break;
     
    506505                        /* N.B.: No data was actually returned (only a dry run) */
    507506                        (void) cur->val.fn_data(cur, &size, true);
    508                         printf("+ %s (%zu bytes) [generated]\n", cur->name,
     507                        printf("+ %s (%" PRIs" bytes) [generated]\n", cur->name,
    509508                            size);
    510509                        break;
     
    661660 *
    662661 */
    663 sysarg_t sys_sysinfo_get_tag(void *path_ptr, size_t path_size)
     662unative_t sys_sysinfo_get_tag(void *path_ptr, size_t path_size)
    664663{
    665664        /*
     
    680679                ret.tag = SYSINFO_VAL_DATA;
    681680       
    682         return (sysarg_t) ret.tag;
     681        return (unative_t) ret.tag;
    683682}
    684683
     
    697696 *
    698697 */
    699 sysarg_t sys_sysinfo_get_value(void *path_ptr, size_t path_size,
     698unative_t sys_sysinfo_get_value(void *path_ptr, size_t path_size,
    700699    void *value_ptr)
    701700{
     
    716715                rc = EINVAL;
    717716       
    718         return (sysarg_t) rc;
     717        return (unative_t) rc;
    719718}
    720719
     
    733732 *
    734733 */
    735 sysarg_t sys_sysinfo_get_data_size(void *path_ptr, size_t path_size,
     734unative_t sys_sysinfo_get_data_size(void *path_ptr, size_t path_size,
    736735    void *size_ptr)
    737736{
     
    753752                rc = EINVAL;
    754753       
    755         return (sysarg_t) rc;
     754        return (unative_t) rc;
    756755}
    757756
     
    762761 * character must be null).
    763762 *
    764  * If the user space buffer size does not equal
    765  * the actual size of the returned data, the data
    766  * is truncated. Whether this is actually a fatal
    767  * error or the data can be still interpreted as valid
    768  * depends on the nature of the data and has to be
    769  * decided by the user space.
    770  *
    771  * The actual size of data returned is stored to
    772  * size_ptr.
     763 * The user space buffer must be sized exactly according
     764 * to the size of the binary data, otherwise the request
     765 * fails.
    773766 *
    774767 * @param path_ptr    Sysinfo path in the user address space.
     
    777770 *                    to store the binary data.
    778771 * @param buffer_size User space buffer size.
    779  * @param size_ptr    User space pointer where to store the
    780  *                    binary data size.
    781772 *
    782773 * @return Error code (EOK in case of no error).
    783774 *
    784775 */
    785 sysarg_t sys_sysinfo_get_data(void *path_ptr, size_t path_size,
    786     void *buffer_ptr, size_t buffer_size, size_t *size_ptr)
     776unative_t sys_sysinfo_get_data(void *path_ptr, size_t path_size,
     777    void *buffer_ptr, size_t buffer_size)
    787778{
    788779        int rc;
    789780       
    790781        /* Get the item */
    791         sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size,
    792             false);
    793        
     782        sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, false);
     783
    794784        /* Only constant or generated binary data is considered */
    795         if ((ret.tag == SYSINFO_VAL_DATA) ||
    796             (ret.tag == SYSINFO_VAL_FUNCTION_DATA)) {
    797                 size_t size = min(ret.data.size, buffer_size);
    798                 rc = copy_to_uspace(buffer_ptr, ret.data.data, size);
    799                 if (rc == EOK)
    800                         rc = copy_to_uspace(size_ptr, &size, sizeof(size));
     785        if ((ret.tag == SYSINFO_VAL_DATA) || (ret.tag == SYSINFO_VAL_FUNCTION_DATA)) {
     786                /* Check destination buffer size */
     787                if (ret.data.size == buffer_size)
     788                        rc = copy_to_uspace(buffer_ptr, ret.data.data,
     789                            ret.data.size);
     790                else
     791                        rc = ENOMEM;
    801792        } else
    802793                rc = EINVAL;
     
    806797                free(ret.data.data);
    807798       
    808         return (sysarg_t) rc;
     799        return (unative_t) rc;
    809800}
    810801
Note: See TracChangeset for help on using the changeset viewer.