xencons_ring.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 146 行

C
146
字号
#include <types.h>#include <wait.h>#include <mm.h>#include <hypervisor.h>#include <events.h>#include <os.h>#include <lib.h>#include <xenbus.h>#include <xen/io/console.h>DECLARE_WAIT_QUEUE_HEAD(console_queue);static inline struct xencons_interface *xencons_interface(void){    return mfn_to_virt(start_info.console.domU.mfn);}static inline void notify_daemon(void){    /* Use evtchn: this is called early, before irq is set up. */    notify_remote_via_evtchn(start_info.console.domU.evtchn);}int xencons_ring_send_no_notify(const char *data, unsigned len){	    int sent = 0;	struct xencons_interface *intf = xencons_interface();	XENCONS_RING_IDX cons, prod;	cons = intf->out_cons;	prod = intf->out_prod;	mb();	BUG_ON((prod - cons) > sizeof(intf->out));	while ((sent < len) && ((prod - cons) < sizeof(intf->out)))		intf->out[MASK_XENCONS_IDX(prod++, intf->out)] = data[sent++];	wmb();	intf->out_prod = prod;        return sent;}int xencons_ring_send(const char *data, unsigned len){    int sent;    sent = xencons_ring_send_no_notify(data, len);	notify_daemon();	return sent;}	static void handle_input(evtchn_port_t port, struct pt_regs *regs, void *ign){#ifdef HAVE_LIBC        wake_up(&console_queue);#else	struct xencons_interface *intf = xencons_interface();	XENCONS_RING_IDX cons, prod;	cons = intf->in_cons;	prod = intf->in_prod;	mb();	BUG_ON((prod - cons) > sizeof(intf->in));	while (cons != prod) {		xencons_rx(intf->in+MASK_XENCONS_IDX(cons,intf->in), 1, regs);		cons++;	}	mb();	intf->in_cons = cons;	notify_daemon();	xencons_tx();#endif}#ifdef HAVE_LIBCint xencons_ring_avail(void){	struct xencons_interface *intf = xencons_interface();	XENCONS_RING_IDX cons, prod;	cons = intf->in_cons;	prod = intf->in_prod;	mb();	BUG_ON((prod - cons) > sizeof(intf->in));        return prod - cons;}int xencons_ring_recv(char *data, unsigned len){	struct xencons_interface *intf = xencons_interface();	XENCONS_RING_IDX cons, prod;        unsigned filled = 0;	cons = intf->in_cons;	prod = intf->in_prod;	mb();	BUG_ON((prod - cons) > sizeof(intf->in));        while (filled < len && cons + filled != prod) {                data[filled] = *(intf->in + MASK_XENCONS_IDX(cons + filled, intf->in));                filled++;	}	mb();        intf->in_cons = cons + filled;	notify_daemon();        return filled;}#endifint xencons_ring_init(void){	int err;	if (!start_info.console.domU.evtchn)		return 0;	err = bind_evtchn(start_info.console.domU.evtchn, handle_input,			  NULL);	if (err <= 0) {		printk("XEN console request chn bind failed %i\n", err);		return err;	}        unmask_evtchn(start_info.console.domU.evtchn);	/* In case we have in-flight data after save/restore... */	notify_daemon();	return 0;}void xencons_resume(void){	(void)xencons_ring_init();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?