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