mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
hvm: Fix PCI-passthru string parsing.
Fixes crash of xend during HVM domain ccreation. Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
07f557cb63
commit
88561d3058
2 files changed
+21
-69
No files matched your search
@@ -531,48 +531,28 @@ static PyObject *pyxc_set_hvm_param(XcObject *self,
|
||||
|
||||
static int token_value(char *token)
|
||||
{
|
||||
token = strchr(token, 'x');
|
||||
token = token + 1;
|
||||
|
||||
return ((int) strtol(token, NULL, 16));
|
||||
token = strchr(token, 'x') + 1;
|
||||
return strtol(token, NULL, 16);
|
||||
}
|
||||
|
||||
static int first_bdf(char *pci_str, char **last,
|
||||
int *seg, int *bus, int *dev, int *func)
|
||||
static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func)
|
||||
{
|
||||
char *token;
|
||||
|
||||
token = strtok_r(pci_str, ",", last);
|
||||
token = strchr(*str, ',');
|
||||
if ( !token )
|
||||
return 0;
|
||||
token++;
|
||||
|
||||
*seg = token_value(token);
|
||||
token = strtok_r(NULL, ",", last);
|
||||
token = strchr(token, ',') + 1;
|
||||
*bus = token_value(token);
|
||||
token = strtok_r(NULL, ",", last);
|
||||
token = strchr(token, ',') + 1;
|
||||
*dev = token_value(token);
|
||||
token = strtok_r(NULL, ",", last);
|
||||
*func = token_value(token);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int next_bdf(char **last, int *seg, int *bus, int *dev, int *func)
|
||||
{
|
||||
char *token;
|
||||
|
||||
token = strtok_r(NULL, ",", last);
|
||||
if ( !token )
|
||||
return 0;
|
||||
|
||||
*seg = token_value(token);
|
||||
token = strtok_r(NULL, ",", last);
|
||||
*bus = token_value(token);
|
||||
token = strtok_r(NULL, ",", last);
|
||||
*dev = token_value(token);
|
||||
token = strtok_r(NULL, ",", last);
|
||||
token = strchr(token, ',') + 1;
|
||||
*func = token_value(token);
|
||||
|
||||
*str = token;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -584,17 +564,13 @@ static PyObject *pyxc_assign_device(XcObject *self,
|
||||
char *pci_str;
|
||||
uint32_t bdf = 0;
|
||||
int seg, bus, dev, func;
|
||||
int get_bdf;
|
||||
char *last = NULL;
|
||||
|
||||
static char *kwd_list[] = { "domid", "pci", NULL };
|
||||
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|s", kwd_list,
|
||||
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list,
|
||||
&dom, &pci_str) )
|
||||
return NULL;
|
||||
|
||||
for ( get_bdf = first_bdf(pci_str, &last, &seg, &bus, &dev, &func);
|
||||
get_bdf;
|
||||
get_bdf = next_bdf(&last, &seg, &bus, &dev, &func) )
|
||||
while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) )
|
||||
{
|
||||
bdf |= (bus & 0xff) << 16;
|
||||
bdf |= (dev & 0x1f) << 11;
|
||||
|
||||