1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * The Virtual DVB test driver serves as a reference DVB driver and helps 4 * validate the existing APIs in the media subsystem. It can also aid 5 * developers working on userspace applications. 6 * 7 * Copyright (C) 2020 Daniel W. S. Almeida 8 */ 9 #define pr_fmt(fmt) KBUILD_MODNAME ":%s, %d: " fmt, __func__, __LINE__ 10 11 #include <linux/printk.h> 12 #include <linux/ratelimit.h> 13 #include <linux/string.h> 14 #include <linux/types.h> 15 16 #include "vidtv_common.h" 17 18 /** 19 * vidtv_memcpy() - wrapper routine to be used by MPEG-TS 20 * generator, in order to avoid going past the 21 * output buffer. 22 * @to: Starting element to where a MPEG-TS packet will 23 * be copied. 24 * @to_offset: Starting position of the @to buffer to be filled. 25 * @to_size: Size of the @to buffer. 26 * @from: Starting element of the buffer to be copied. 27 * @len: Number of elements to be copy from @from buffer 28 * into @to+ @to_offset buffer. 29 * 30 * Note: 31 * Real digital TV demod drivers should not have memcpy 32 * wrappers. We use it here because emulating MPEG-TS 33 * generation at kernelspace requires some extra care. 34 * 35 * Return: 36 * Returns the number of bytes written 37 */ 38 u32 vidtv_memcpy(void *to, 39 size_t to_offset, 40 size_t to_size, 41 const void *from, 42 size_t len) 43 { 44 if (unlikely(to_offset + len > to_size)) { 45 pr_err_ratelimited("overflow detected, skipping. Try increasing the buffer size. Needed %zu, had %zu\n", 46 to_offset + len, 47 to_size); 48 return 0; 49 } 50 51 memcpy(to + to_offset, from, len); 52 return len; 53 } 54 55 /** 56 * vidtv_memset() - wrapper routine to be used by MPEG-TS 57 * generator, in order to avoid going past the 58 * output buffer. 59 * @to: Starting element to set 60 * @to_offset: Starting position of the @to buffer to be filled. 61 * @to_size: Size of the @to buffer. 62 * @c: The value to set the memory to. 63 * @len: Number of elements to be copy from @from buffer 64 * into @to+ @to_offset buffer. 65 * 66 * Note: 67 * Real digital TV demod drivers should not have memset 68 * wrappers. We use it here because emulating MPEG-TS 69 * generation at kernelspace requires some extra care. 70 * 71 * Return: 72 * Returns the number of bytes written 73 */ 74 u32 vidtv_memset(void *to, 75 size_t to_offset, 76 size_t to_size, 77 const int c, 78 size_t len) 79 { 80 if (unlikely(to_offset + len > to_size)) { 81 pr_err_ratelimited("overflow detected, skipping. Try increasing the buffer size. Needed %zu, had %zu\n", 82 to_offset + len, 83 to_size); 84 return 0; 85 } 86 87 memset(to + to_offset, c, len); 88 return len; 89 } 90