// SPDX-License-Identifier: GPL-2.0 
 | 
/* 
 | 
 * The Virtual DVB test driver serves as a reference DVB driver and helps 
 | 
 * validate the existing APIs in the media subsystem. It can also aid 
 | 
 * developers working on userspace applications. 
 | 
 * 
 | 
 * Copyright (C) 2020 Daniel W. S. Almeida 
 | 
 */ 
 | 
#define pr_fmt(fmt) KBUILD_MODNAME ":%s, %d: " fmt, __func__, __LINE__ 
 | 
  
 | 
#include <linux/printk.h> 
 | 
#include <linux/ratelimit.h> 
 | 
#include <linux/string.h> 
 | 
#include <linux/types.h> 
 | 
  
 | 
#include "vidtv_common.h" 
 | 
  
 | 
/** 
 | 
 * vidtv_memcpy() - wrapper routine to be used by MPEG-TS 
 | 
 *    generator, in order to avoid going past the 
 | 
 *    output buffer. 
 | 
 * @to:    Starting element to where a MPEG-TS packet will 
 | 
 *    be copied. 
 | 
 * @to_offset:    Starting position of the @to buffer to be filled. 
 | 
 * @to_size:    Size of the @to buffer. 
 | 
 * @from:    Starting element of the buffer to be copied. 
 | 
 * @len:    Number of elements to be copy from @from buffer 
 | 
 *    into @to+ @to_offset buffer. 
 | 
 * 
 | 
 * Note: 
 | 
 *    Real digital TV demod drivers should not have memcpy 
 | 
 *    wrappers. We use it here because emulating MPEG-TS 
 | 
 *    generation at kernelspace requires some extra care. 
 | 
 * 
 | 
 * Return: 
 | 
 *    Returns the number of bytes written 
 | 
 */ 
 | 
u32 vidtv_memcpy(void *to, 
 | 
         size_t to_offset, 
 | 
         size_t to_size, 
 | 
         const void *from, 
 | 
         size_t len) 
 | 
{ 
 | 
    if (unlikely(to_offset + len > to_size)) { 
 | 
        pr_err_ratelimited("overflow detected, skipping. Try increasing the buffer size. Needed %zu, had %zu\n", 
 | 
                   to_offset + len, 
 | 
                   to_size); 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    memcpy(to + to_offset, from, len); 
 | 
    return len; 
 | 
} 
 | 
  
 | 
/** 
 | 
 * vidtv_memset() - wrapper routine to be used by MPEG-TS 
 | 
 *    generator, in order to avoid going past the 
 | 
 *    output buffer. 
 | 
 * @to:    Starting element to set 
 | 
 * @to_offset:    Starting position of the @to buffer to be filled. 
 | 
 * @to_size:    Size of the @to buffer. 
 | 
 * @c:        The value to set the memory to. 
 | 
 * @len:    Number of elements to be copy from @from buffer 
 | 
 *    into @to+ @to_offset buffer. 
 | 
 * 
 | 
 * Note: 
 | 
 *    Real digital TV demod drivers should not have memset 
 | 
 *    wrappers. We use it here because emulating MPEG-TS 
 | 
 *    generation at kernelspace requires some extra care. 
 | 
 * 
 | 
 * Return: 
 | 
 *    Returns the number of bytes written 
 | 
 */ 
 | 
u32 vidtv_memset(void *to, 
 | 
         size_t to_offset, 
 | 
         size_t to_size, 
 | 
         const int c, 
 | 
         size_t len) 
 | 
{ 
 | 
    if (unlikely(to_offset + len > to_size)) { 
 | 
        pr_err_ratelimited("overflow detected, skipping. Try increasing the buffer size. Needed %zu, had %zu\n", 
 | 
                   to_offset + len, 
 | 
                   to_size); 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
    memset(to + to_offset, c, len); 
 | 
    return len; 
 | 
} 
 |