Normally, when a userspace process mapping a grant crashes, the domain
providing the reference receives no indication that its peer has
crashed, possibly leading to unexpected freezes or timeouts. This
function provides a notification of the unmap by signalling an event
channel and/or clearing a specific byte in the page.
This also unifies the 3 very similar grant-mapping osdep interfaces into
a single function instead of introducing yet another minor variation.
Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
tools/include/xen-sys/Linux/gntdev.h | 33 ++++++++++-
tools/libxc/xc_gnttab.c | 26 ++++++--
tools/libxc/xc_linux_osdep.c | 112 +++++++++++++++------------------
tools/libxc/xc_minios.c | 54 +++++------------
tools/libxc/xenctrl.h | 23 +++++++
tools/libxc/xenctrlosdep.h | 20 ++----
tools/libxl/libxlu_cfg_l.c | 102 ++++++++++++++-----------------
tools/libxl/libxlu_cfg_l.h | 32 +++------
8 files changed, 204 insertions(+), 198 deletions(-)
diff --git a/tools/include/xen-sys/Linux/gntdev.h
b/tools/include/xen-sys/Linux/gntdev.h
index 8bd1467..caf6fb4 100644
--- a/tools/include/xen-sys/Linux/gntdev.h
+++ b/tools/include/xen-sys/Linux/gntdev.h
@@ -66,7 +66,7 @@ struct ioctl_gntdev_map_grant_ref {
* before this ioctl is called, or an error will result.
*/
#define IOCTL_GNTDEV_UNMAP_GRANT_REF \
-_IOC(_IOC_NONE, 'G', 1, sizeof(struct ioctl_gntdev_unmap_grant_ref))
+_IOC(_IOC_NONE, 'G', 1, sizeof(struct ioctl_gntdev_unmap_grant_ref))
struct ioctl_gntdev_unmap_grant_ref {
/* IN parameters */
/* The offset was returned by the corresponding map operation. */
@@ -116,4 +116,35 @@ struct ioctl_gntdev_set_max_grants {
uint32_t count;
};
+/*
+ * Sets up an unmap notification within the page, so that the other side can do
+ * cleanup if this side crashes. Required to implement cross-domain robust
+ * mutexes or close notification on communication channels.
+ *
+ * Each mapped page only supports one notification; multiple calls referring to
+ * the same page overwrite the previous notification. You must clear the
+ * notification prior to the IOCTL_GNTALLOC_DEALLOC_GREF if you do not want it
+ * to occur.
+ */
+#define IOCTL_GNTDEV_SET_UNMAP_NOTIFY \
+_IOC(_IOC_NONE, 'G', 7, sizeof(struct ioctl_gntdev_unmap_notify))
+struct ioctl_gntdev_unmap_notify {
+ /* IN parameters */
+ /* Offset in the file descriptor for a byte within the page. This offset
+ * is the result of the IOCTL_GNTDEV_MAP_GRANT_REF and is the same as
+ * is used with mmap(). If using UNMAP_NOTIFY_CLEAR_BYTE, this is the
byte
+ * within the page to be cleared.
+ */
+ uint64_t index;
+ /* Action(s) to take on unmap */
+ uint32_t action;
+ /* Event channel to notify */
+ uint32_t event_channel_port;
+};
+
+/* Clear (set to zero) the byte specified by index */
+#define UNMAP_NOTIFY_CLEAR_BYTE 0x1
+/* Send an interrupt on the indicated event channel */
+#define UNMAP_NOTIFY_SEND_EVENT 0x2
+
#endif /* __LINUX_PUBLIC_GNTDEV_H__ */
diff --git a/tools/libxc/xc_gnttab.c b/tools/libxc/xc_gnttab.c
index 4f55fce..033cc5c 100644
--- a/tools/libxc/xc_gnttab.c
+++ b/tools/libxc/xc_gnttab.c
@@ -18,6 +18,7 @@
*/
#include "xc_private.h"
+#include <errno.h>
int xc_gnttab_op(xc_interface *xch, int cmd, void * op, int op_size, int count)
{
@@ -150,8 +151,8 @@ void *xc_gnttab_map_grant_ref(xc_gnttab *xcg,
uint32_t ref,
int prot)
{
- return xcg->ops->u.gnttab.map_grant_ref(xcg, xcg->ops_handle,
- domid, ref, prot);
+ return xcg->ops->u.gnttab.grant_map(xcg, xcg->ops_handle, 1, 0, prot,
+ &domid, &ref, -1, -1);
}
void *xc_gnttab_map_grant_refs(xc_gnttab *xcg,
@@ -160,8 +161,8 @@ void *xc_gnttab_map_grant_refs(xc_gnttab *xcg,
uint32_t *refs,
int prot)
{
- return xcg->ops->u.gnttab.map_grant_refs(xcg, xcg->ops_handle,
- count, domids, refs, prot);
+ return xcg->ops->u.gnttab.grant_map(xcg, xcg->ops_handle, count, 0,
+ prot, domids, refs, -1, -1);
}
void *xc_gnttab_map_domain_grant_refs(xc_gnttab *xcg,
@@ -170,10 +171,23 @@ void *xc_gnttab_map_domain_grant_refs(xc_gnttab *xcg,
uint32_t *refs,
int prot)
{
- return xcg->ops->u.gnttab.map_domain_grant_refs(xcg, xcg->ops_handle,
- count, domid, refs,
prot);
+ return xcg->ops->u.gnttab.grant_map(xcg, xcg->ops_handle, count,
+ XC_GRANT_MAP_SINGLE_DOMAIN,
+ prot, &domid, refs, -1, -1);
}
+void *xc_gnttab_map_grant_ref_notify(xc_gnttab *xcg,
+ uint32_t domid,
+ uint32_t ref,
+ int prot,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port)
+{
+ return xcg->ops->u.gnttab.grant_map(xcg, xcg->ops_handle, 1, 0, prot,
+ &domid, &ref, notify_offset, notify_port);
+}
+
+
int xc_gnttab_munmap(xc_gnttab *xcg,
void *start_address,
uint32_t count)
diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c
index dca6718..f760421 100644
--- a/tools/libxc/xc_linux_osdep.c
+++ b/tools/libxc/xc_linux_osdep.c
@@ -509,56 +509,21 @@ static int linux_gnttab_close(xc_gnttab *xcg,
xc_osdep_handle h)
return close(fd);
}
-static void *linux_gnttab_map_grant_ref(xc_gnttab *xch, xc_osdep_handle h,
- uint32_t domid, uint32_t ref, int prot)
-{
- int fd = (int)h;
- struct ioctl_gntdev_map_grant_ref map;
- void *addr;
-
- map.count = 1;
- map.refs[0].domid = domid;
- map.refs[0].ref = ref;
-
- if ( ioctl(fd, IOCTL_GNTDEV_MAP_GRANT_REF, &map) ) {
- PERROR("xc_gnttab_map_grant_ref: ioctl MAP_GRANT_REF failed");
- return NULL;
- }
-
-mmap_again:
- addr = mmap(NULL, XC_PAGE_SIZE, prot, MAP_SHARED, fd, map.index);
- if ( addr == MAP_FAILED )
- {
- int saved_errno = errno;
- struct ioctl_gntdev_unmap_grant_ref unmap_grant;
-
- if(saved_errno == EAGAIN)
- {
- usleep(1000);
- goto mmap_again;
- }
- /* Unmap the driver slots used to store the grant information. */
- PERROR("xc_gnttab_map_grant_ref: mmap failed");
- unmap_grant.index = map.index;
- unmap_grant.count = 1;
- ioctl(fd, IOCTL_GNTDEV_UNMAP_GRANT_REF, &unmap_grant);
- errno = saved_errno;
- return NULL;
- }
-
- return addr;
-}
-
-static void *do_gnttab_map_grant_refs(xc_gnttab *xch, xc_osdep_handle h,
- uint32_t count,
- uint32_t *domids, int domids_stride,
- uint32_t *refs, int prot)
+static void *linux_gnttab_grant_map(xc_gnttab *xch, xc_osdep_handle h,
+ uint32_t count, int flags, int prot,
+ uint32_t *domids, uint32_t *refs,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port)
{
int fd = (int)h;
struct ioctl_gntdev_map_grant_ref *map;
void *addr = NULL;
+ int domids_stride = 1;
int i;
+ if (flags & XC_GRANT_MAP_SINGLE_DOMAIN)
+ domids_stride = 0;
+
map = malloc(sizeof(*map) +
(count - 1) * sizeof(struct ioctl_gntdev_map_grant_ref));
if ( map == NULL )
@@ -573,13 +538,52 @@ static void *do_gnttab_map_grant_refs(xc_gnttab *xch,
xc_osdep_handle h,
map->count = count;
if ( ioctl(fd, IOCTL_GNTDEV_MAP_GRANT_REF, map) ) {
- PERROR("xc_gnttab_map_grant_refs: ioctl MAP_GRANT_REF failed");
+ PERROR("linux_gnttab_grant_map: ioctl MAP_GRANT_REF failed");
goto out;
}
+ retry:
addr = mmap(NULL, XC_PAGE_SIZE * count, prot, MAP_SHARED, fd,
map->index);
- if ( addr == MAP_FAILED )
+
+ if (addr == MAP_FAILED && errno == EAGAIN)
+ {
+ /*
+ * The grant hypercall can return EAGAIN if the granted page is
+ * swapped out. Since the paging daemon may be in the same domain, the
+ * hypercall cannot block without causing a deadlock.
+ *
+ * Because there are no notificaitons when the page is swapped in, wait
+ * a bit before retrying, and hope that the page will arrive
eventually.
+ */
+ usleep(1000);
+ goto retry;
+ }
+
+ if (addr != MAP_FAILED)
+ {
+ int rv = 0;
+ struct ioctl_gntdev_unmap_notify notify;
+ notify.index = map->index;
+ notify.action = 0;
+ if (notify_offset >= 0 && notify_offset < XC_PAGE_SIZE * count) {
+ notify.index += notify_offset;
+ notify.action |= UNMAP_NOTIFY_CLEAR_BYTE;
+ }
+ if (notify_port != -1) {
+ notify.event_channel_port = notify_port;
+ notify.action |= UNMAP_NOTIFY_SEND_EVENT;
+ }
+ if (notify.action)
+ rv = ioctl(fd, IOCTL_GNTDEV_SET_UNMAP_NOTIFY, ¬ify);
+ if (rv) {
+ PERROR("linux_gnttab_grant_map: ioctl SET_UNMAP_NOTIFY failed");
+ munmap(addr, count * XC_PAGE_SIZE);
+ addr = MAP_FAILED;
+ }
+ }
+
+ if (addr == MAP_FAILED)
{
int saved_errno = errno;
struct ioctl_gntdev_unmap_grant_ref unmap_grant;
@@ -599,19 +603,7 @@ static void *do_gnttab_map_grant_refs(xc_gnttab *xch,
xc_osdep_handle h,
return addr;
}
-static void *linux_gnttab_map_grant_refs(xc_gnttab *xcg, xc_osdep_handle h,
- uint32_t count, uint32_t *domids,
- uint32_t *refs, int prot)
-{
- return do_gnttab_map_grant_refs(xcg, h, count, domids, 1, refs, prot);
-}
-static void *linux_gnttab_map_domain_grant_refs(xc_gnttab *xcg,
xc_osdep_handle h,
- uint32_t count,
- uint32_t domid, uint32_t
*refs, int prot)
-{
- return do_gnttab_map_grant_refs(xcg, h, count, &domid, 0, refs, prot);
-}
static int linux_gnttab_munmap(xc_gnttab *xcg, xc_osdep_handle h,
void *start_address, uint32_t count)
@@ -659,9 +651,7 @@ static struct xc_osdep_ops linux_gnttab_ops = {
.close = &linux_gnttab_close,
.u.gnttab = {
- .map_grant_ref = &linux_gnttab_map_grant_ref,
- .map_grant_refs = &linux_gnttab_map_grant_refs,
- .map_domain_grant_refs = &linux_gnttab_map_domain_grant_refs,
+ .grant_map = &linux_gnttab_grant_map,
.munmap = &linux_gnttab_munmap,
},
};
diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c
index 3b366eb..ff9c0d8 100644
--- a/tools/libxc/xc_minios.c
+++ b/tools/libxc/xc_minios.c
@@ -458,45 +458,23 @@ void minios_gnttab_close_fd(int fd)
files[fd].type = FTYPE_NONE;
}
-static void *minios_gnttab_map_grant_ref(xc_gnttab *xcg, xc_osdep_handle h,
- uint32_t domid,
- uint32_t ref,
- int prot)
-{
- int fd = (int)h;
- return gntmap_map_grant_refs(&files[fd].gntmap,
- 1,
- &domid, 0,
- &ref,
- prot & PROT_WRITE);
-}
-
-static void *minios_gnttab_map_grant_refs(xc_gnttab *xcg, xc_osdep_handle h,
- uint32_t count,
- uint32_t *domids,
- uint32_t *refs,
- int prot)
-{
- int fd = (int)h;
- return gntmap_map_grant_refs(&files[fd].gntmap,
- count,
- domids, 1,
- refs,
- prot & PROT_WRITE);
-}
-
-static void *minios_gnttab_map_domain_grant_refs(xc_gnttab *xcg,
xc_osdep_handle h,
- uint32_t count,
- uint32_t domid,
- uint32_t *refs,
- int prot)
+static void *minios_gnttab_grant_map(xc_gnttab *xcg, xc_osdep_handle h,
+ uint32_t count, int flags, int prot,
+ uint32_t *domids, uint32_t *refs,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port)
{
int fd = (int)h;
+ int stride = 1;
+ if (flags & XC_GRANT_MAP_SINGLE_DOMAIN)
+ stride = 0;
+ if (notify_offset != -1 || notify_port != -1) {
+ errno = ENOSYS;
+ return NULL;
+ }
return gntmap_map_grant_refs(&files[fd].gntmap,
- count,
- &domid, 0,
- refs,
- prot & PROT_WRITE);
+ count, domids, stride,
+ refs, prot & PROT_WRITE);
}
static int minios_gnttab_munmap(xc_gnttab *xcg, xc_osdep_handle h,
@@ -534,9 +512,7 @@ static struct xc_osdep_ops minios_gnttab_ops = {
.close = &minios_gnttab_close,
.u.gnttab = {
- .map_grant_ref = &minios_gnttab_map_grant_ref,
- .map_grant_refs = &minios_gnttab_map_grant_refs,
- .map_domain_grant_refs = &minios_gnttab_map_domain_grant_refs,
+ .grant_map = &minios_gnttab_grant_map,
.munmap = &minios_gnttab_munmap,
.set_max_grants = &minios_gnttab_set_max_grants,
},
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 1b82ee0..6f3165d 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -1348,6 +1348,29 @@ void *xc_gnttab_map_domain_grant_refs(xc_gnttab *xcg,
uint32_t *refs,
int prot);
+/**
+ * Memory maps a grant reference from one domain to a local address range.
+ * Mappings should be unmapped with xc_gnttab_munmap. If notify_offset or
+ * notify_port are not -1, this version will attempt to set up an unmap
+ * notification at the given offset and event channel. When the page is
+ * unmapped, the byte at the given offset will be zeroed and a wakeup will be
+ * sent to the given event channel. Logs errors.
+ *
+ * @parm xcg a handle on an open grant table interface
+ * @parm domid the domain to map memory from
+ * @parm ref the grant reference ID to map
+ * @parm prot same flag as in mmap()
+ * @parm notify_offset The byte offset in the page to use for unmap
+ * notification; -1 for none.
+ * @parm notify_port The event channel port to use for unmap notify, or -1
+ */
+void *xc_gnttab_map_grant_ref_notify(xc_gnttab *xcg,
+ uint32_t domid,
+ uint32_t ref,
+ int prot,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port);
+
/*
* Unmaps the @count pages starting at @start_address, which were mapped by a
* call to xc_gnttab_map_grant_ref or xc_gnttab_map_grant_refs. Never logs.
diff --git a/tools/libxc/xenctrlosdep.h b/tools/libxc/xenctrlosdep.h
index bfe46e0..1c6317e 100644
--- a/tools/libxc/xenctrlosdep.h
+++ b/tools/libxc/xenctrlosdep.h
@@ -105,20 +105,12 @@ struct xc_osdep_ops
int (*unmask)(xc_evtchn *xce, xc_osdep_handle h, evtchn_port_t
port);
} evtchn;
struct {
- void *(*map_grant_ref)(xc_gnttab *xcg, xc_osdep_handle h,
- uint32_t domid,
- uint32_t ref,
- int prot);
- void *(*map_grant_refs)(xc_gnttab *xcg, xc_osdep_handle h,
- uint32_t count,
- uint32_t *domids,
- uint32_t *refs,
- int prot);
- void *(*map_domain_grant_refs)(xc_gnttab *xcg, xc_osdep_handle h,
- uint32_t count,
- uint32_t domid,
- uint32_t *refs,
- int prot);
+#define XC_GRANT_MAP_SINGLE_DOMAIN 0x1
+ void *(*grant_map)(xc_gnttab *xcg, xc_osdep_handle h,
+ uint32_t count, int flags, int prot,
+ uint32_t *domids, uint32_t *refs,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port);
int (*munmap)(xc_gnttab *xcg, xc_osdep_handle h,
void *start_address,
uint32_t count);
diff --git a/tools/libxl/libxlu_cfg_l.c b/tools/libxl/libxlu_cfg_l.c
index 8448bef..2ffb958 100644
--- a/tools/libxl/libxlu_cfg_l.c
+++ b/tools/libxl/libxlu_cfg_l.c
@@ -34,7 +34,7 @@
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
@@ -51,9 +51,10 @@ typedef uint32_t flex_uint32_t;
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
+typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -84,8 +85,6 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
-#endif /* ! C99 */
-
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
@@ -159,15 +158,7 @@ typedef void* yyscan_t;
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
#endif
/* The state buf must be large enough to hold one state per character in the
main buffer.
@@ -185,7 +176,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
/* Note: We specifically omit the test for yy_rule_can_match_eol because
it requires
* access to the local variable yy_act. Since yyless() is a macro,
it would break
- * existing scanners that call yyless() from OUTSIDE xlu__cfg_yylex.
+ * existing scanners that call yyless() from OUTSIDE xlu__cfg_yylex.
* One obvious solution it to make yy_act a global. I tried that,
and saw
* a 5% performance hit in a non-yylineno scanner, because yy_act is
* normally declared as a register variable-- so it is not worth it.
@@ -197,7 +188,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
if ( yytext[yyl] == '\n' )\
--yylineno;\
}while(0)
-
+
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
do \
@@ -259,7 +250,7 @@ struct yy_buffer_state
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
-
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
@@ -514,7 +505,7 @@ int xlu__cfg_yyget_column(yyscan_t yyscanner);
void xlu__cfg_yyset_column(int column_no, yyscan_t yyscanner);
-#line 518 "libxlu_cfg_l.c"
+#line 509 "libxlu_cfg_l.c"
#define INITIAL 0
#define lexerr 1
@@ -574,9 +565,9 @@ static int yy_init_globals (yyscan_t yyscanner );
/* This must go here because YYSTYPE and YYLTYPE are included
* from bison output in section 1.*/
# define yylval yyg->yylval_r
-
+
# define yylloc yyg->yylloc_r
-
+
int xlu__cfg_yylex_init (yyscan_t* scanner);
int xlu__cfg_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
@@ -610,14 +601,18 @@ int xlu__cfg_yyget_lineno (yyscan_t yyscanner );
void xlu__cfg_yyset_lineno (int line_number ,yyscan_t yyscanner );
+int xlu__cfg_yyget_column (yyscan_t yyscanner );
+
+void xlu__cfg_yyset_column (int column_no ,yyscan_t yyscanner );
+
YYSTYPE * xlu__cfg_yyget_lval (yyscan_t yyscanner );
void xlu__cfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
YYLTYPE *xlu__cfg_yyget_lloc (yyscan_t yyscanner );
-
+
void xlu__cfg_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
-
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
@@ -650,12 +645,7 @@ static int input (yyscan_t yyscanner );
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
#endif
/* Copy whatever the last rule matched to the standard output. */
@@ -674,7 +664,7 @@ static int input (yyscan_t yyscanner );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- size_t n; \
+ unsigned n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@@ -762,7 +752,7 @@ YY_DECL
#line 53 "libxlu_cfg_l.l"
-#line 766 "libxlu_cfg_l.c"
+#line 756 "libxlu_cfg_l.c"
yylval = yylval_param;
@@ -845,7 +835,7 @@ yy_find_action:
int yyl;
for ( yyl = yyg->yy_more_len; yyl < yyleng; ++yyl )
if ( yytext[yyl] == '\n' )
-
+
do{ yylineno++;
yycolumn=0;
}while(0)
@@ -971,7 +961,7 @@ YY_RULE_SETUP
#line 104 "libxlu_cfg_l.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
-#line 975 "libxlu_cfg_l.c"
+#line 965 "libxlu_cfg_l.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(lexerr):
yyterminate();
@@ -1377,7 +1367,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
yyg->yy_hold_char = *++yyg->yy_c_buf_p;
if ( c == '\n' )
-
+
do{ yylineno++;
yycolumn=0;
}while(0)
@@ -1460,7 +1450,7 @@ static void xlu__cfg_yy_load_buffer_state (yyscan_t
yyscanner)
YY_BUFFER_STATE xlu__cfg_yy_create_buffer (FILE * file, int size ,
yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
-
+
b = (YY_BUFFER_STATE) xlu__cfg_yyalloc(sizeof( struct yy_buffer_state )
,yyscanner );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in
xlu__cfg_yy_create_buffer()" );
@@ -1504,7 +1494,7 @@ static void xlu__cfg_yy_load_buffer_state (yyscan_t
yyscanner)
#ifndef __cplusplus
extern int isatty (int );
#endif /* __cplusplus */
-
+
/* Initializes or reinitializes a buffer.
* This function is sometimes called more than once on the same buffer,
* such as during a xlu__cfg_yyrestart() or at EOF.
@@ -1530,7 +1520,7 @@ extern int isatty (int );
}
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
+
errno = oerrno;
}
@@ -1636,9 +1626,9 @@ static void xlu__cfg_yyensure_buffer_stack (yyscan_t
yyscanner)
, yyscanner);
if ( ! yyg->yy_buffer_stack )
YY_FATAL_ERROR( "out of dynamic memory in
xlu__cfg_yyensure_buffer_stack()" );
-
+
memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct
yy_buffer_state*));
-
+
yyg->yy_buffer_stack_max = num_to_alloc;
yyg->yy_buffer_stack_top = 0;
return;
@@ -1667,12 +1657,12 @@ static void xlu__cfg_yyensure_buffer_stack (yyscan_t
yyscanner)
* @param base the character buffer
* @param size the size in bytes of the character buffer
* @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
+ * @return the newly allocated buffer state object.
*/
YY_BUFFER_STATE xlu__cfg_yy_scan_buffer (char * base, yy_size_t size ,
yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
-
+
if ( size < 2 ||
base[size-2] != YY_END_OF_BUFFER_CHAR ||
base[size-1] != YY_END_OF_BUFFER_CHAR )
@@ -1708,14 +1698,14 @@ YY_BUFFER_STATE xlu__cfg_yy_scan_buffer (char * base,
yy_size_t size , yyscan_
*/
YY_BUFFER_STATE xlu__cfg_yy_scan_string (yyconst char * yystr , yyscan_t
yyscanner)
{
-
+
return xlu__cfg_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
}
/** Setup the input buffer state to scan the given bytes. The next call to
xlu__cfg_yylex() will
* scan from a @e copy of @a bytes.
- * @param yybytes the byte buffer to scan
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a
bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
* @param yyscanner The scanner object.
* @return the newly allocated buffer state object.
*/
@@ -1725,7 +1715,7 @@ YY_BUFFER_STATE xlu__cfg_yy_scan_bytes (yyconst char *
yybytes, int _yybytes_l
char *buf;
yy_size_t n;
int i;
-
+
/* Get memory for full buffer, including space for trailing EOB's. */
n = _yybytes_len + 2;
buf = (char *) xlu__cfg_yyalloc(n ,yyscanner );
@@ -1793,10 +1783,10 @@ YY_EXTRA_TYPE xlu__cfg_yyget_extra (yyscan_t yyscanner)
int xlu__cfg_yyget_lineno (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
-
+
return yylineno;
}
@@ -1806,10 +1796,10 @@ int xlu__cfg_yyget_lineno (yyscan_t yyscanner)
int xlu__cfg_yyget_column (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
-
+
return yycolumn;
}
@@ -1870,8 +1860,8 @@ void xlu__cfg_yyset_lineno (int line_number , yyscan_t
yyscanner)
/* lineno is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "xlu__cfg_yyset_lineno called with no buffer" ,
yyscanner);
-
+ yy_fatal_error( "xlu__cfg_yyset_lineno called with no buffer" ,
yyscanner);
+
yylineno = line_number;
}
@@ -1885,8 +1875,8 @@ void xlu__cfg_yyset_column (int column_no , yyscan_t
yyscanner)
/* column is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "xlu__cfg_yyset_column called with no buffer" ,
yyscanner);
-
+ yy_fatal_error( "xlu__cfg_yyset_column called with no buffer" ,
yyscanner);
+
yycolumn = column_no;
}
@@ -1939,13 +1929,13 @@ YYLTYPE *xlu__cfg_yyget_lloc (yyscan_t yyscanner)
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yylloc;
}
-
+
void xlu__cfg_yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yylloc = yylloc_param;
}
-
+
/* User-visible API */
/* xlu__cfg_yylex_init is special because it creates the scanner itself, so it
is
@@ -1993,20 +1983,20 @@ int xlu__cfg_yylex_init_extra(YY_EXTRA_TYPE
yy_user_defined,yyscan_t* ptr_yy_glo
errno = EINVAL;
return 1;
}
-
+
*ptr_yy_globals = (yyscan_t) xlu__cfg_yyalloc ( sizeof( struct yyguts_t ),
&dummy_yyguts );
-
+
if (*ptr_yy_globals == NULL){
errno = ENOMEM;
return 1;
}
-
+
/* By setting to 0xAA, we expose bugs in
yy_init_globals. Leave at 0x00 for releases. */
memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
+
xlu__cfg_yyset_extra (yy_user_defined, *ptr_yy_globals);
-
+
return yy_init_globals ( *ptr_yy_globals );
}
diff --git a/tools/libxl/libxlu_cfg_l.h b/tools/libxl/libxlu_cfg_l.h
index 327c3a4..2066764 100644
--- a/tools/libxl/libxlu_cfg_l.h
+++ b/tools/libxl/libxlu_cfg_l.h
@@ -38,7 +38,7 @@
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
@@ -55,9 +55,10 @@ typedef uint32_t flex_uint32_t;
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
+typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -88,8 +89,6 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
-#endif /* ! C99 */
-
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
@@ -132,15 +131,7 @@ typedef void* yyscan_t;
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
#endif
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
@@ -193,7 +184,7 @@ struct yy_buffer_state
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
-
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
@@ -276,14 +267,18 @@ int xlu__cfg_yyget_lineno (yyscan_t yyscanner );
void xlu__cfg_yyset_lineno (int line_number ,yyscan_t yyscanner );
+int xlu__cfg_yyget_column (yyscan_t yyscanner );
+
+void xlu__cfg_yyset_column (int column_no ,yyscan_t yyscanner );
+
YYSTYPE * xlu__cfg_yyget_lval (yyscan_t yyscanner );
void xlu__cfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
YYLTYPE *xlu__cfg_yyget_lloc (yyscan_t yyscanner );
-
+
void xlu__cfg_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
-
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
@@ -310,12 +305,7 @@ static int yy_flex_strlen (yyconst char * ,yyscan_t
yyscanner);
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
#endif
/* Number of entries by which start-condition stack grows. */
@@ -352,6 +342,6 @@ extern int xlu__cfg_yylex \
#line 104 "libxlu_cfg_l.l"
-#line 356 "libxlu_cfg_l.h"
+#line 346 "libxlu_cfg_l.h"
#undef xlu__cfg_yyIN_HEADER
#endif /* xlu__cfg_yyHEADER_H */
--
1.7.6.2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|