mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-01-25 21:08:11 +00:00
[c-host] implemented linux ivshmem support
This commit is contained in:
parent
0a3b1e930a
commit
6d6034870e
1 changed files with 106 additions and 5 deletions
|
@ -19,9 +19,34 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
struct app
|
||||||
|
{
|
||||||
|
unsigned int shmSize;
|
||||||
|
int shmFD;
|
||||||
|
void * shmMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct params
|
||||||
|
{
|
||||||
|
const char * shmDevice;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct app app;
|
||||||
|
|
||||||
|
static struct params params =
|
||||||
|
{
|
||||||
|
.shmDevice = "uio0"
|
||||||
|
};
|
||||||
|
|
||||||
struct osThreadHandle
|
struct osThreadHandle
|
||||||
{
|
{
|
||||||
const char * name;
|
const char * name;
|
||||||
|
@ -33,27 +58,103 @@ struct osThreadHandle
|
||||||
|
|
||||||
int main(int argc, char * argv[])
|
int main(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
|
static struct option longOptions[] =
|
||||||
|
{
|
||||||
|
{"shmDevice", required_argument, 0, 'f'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
int optionIndex = 0;
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
int c = getopt_long(argc, argv, "f:", longOptions, &optionIndex);
|
||||||
|
if (c == -1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch(c)
|
||||||
|
{
|
||||||
|
case 'f':
|
||||||
|
params.shmDevice = optarg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the device size
|
||||||
|
{
|
||||||
|
char file[100] = "/sys/class/uio/";
|
||||||
|
strncat(file, params.shmDevice , sizeof(file));
|
||||||
|
strncat(file, "/maps/map0/size", sizeof(file));
|
||||||
|
|
||||||
|
int fd = open(file, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to open: %s", file);
|
||||||
|
DEBUG_ERROR("Did you remmeber to modprobe the kvmfr module?");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char size[32];
|
||||||
|
int len = read(fd, size, sizeof(size));
|
||||||
|
if (len <= 0 || len == sizeof(size))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to read: %s", file);
|
||||||
|
close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
size[len] = '\0';
|
||||||
|
|
||||||
|
app.shmSize = strtoul(size, NULL, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
// open the device
|
||||||
|
{
|
||||||
|
char file[100] = "/dev/";
|
||||||
|
strncat(file, params.shmDevice, sizeof(file));
|
||||||
|
app.shmFD = open(file, O_RDWR, (mode_t)0600);
|
||||||
|
app.shmMap = MAP_FAILED;
|
||||||
|
if (app.shmFD < 0)
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to open: %s", file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool termSig = false;
|
bool termSig = false;
|
||||||
int result = app_main(&termSig);
|
int result = app_main(&termSig);
|
||||||
os_shmemUnmap();
|
os_shmemUnmap();
|
||||||
|
close(app.shmFD);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int os_shmemSize()
|
unsigned int os_shmemSize()
|
||||||
{
|
{
|
||||||
// TODO
|
return app.shmSize;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool os_shmemMmap(void **ptr)
|
bool os_shmemMmap(void **ptr)
|
||||||
{
|
{
|
||||||
// TODO
|
if (app.shmMap == MAP_FAILED)
|
||||||
return false;
|
{
|
||||||
|
app.shmMap = mmap(0, app.shmSize, PROT_READ | PROT_WRITE, MAP_SHARED, app.shmFD, 0);
|
||||||
|
if (app.shmMap == MAP_FAILED)
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to map the shared memory device: %s", params.shmDevice);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*ptr = app.shmMap;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void os_shmemUnmap()
|
void os_shmemUnmap()
|
||||||
{
|
{
|
||||||
// TODO
|
if (app.shmMap == MAP_FAILED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
munmap(app.shmMap, app.shmSize);
|
||||||
|
app.shmMap = MAP_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * threadWrapper(void * opaque)
|
static void * threadWrapper(void * opaque)
|
||||||
|
|
Loading…
Reference in a new issue