aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c
blob: 2408f83880e706b58a06ae79372f2d1a19858b47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* -*-  Mode:C; c-basic-offset:4; tab-width:4 -*-
 ****************************************************************************
 * (C) 2003 - Rolf Neugebauer - Intel Research Cambridge
 ****************************************************************************
 *
 *        File: sched_ops.c
 *      Author: Rolf Neugebauer (neugebar@dcs.gla.ac.uk)
 *     Changes: 
 *              
 *        Date: Mar 2003
 * 
 * Environment: XenoLinux
 * Description: Dom0 Control interface to scheduler in Xen
 *
 * code based on Andy's vfr parsing code
 *
 * Commands understood by the interface:
 *
 * S <did> <mcu advance> [ <warp> <warp limit> <unwarp limit> ]
 * C <context swith allowance>
 *
 ****************************************************************************
 * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $
 ****************************************************************************
 */


#include <linux/proc_fs.h>
#include <asm/hypervisor.h>
#include "dom0_ops.h"

#define SCHED_ENTRY    "sched"
extern struct proc_dir_entry *xeno_base;
static struct proc_dir_entry *sched_pde;


static int sched_read_proc(char *page, char **start, off_t off,
						   int count, int *eof, void *data)
{   
    strcpy(page, readbuf);
    *readbuf = '\0';
    *eof = 1;
    *start = page;
    return strlen(page);
}


static int sched_write_proc(struct file *file, const char *buffer,
							u_long count, void *data)
{
	dom0_op_t op;

	int ret, len;
	int ts, te, tl; /* token start, end, and length */

    /* Only admin can adjust scheduling parameters */
    if ( !capable(CAP_SYS_ADMIN) )
        return -EPERM;

	/* parse the commands  */
	len = count;
	ts = te = 0;

	while ( count && isspace(buffer[ts]) ) { ts++; count--; } // skip spaces.
	te = ts;
	if ( te <= ts ) goto bad;
	tl = te - ts;

	if ( strncmp(&buffer[ts], "S", tl) == 0 )
	{
		op.cmd = NETWORK_OP_ADDRULE;
	}
	else if ( strncmp(&buffer[ts], "C", tl) == 0 )
	{
		op.cmd = NETWORK_OP_DELETERULE;
	}


}


/*
 * main scheduler interface driver driver initialization function.
 */
static int __init init_module(void)
{
    printk(KERN_ALERT "Starting Domain Scheduler Control Interface\n");

    sched_pde = create_proc_entry(SCHED_ENTRY, 0600, xeno_base);
    if ( sched_pde == NULL )
    {
        printk(KERN_ALERT "Unable to create dom scheduler proc entry!");
        return -1;
    }

    sched_pde->read_proc  = sched_read_proc;
    sched_pde->write_proc = sched_write_proc;

    return 0;
}

static void __exit cleanup_module(void)
{
}

module_init(init_module);
module_exit(cleanup_module);