2022-06-28 01:47:39 +08:00
|
|
|
/*
|
|
|
|
* 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)
|
|
|
|
{
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
//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;
|
|
|
|
|
|
|
|
}
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
//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");
|
2022-07-07 02:34:41 +08:00
|
|
|
return failure;
|
2022-06-28 01:47:39 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-07-07 02:34:41 +08:00
|
|
|
return success;
|
2022-06-28 01:47:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
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;
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
}
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
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
|
2022-07-07 02:34:41 +08:00
|
|
|
if ((ivshmem_ptr) && (size < REGION_SIZE - 1)) {
|
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
//Do the copy and zero out the ivshmem region
|
2022-07-07 02:34:41 +08:00
|
|
|
bzero(user_ptr, size);
|
|
|
|
strncpy(user_ptr, ivshmem_ptr, size);
|
|
|
|
ivshmem_ptr[size] = '\0';
|
|
|
|
user_ptr[size] = '\0';
|
2022-06-28 01:47:39 +08:00
|
|
|
ret = strlen(user_ptr);
|
2022-07-07 02:34:41 +08:00
|
|
|
bzero(ivshmem_ptr, size);
|
2022-06-28 01:47:39 +08:00
|
|
|
|
|
|
|
}
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
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)
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
//Determine if ivshmem region is set up
|
2022-07-07 02:34:41 +08:00
|
|
|
if ((ivshmem_ptr) && (size < REGION_SIZE - 1)){
|
2022-06-28 01:47:39 +08:00
|
|
|
|
|
|
|
//Do the copy and zero out the user_ptr
|
2022-07-07 02:34:41 +08:00
|
|
|
bzero(ivshmem_ptr, size);
|
|
|
|
strncpy(ivshmem_ptr, user_ptr, size);
|
|
|
|
user_ptr[size] = '\0';
|
|
|
|
ivshmem_ptr[size] = '\0';
|
2022-06-28 01:47:39 +08:00
|
|
|
ret = strlen(ivshmem_ptr);
|
2022-07-07 02:34:41 +08:00
|
|
|
bzero(user_ptr, size);
|
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
}
|
2022-07-07 02:34:41 +08:00
|
|
|
|
2022-06-28 01:47:39 +08:00
|
|
|
else
|
|
|
|
|
|
|
|
printf("Ivshmem region is not set up.");
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|