acrn-hypervisor/misc/sample_application/uservm/ivshmemlib.c

153 lines
3.4 KiB
C

/*
* Copyright (C) 2022 Intel Corporation.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "ivshmemlib.h"
//The shared memory region that is used for inter-vm shared memory
char *ivshmem_ptr = NULL;
/*
int setup_ivshmem_region(const char *f_path)
input: char *f_path - A string containing the pci resource2 filepath
output: int - Whether the setup succeeded or not
This function attempts to open the file whose path is f_path
On success it returns 0
On failure it returns -1
*/
int setup_ivshmem_region(const char *f_path)
{
//Open the file so we can map it into memory
int pci_file = open(f_path, O_RDWR | O_SYNC);
if (pci_file == failure) {
perror("Failed to open the resource2 file\n");
return failure;
}
//Map the file into memory
ivshmem_ptr = (char *)mmap(0, REGION_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, pci_file , 0);
close(pci_file);
if (!ivshmem_ptr) {
perror("Failed to map the shared memory region into our address space\n");
return failure;
}
return success;
}
/*
int close_ivshmem_region(void)
output: int - Whether unmapping the region succeeded or not.
This function closes the ivshmem region
On success it returns 0
On failure it returns -1
*/
int close_ivshmem_region(void)
{
int ret_val = failure;
//Determine if ivshmem region is set up
if (ivshmem_ptr) {
ret_val = munmap(ivshmem_ptr, REGION_SIZE);
ivshmem_ptr = NULL;
}
else
printf("Ivshmem region is not set up.");
return ret_val;
}
/*
size_t read_ivshmem_region(char *ivshmemPtr, char *user_ptr, size_t size)
input: char *user_ptr - The memory to write to
input: size_t size - the number of bytes to read from the memory
output: size_t - The number of bytes that were successfully read or -1 on failure
This function reads from the ivshmem region and copies size - 1 bytes
from the shared memory region to the user_ptr
and null-terminates the string
*/
size_t read_ivshmem_region(char *user_ptr, size_t size)
{
//Number of bytes copied
size_t ret = failure;
//Make sure that we actually need to read something
if (size == 0)
return ret;
//Determine if ivshmem region is set up
if ((ivshmem_ptr) && (size < REGION_SIZE - 1)) {
//Do the copy and zero out the ivshmem region
bzero(user_ptr, size);
strncpy(user_ptr, ivshmem_ptr, size);
ivshmem_ptr[size] = '\0';
user_ptr[size] = '\0';
ret = strlen(user_ptr);
bzero(ivshmem_ptr, size);
}
else
printf("Ivshmem region is not set up.");
return ret;
}
/*
size_t write_ivshmem_region(char *ivshmemPtr, char *user_ptr, size_t size)
input: char *user_ptr - The memory to read from
input: int size - the number of bytes to write from the memory
output: int - The number of bytes that were successfully written or -1 on failure
This function reads from the user_ptr and copies size - 1 bytes
to the shared memory region
and null-terminates the string
*/
size_t write_ivshmem_region(char *user_ptr, size_t size)
{
//Return value that holds the amount of bytes that were copied from the user_ptr
size_t ret = failure;
//Make sure that we need to actually write something
if (size == 0)
return ret;
//Determine if ivshmem region is set up
if ((ivshmem_ptr) && (size < REGION_SIZE - 1)){
//Do the copy and zero out the user_ptr
bzero(ivshmem_ptr, size);
strncpy(ivshmem_ptr, user_ptr, size);
user_ptr[size] = '\0';
ivshmem_ptr[size] = '\0';
ret = strlen(ivshmem_ptr);
bzero(user_ptr, size);
}
else
printf("Ivshmem region is not set up.");
return ret;
}