summaryrefslogtreecommitdiff
path: root/usr/fwparam_ibft/prom_parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'usr/fwparam_ibft/prom_parse.y')
-rw-r--r--usr/fwparam_ibft/prom_parse.y269
1 files changed, 269 insertions, 0 deletions
diff --git a/usr/fwparam_ibft/prom_parse.y b/usr/fwparam_ibft/prom_parse.y
new file mode 100644
index 0000000..efe1578
--- /dev/null
+++ b/usr/fwparam_ibft/prom_parse.y
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) IBM Corporation. 2007
+ * Author: Doug Maxey <dwm@austin.ibm.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* - DEFINITION section. */
+
+%{
+ /* literal block. include lines, decls, defns. */
+//#define YYDEBUG 1
+#if YYDEBUG
+#define DPRINT(fmt,...) printf(fmt,__VA_ARGS__)
+#else
+#define DPRINT(fmt,...) do {} while(0)
+#endif
+#include "prom_parse.h"
+#include "iscsi_obp.h"
+
+
+%}
+%union {
+#define STR_LEN 16384
+ char str[STR_LEN];
+}
+
+/* definitions. */
+%token <str> BUSNAME BOOTDEV
+%token <str> IPV4 IQN
+%token <str> OBPPARM OBPQUAL
+%token <str> HEX4 HEX16
+%token <str> VDEVICE VDEVINST VDEVDEV VDEVRAW
+%token <str> CHOSEN
+%token <str> FILENAME
+
+%type <str> devpath busses bus bootdev
+%type <str> disklabel diskpart
+%type <str> vdevice vdev_parms vdev_parm
+%type <str> obp_quals obp_qual obp_params obp_param
+%type <str> ipaddr ipv4 ipv6
+%type <str> hexpart hexseq
+
+%locations
+%parse-param {struct ofw_dev *ofwdev}
+
+%%
+
+devpath: '/' {
+ DPRINT("****rootonly: \"%s\"\n", "/");
+ }
+ | '/' busses bootdev {
+ DPRINT("****devpath busses:\n/%s/%s\n", $2, $3);
+ }
+ | '/' busses bootdev disklabel {
+ ofwdev->dev_path = malloc(strlen($<str>2) +
+ strlen($<str>3) + 3);
+ sprintf(ofwdev->dev_path, "/%s%s", $<str>2, $<str>3);
+ DPRINT("****devpath busses bootdev "
+ "disklabel:\n/%s/%s%s\n",
+ $2, $3, $4);
+ }
+ | '/' busses bootdev obp_quals obp_params {
+ ofwdev->dev_path = malloc(strlen($<str>2) +
+ strlen($<str>3) + 3);
+ sprintf(ofwdev->dev_path, "/%s%s", $<str>2, $<str>3);
+ DPRINT("****busses bootdev obp_quals obp_parms:\n"
+ "/%s/%s:%s%s\n",
+ $2, $3, $4, $5);
+ }
+ | '/' busses bootdev obp_quals obp_params disklabel {
+ ofwdev->dev_path = malloc(strlen($<str>2) +
+ strlen($<str>3) + 3);
+ sprintf(ofwdev->dev_path, "/%s%s", $<str>2, $<str>3);
+ DPRINT("****busses bootdev obp_quals obp_parms "
+ "disklabel:\n/%s:%s%s%s\n", $2, $4, $5, $6);
+ }
+ | '/' vdevice bootdev vdev_parms obp_quals obp_params disklabel {
+ DPRINT("****vdevice bootdev obp_parms "
+ "disklabel:\n/%s:%s%s%s%s\n",
+ $2, $4, $5, $6, $7);
+ }
+ ;
+
+busses: bus {
+ strcpy($$, $1);
+ }
+ | busses '/' bus {
+ snprintf($$, STR_LEN, "%s/%s", $<str>1, $<str>3);
+ }
+ ;
+
+bus: BUSNAME {
+ strcpy($$, $1);
+ }
+ | BUSNAME '@' HEX4 {
+ snprintf($$, STR_LEN, "%s@%s", $<str>1, $<str>3);
+ }
+ | BUSNAME '@' HEX4 ',' HEX4 {
+ snprintf($$, STR_LEN, "%s@%s,%s", $<str>1, $<str>3, $<str>5);
+ }
+ | BUSNAME '@' HEX16 {
+ snprintf($$, STR_LEN, "%s@%s", $<str>1, $<str>3);
+ }
+ | BUSNAME ',' HEX4 '@' HEX16 {
+ snprintf($$, STR_LEN, "%s,%s@%s", $<str>1, $<str>3, $<str>5);
+ }
+ ;
+
+
+bootdev: '/' BOOTDEV ':' {
+ snprintf($$, STR_LEN, "/%s", $<str>2);
+ }
+ | '/' BOOTDEV '@' HEX4 ':' {
+ snprintf($$, STR_LEN, "/%s@%s", $<str>2, $<str>4);
+ }
+ | '/' BOOTDEV '@' HEX4 ',' HEX4 ':' {
+ snprintf($$, STR_LEN, "/%s@%s,%s", $<str>2, $<str>4, $<str>6);
+ }
+ ;
+
+vdevice: VDEVICE '/' VDEVINST {
+ snprintf($$, STR_LEN, "%s/%s", $<str>1, $<str>3);
+ }
+ ;
+
+vdev_parms: ':' vdev_parm {
+ snprintf($$, STR_LEN, ":%s", $<str>2);
+ }
+ | vdev_parms ',' vdev_parm {
+ snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
+ }
+ | vdev_parms ',' VDEVRAW {
+ snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
+ }
+ ;
+
+vdev_parm: VDEVDEV '=' CHOSEN {
+ snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
+ }
+ ;
+
+obp_params: ',' obp_param {
+ snprintf($$, STR_LEN, ",%s", $2);
+ }
+ | obp_params ',' obp_param {
+ snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
+ }
+ | obp_params ',' disklabel {
+ snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
+ }
+ ;
+
+obp_param: HEX4 {
+ snprintf($$, STR_LEN, "%s", $1);
+ }
+ | OBPPARM '=' HEX16 {
+ /* luns > 0 are the SAM-3+ hex representation. */
+ obp_parm_hexnum(ofwdev, $<str>1, $<str>3);
+ snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
+ }
+ | OBPPARM '=' ipaddr {
+ obp_parm_addr(ofwdev, $<str>1, $<str>3);
+ snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
+ }
+ | OBPPARM '=' IQN {
+ obp_parm_iqn(ofwdev, $<str>1, $<str>3);
+ snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
+ }
+ | OBPPARM '=' HEX4 {
+ obp_parm_hexnum(ofwdev, $<str>1, $<str>3);
+ snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
+ }
+ | OBPPARM '=' FILENAME {
+ obp_parm_str(ofwdev, $<str>1, $<str>3);
+ snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
+ }
+ ;
+
+obp_quals: obp_qual {
+ snprintf($$, STR_LEN, "%s", $1);
+ }
+ | obp_quals ',' obp_qual {
+ snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
+ }
+ ;
+
+obp_qual: OBPQUAL {
+ snprintf($$, STR_LEN, "%s", obp_qual_set(ofwdev, $<str>1));
+ }
+ | vdev_parm {
+ snprintf($$, STR_LEN, "%s", $<str>1);
+ }
+ ;
+
+ipaddr: ipv4 {
+ snprintf($$, STR_LEN, "%s", $<str>1);
+ }
+ | ipv6 {
+ snprintf($$, STR_LEN, "%s", $<str>1);
+ }
+ ;
+
+ipv4: IPV4 {
+ snprintf($$, STR_LEN, "%s", $1);
+ }
+ ;
+
+ipv6: hexpart {
+ snprintf($$, STR_LEN, "%s", $1);
+ }
+ | hexpart ':' ipv4 {
+ snprintf($$, STR_LEN, "%s:%s", $1, $3);
+ }
+ ;
+
+hexpart: hexseq {
+ snprintf($$, STR_LEN, "%s", $1);
+ }
+ | hexpart "::" {
+ snprintf($$, STR_LEN, "%s::", $<str>1);
+ }
+ | hexpart "::" hexseq {
+ snprintf($$, STR_LEN, "%s::%s", $<str>1, $<str>3);
+ }
+ | "::" hexseq {
+ snprintf($$, STR_LEN, "::%s", $<str>2);
+ }
+ ;
+
+hexseq: HEX4 {
+ snprintf($$, STR_LEN, "%s", $1);
+ }
+ | hexseq ":" HEX4 {
+ snprintf($$, STR_LEN, "%s:%s", $<str>1, $<str>3);
+ }
+ ;
+
+disklabel: diskpart {
+ snprintf($$, STR_LEN, "%s", $<str>1);
+ }
+ | HEX4 diskpart {
+ snprintf($$, STR_LEN, "%s%s", $<str>1, $<str>2);
+ }
+ | '@' HEX4 ',' HEX4 diskpart {
+ snprintf($$, STR_LEN, "@%s,%s%s", $<str>2, $<str>4, $<str>5);
+ }
+ ;
+
+diskpart: ':' HEX4 {
+ snprintf($$, STR_LEN, ":%s", $<str>2);
+ }
+ | ':' HEX4 ',' FILENAME {
+ snprintf($$, STR_LEN, ":%s,%s", $<str>2, $<str>4);
+ }
+ ;
+
+%%