writev and some fixes

This commit is contained in:
Balazs Gerofi
2012-04-23 14:25:21 +09:00
parent b3cc785796
commit 8fee884be3
9 changed files with 177 additions and 41 deletions

View File

@@ -1,4 +1,4 @@
CFLAGS = -O3
CFLAGS = -O3 -Wall -g
all: mcexec

View File

@@ -17,6 +17,8 @@
#include <sys/stat.h>
#include <sys/utsname.h>
#define DEBUG
#ifndef DEBUG
#define __dprint(msg, ...)
#define __dprintf(arg, ...)
@@ -220,9 +222,9 @@ int main(int argc, char **argv)
fprintf(stderr, "Error: Failed to open /dev/mcctrl.\n");
return 1;
}
fdm = open("/dev/mem", O_RDWR);
fdm = open("/dev/fmem", O_RDWR);
if (fdm < 0) {
fprintf(stderr, "Error: Failed to open /dev/mem.\n");
fprintf(stderr, "Error: Failed to open /dev/fmem.\n");
return 1;
}
@@ -299,14 +301,20 @@ int main_loop(int fd, int cpu)
w.cpu = cpu;
while (ioctl(fd, MCEXEC_UP_WAIT_SYSCALL, (unsigned long)&w) == 0) {
__dprintf("got syscall: %d\n", w.sr.number);
switch (w.sr.number) {
case __NR_open:
dma_buf[256] = 0;
do_syscall_load(fd, cpu, dma_buf_pa, w.sr.args[0], 256);
do_syscall_load(fd, cpu, dma_buf, w.sr.args[0], 256);
/*
while (!dma_buf[256]) {
asm volatile ("" : : : "memory");
}
*/
ret = open(dma_buf, w.sr.args[1], w.sr.args[2]);
SET_ERR(ret);
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
@@ -321,19 +329,21 @@ int main_loop(int fd, int cpu)
case __NR_read:
ret = read(w.sr.args[0], dma_buf, w.sr.args[2]);
SET_ERR(ret);
do_syscall_return(fd, cpu, ret, 1, dma_buf_pa,
do_syscall_return(fd, cpu, ret, 1, dma_buf,
w.sr.args[1], w.sr.args[2]);
break;
case __NR_write:
dma_buf[w.sr.args[2]] = 0;
SET_ERR(ret);
do_syscall_load(fd, cpu, dma_buf_pa,
do_syscall_load(fd, cpu, dma_buf,
w.sr.args[1], w.sr.args[2]);
/*
while (!dma_buf[w.sr.args[2]]) {
asm volatile ("" : : : "memory");
}
*/
ret = write(w.sr.args[0], dma_buf, w.sr.args[2]);
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
@@ -347,18 +357,20 @@ int main_loop(int fd, int cpu)
case __NR_pread64:
ret = pread(w.sr.args[0], dma_buf, w.sr.args[2],
w.sr.args[3]);
do_syscall_return(fd, cpu, ret, 1, dma_buf_pa,
do_syscall_return(fd, cpu, ret, 1, dma_buf,
w.sr.args[1], w.sr.args[2]);
break;
case __NR_pwrite64:
dma_buf[w.sr.args[2]] = 0;
do_syscall_load(fd, cpu, dma_buf_pa,
do_syscall_load(fd, cpu, dma_buf,
w.sr.args[1], w.sr.args[2]);
/*
while (!dma_buf[w.sr.args[2]]) {
asm volatile ("" : : : "memory");
}
*/
ret = pwrite(w.sr.args[0], dma_buf, w.sr.args[2],
w.sr.args[3]);
@@ -371,7 +383,7 @@ int main_loop(int fd, int cpu)
if (ret == -1) {
ret = -errno;
}
do_syscall_return(fd, cpu, ret, 1, dma_buf_pa,
do_syscall_return(fd, cpu, ret, 1, dma_buf,
w.sr.args[1], sizeof(struct stat));
break;
@@ -382,7 +394,7 @@ int main_loop(int fd, int cpu)
if (ret == -1) {
ret = -errno;
}
do_syscall_return(fd, cpu, ret, 1, dma_buf_pa,
do_syscall_return(fd, cpu, ret, 1, dma_buf,
w.sr.args[2],
sizeof(struct kernel_termios)
);
@@ -413,7 +425,7 @@ int main_loop(int fd, int cpu)
ret = -errno;
}
do_syscall_return(fd,
cpu, ret, 1, dma_buf_pa, w.sr.args[0],
cpu, ret, 1, dma_buf, w.sr.args[0],
sizeof(struct utsname));
break;
default:

View File

@@ -1,8 +1,10 @@
ifeq ($(K),"current")
#ifeq ($(K),"current")
KDIR=/lib/modules/`uname -r `/build
else
KDIR=../target
endif
#else
#KDIR=../target
#endif
obj-m += mcctrl.o

View File

@@ -6,6 +6,7 @@
#include <asm/uaccess.h>
#include <asm/delay.h>
#include <asm/msr.h>
#include <asm/io.h>
#include "mcctrl.h"
#ifdef DEBUG
@@ -145,9 +146,10 @@ int mcexec_syscall(struct mcctrl_channel *c, unsigned long arg)
return 0;
}
#ifndef DO_USER_MODE
int __do_in_kernel_syscall(aal_os_t os, struct mcctrl_channel *c,
struct syscall_request *sc);
#endif
static int remaining_job, base_cpu, job_pos;
extern int num_channels;
@@ -251,29 +253,52 @@ long mcexec_pin_region(aal_os_t os, unsigned long *__user uaddress)
long mcexec_load_syscall(aal_os_t os, struct syscall_load_desc *__user arg)
{
struct syscall_load_desc desc;
unsigned long phys;
void *rpm;
if (copy_from_user(&desc, arg, sizeof(struct syscall_load_desc))) {
return -EFAULT;
}
phys = aal_device_map_memory(aal_os_to_dev(os), desc.src, desc.size);
rpm = ioremap_wc(phys, desc.size);
printk("mcexec_load_syscall: %s (desc.size: %d)\n", rpm, desc.size);
if (copy_to_user((void *__user)desc.dest, rpm, desc.size)) {
return -EFAULT;
}
iounmap(rpm);
aal_device_unmap_memory(aal_os_to_dev(os), phys, desc.size);
/*
aal_dma_channel_t channel;
struct aal_dma_request request;
unsigned long dma_status = 0;
channel = aal_device_get_dma_channel(aal_os_to_dev(os), 0);
if (!channel) {
return -EINVAL;
}
if (copy_from_user(&desc, arg, sizeof(struct syscall_load_desc))) {
return -EFAULT;
}
memset(&request, 0, sizeof(request));
request.src_os = os;
request.src_phys = desc.src;
request.dest_os = NULL;
request.dest_phys = desc.dest;
request.size = desc.size;
request.notify = (void *)(desc.dest + desc.size);
request.notify = (void *)virt_to_phys(&dma_status);
request.priv = (void *)1;
aal_dma_request(channel, &request);
while (!dma_status) {
mb();
udelay(1);
}
*/
return 0;
}
@@ -308,7 +333,10 @@ long mcexec_ret_syscall(aal_os_t os, struct syscall_ret_desc *__user arg)
ret.size);
rpm = ioremap_wc(phys, ret.size);
memcpy(rpm, phys_to_virt(ret.src), ret.size);
if (copy_from_user(rpm, (void *__user)ret.src, ret.size)) {
return -EFAULT;
}
mc->param.response_va->status = 1;
iounmap(rpm);

View File

@@ -16,6 +16,8 @@
#define DMA_PIN_SHIFT 21
#define DO_USER_MODE
struct ikc_scd_packet {
int msg;
int ref;

View File

@@ -7,6 +7,7 @@
#include <linux/syscalls.h>
#include <asm/uaccess.h>
#include <asm/delay.h>
#include <asm/io.h>
#include "mcctrl.h"
#define ALIGN_WAIT_BUF(z) (((z + 63) >> 6) << 6)
@@ -112,10 +113,14 @@ static unsigned long translate_remote_va(struct mcctrl_channel *c,
return -EFAULT;
}
unsigned long last_thread_exec = 0;
extern struct mcctrl_channel *channels;
#ifndef DO_USER_MODE
int __do_in_kernel_syscall(aal_os_t os, struct mcctrl_channel *c,
struct syscall_request *sc)
{
@@ -230,3 +235,4 @@ int __do_in_kernel_syscall(aal_os_t os, struct mcctrl_channel *c,
}
}
}
#endif /* DO_USER_MODE */