Add another exception condition (XXX...I'm gonna have to give in and just

put in support for the new p1212 spec that isn't a standard yet).

Also, minor cleanups and one off by one error when copying text descriptors.
This commit is contained in:
jmc 2002-04-02 10:10:54 +00:00
parent 71419e9eb9
commit a3850d2694
2 changed files with 36 additions and 30 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee1212.c,v 1.1 2002/02/27 04:58:50 jmc Exp $ */
/* $NetBSD: ieee1212.c,v 1.2 2002/04/02 10:10:54 jmc Exp $ */
/*
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@ -168,8 +168,8 @@ p1212_iscomplete(u_int32_t *t, u_int32_t *size)
len = newlen;
newlen = 0;
for (i = 0; i < len; i++) {
type = P1212_DIRENT_GET_KEYTYPE((ntohl(t[offset + i])));
val = P1212_DIRENT_GET_VALUE((ntohl(t[offset + i])));
type = P1212_DIRENT_GET_KEYTYPE((ntohl(t[offset+i])));
val = P1212_DIRENT_GET_VALUE((ntohl(t[offset+i])));
switch (type) {
case P1212_KEYTYPE_Immediate:
case P1212_KEYTYPE_Offset:
@ -198,7 +198,8 @@ p1212_iscomplete(u_int32_t *t, u_int32_t *size)
*/
test--;
infolen = P1212_DIRENT_GET_LEN((ntohl(t[test])));
infolen =
P1212_DIRENT_GET_LEN((ntohl(t[test])));
test++;
test += infolen;
if ((test > *size) && (test > newlen)) {
@ -217,12 +218,12 @@ p1212_iscomplete(u_int32_t *t, u_int32_t *size)
}
/*
* Can't just walk the ROM looking at type codes
* since these are only valid on directory
* entries. So save any directories
* Can't just walk the ROM looking at type
* codes since these are only valid on
* directory entries. So save any directories
* we find into a queue and the bottom of the
* while loop will pop the last one off and walk
* that directory.
* while loop will pop the last one off and
* walk that directory.
*/
test--;
@ -318,7 +319,7 @@ p1212_parse(u_int32_t *t, u_int32_t size, u_int32_t mask)
if (rom->len) {
rom->data = malloc(sizeof(u_int32_t) * rom->len, M_DEVBUF,
M_WAITOK);
/* Add 2 to account for info/crc and bus name we're skipping. */
/* Add 2 to account for info/crc and bus name skipped. */
for (i = 0; i < rom->len; i++)
rom->data[i] = t[i + 2];
}
@ -332,7 +333,7 @@ p1212_parse(u_int32_t *t, u_int32_t size, u_int32_t mask)
* parse/print/match routines have a standard layout to work against.
*/
rom->root = malloc(sizeof(struct p1212_dir), M_DEVBUF, M_WAITOK|M_ZERO);
rom->root = malloc(sizeof(*rom->root), M_DEVBUF, M_WAITOK|M_ZERO);
rom->root->com.key.key_type = P1212_KEYTYPE_Directory;
rom->root->com.key.key_value = 0;
rom->root->com.key.key = (u_int8_t)P1212_KEYTYPE_Directory;
@ -410,7 +411,7 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
* Sanity check for valid types/locations/etc.
*
* See pages 79-100 of
* ISO/IEC 13213:1194 (ANSI/IEEE Std 1212, 1994 edition)
* ISO/IEC 13213:1194(ANSI/IEEE Std 1212, 1994 edition)
* for specifics.
*
* XXX: These all really should be broken out into
@ -446,8 +447,8 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
case P1212_KEYTYPE_Immediate:
if (p1212_validate_immed(val, mask)) {
DPRINTF(("Invalid ROM: Can't have an "
"immediate type with %s value. Key "
"used at location 0x%0x in ROM\n",
"immediate type with %s value. Key"
" used at location 0x%0x in ROM\n",
p1212_keyvalue_strings[val],
(unsigned int)(&t[i]-&addr[0])));
return 1;
@ -476,8 +477,8 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
case P1212_KEYTYPE_Directory:
if (p1212_validate_dir(val, mask)) {
DPRINTF(("Invalid ROM: Can't have a "
"directory type with %s value. Key "
"used at location 0x%0x in ROM\n",
"directory type with %s value. Key"
" used at location 0x%0x in ROM\n",
p1212_keyvalue_strings[val],
(unsigned int)(&t[i]-&addr[0])));
return 1;
@ -514,8 +515,8 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
if (val == P1212_KEYVALUE_Module_Sw_Version) {
if (node_sw_flag) {
DPRINTF(("Can't have a module software "
"version along with a node "
DPRINTF(("Can't have a module software"
" version along with a node "
"software version entry\n"));
return 1;
}
@ -561,8 +562,9 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
* preventing one from putting text descriptors after
* directory descriptors. Also they can be a single
* value or a list of them in a directory format so
* account for either. Finally if they're in a directory
* those can be the only types in a directory.
* account for either. Finally if they're in a
* directory those can be the only types in a
* directory.
*/
if (val == P1212_KEYVALUE_Textual_Descriptor) {
@ -572,8 +574,8 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
leafoff += i;
if (com == NULL) {
DPRINTF(("Can't have a text descriptor "
"as the first entry in a "
DPRINTF(("Can't have a text descriptor"
" as the first entry in a "
"directory\n"));
return 1;
}
@ -591,9 +593,9 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
com->text[0] =
p1212_parse_text_desc(&t[leafoff]);
if (com->text[0] == NULL) {
DPRINTF(("Got an error parsing "
"text descriptor at offset "
"0x%0x\n",
DPRINTF(("Got an error parsing"
" text descriptor at "
"offset 0x%0x\n",
&t[leafoff]-&addr[0]));
free(com->text, M_DEVBUF);
return 1;
@ -658,7 +660,7 @@ p1212_parse_directory(struct p1212_dir *root, u_int32_t *addr, u_int32_t mask)
sdir->match = sdir->com.key.val + i;
TAILQ_INIT(&sdir->data_root);
TAILQ_INIT(&sdir->subdir_root);
TAILQ_INSERT_TAIL(&dir->subdir_root, sdir, dir);
TAILQ_INSERT_TAIL(&dir->subdir_root, sdir,dir);
}
}
@ -741,7 +743,7 @@ p1212_parse_leaf(u_int32_t *t)
M_WAITOK);
leafdata->len = crclen;
for (i = 0; i < crclen; i++)
leafdata->data[i] = t[i];
leafdata->data[i] = ntohl(t[i]);
return leafdata;
}
@ -840,9 +842,9 @@ p1212_parse_text_desc(u_int32_t *addr)
t++;
t++;
crclen -= 2;
size = (crclen * sizeof(u_int32_t)) + 1;
size = (crclen * sizeof(u_int32_t));
text->text = malloc(size, M_DEVBUF, M_WAITOK|M_ZERO);
text->text = malloc(size + 1, M_DEVBUF, M_WAITOK|M_ZERO);
memcpy(text->text, &t[0], size);
@ -1333,6 +1335,9 @@ p1212_validate_dir(u_int16_t val, u_int32_t mask)
case P1212_KEYVALUE_Unit_Dependent_Info:
break;
default:
if ((mask & P1212_ALLOW_VENDOR_DIRECTORY_TYPE) &&
(val == P1212_KEYVALUE_Module_Vendor_Id))
break;
return 1;
break;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee1212reg.h,v 1.6 2002/02/27 04:55:58 jmc Exp $ */
/* $NetBSD: ieee1212reg.h,v 1.7 2002/04/02 10:10:54 jmc Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@ -251,5 +251,6 @@
/* Same thing applies for immediate types. */
#define P1212_ALLOW_DEPENDENT_INFO_IMMED_TYPE 0x2
#define P1212_ALLOW_VENDOR_DIRECTORY_TYPE 0x4
#endif /* _DEV_STD_IEEE1212REG_H_ */