| // 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; |
| } |