xref: /openbmc/linux/arch/um/drivers/ubd_user.c (revision dbddf429)
1dbddf429SAlex Dewar // SPDX-License-Identifier: GPL-2.0
291acb21fSJeff Dike /*
3f88f0bdfSAnton Ivanov  * Copyright (C) 2016 Anton Ivanov (aivanov@brocade.com)
491acb21fSJeff Dike  * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
591acb21fSJeff Dike  * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com)
691acb21fSJeff Dike  */
791acb21fSJeff Dike 
891acb21fSJeff Dike #include <stddef.h>
991acb21fSJeff Dike #include <unistd.h>
1091acb21fSJeff Dike #include <errno.h>
1191acb21fSJeff Dike #include <sched.h>
1291acb21fSJeff Dike #include <signal.h>
1391acb21fSJeff Dike #include <string.h>
1491acb21fSJeff Dike #include <netinet/in.h>
1591acb21fSJeff Dike #include <sys/time.h>
1691acb21fSJeff Dike #include <sys/socket.h>
1791acb21fSJeff Dike #include <sys/mman.h>
1891acb21fSJeff Dike #include <sys/param.h>
1991acb21fSJeff Dike #include <endian.h>
2091acb21fSJeff Dike #include <byteswap.h>
2191acb21fSJeff Dike 
228ea3c06aSAl Viro #include "ubd.h"
2337185b33SAl Viro #include <os.h>
24f88f0bdfSAnton Ivanov #include <poll.h>
25f88f0bdfSAnton Ivanov 
26f88f0bdfSAnton Ivanov struct pollfd kernel_pollfd;
278ea3c06aSAl Viro 
start_io_thread(unsigned long sp,int * fd_out)2891acb21fSJeff Dike int start_io_thread(unsigned long sp, int *fd_out)
2991acb21fSJeff Dike {
3091acb21fSJeff Dike 	int pid, fds[2], err;
3191acb21fSJeff Dike 
3291acb21fSJeff Dike 	err = os_pipe(fds, 1, 1);
3391acb21fSJeff Dike 	if(err < 0){
3491acb21fSJeff Dike 		printk("start_io_thread - os_pipe failed, err = %d\n", -err);
3591acb21fSJeff Dike 		goto out;
3691acb21fSJeff Dike 	}
3791acb21fSJeff Dike 
3891acb21fSJeff Dike 	kernel_fd = fds[0];
39f88f0bdfSAnton Ivanov 	kernel_pollfd.fd = kernel_fd;
40f88f0bdfSAnton Ivanov 	kernel_pollfd.events = POLLIN;
4191acb21fSJeff Dike 	*fd_out = fds[1];
4291acb21fSJeff Dike 
4389df6bfcSEduard-Gabriel Munteanu 	err = os_set_fd_block(*fd_out, 0);
44f88f0bdfSAnton Ivanov 	err = os_set_fd_block(kernel_fd, 0);
4589df6bfcSEduard-Gabriel Munteanu 	if (err) {
4689df6bfcSEduard-Gabriel Munteanu 		printk("start_io_thread - failed to set nonblocking I/O.\n");
4789df6bfcSEduard-Gabriel Munteanu 		goto out_close;
4889df6bfcSEduard-Gabriel Munteanu 	}
4989df6bfcSEduard-Gabriel Munteanu 
504dbed85aSStanislaw Gruszka 	pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL);
5191acb21fSJeff Dike 	if(pid < 0){
5291acb21fSJeff Dike 		err = -errno;
5356bd194bSJeff Dike 		printk("start_io_thread - clone failed : errno = %d\n", errno);
5491acb21fSJeff Dike 		goto out_close;
5591acb21fSJeff Dike 	}
5691acb21fSJeff Dike 
5791acb21fSJeff Dike 	return(pid);
5891acb21fSJeff Dike 
5991acb21fSJeff Dike  out_close:
6091acb21fSJeff Dike 	os_close_file(fds[0]);
6191acb21fSJeff Dike 	os_close_file(fds[1]);
6291acb21fSJeff Dike 	kernel_fd = -1;
6391acb21fSJeff Dike 	*fd_out = -1;
6491acb21fSJeff Dike  out:
6556bd194bSJeff Dike 	return err;
6691acb21fSJeff Dike }
67f88f0bdfSAnton Ivanov 
ubd_read_poll(int timeout)68f88f0bdfSAnton Ivanov int ubd_read_poll(int timeout)
69f88f0bdfSAnton Ivanov {
70f88f0bdfSAnton Ivanov 	kernel_pollfd.events = POLLIN;
71f88f0bdfSAnton Ivanov 	return poll(&kernel_pollfd, 1, timeout);
72f88f0bdfSAnton Ivanov }
ubd_write_poll(int timeout)73f88f0bdfSAnton Ivanov int ubd_write_poll(int timeout)
74f88f0bdfSAnton Ivanov {
75f88f0bdfSAnton Ivanov 	kernel_pollfd.events = POLLOUT;
76f88f0bdfSAnton Ivanov 	return poll(&kernel_pollfd, 1, timeout);
77f88f0bdfSAnton Ivanov }
78f88f0bdfSAnton Ivanov 
79