<div class="socmaildefaultfont" dir="ltr" style="font-family:Arial, Helvetica, sans-serif;font-size:10.5pt" ><div dir="ltr" >Good. Thank you Mike.</div>
<div dir="ltr" > </div>
<div dir="ltr" >Btw, Can we use pflash any time of host state, right. ?</div>
<div dir="ltr" >Or is there any restriction there? ( We were told that pflash may go away ).</div>
<div dir="ltr" >
<div><div class="socmaildefaultfont" dir="ltr" style="font-family:Arial;font-size:10.5pt" ><div class="socmaildefaultfont" dir="ltr" style="font-family:Arial;font-size:10.5pt" ><div class="socmaildefaultfont" dir="ltr" style="font-family:Arial;font-size:10.5pt" ><div class="socmaildefaultfont" dir="ltr" style="font-family:Arial;font-size:10.5pt" ><div class="socmaildefaultfont" dir="ltr" style="font-family:Arial;font-size:10.5pt" ><div dir="ltr" style="margin-top: 20px;" ><div style="font-size: 12pt; font-weight: bold; font-family: sans-serif; color: #7C7C5F;" >Sivas R. S</div>
<div style="font-size: 8pt; font-family: sans-serif; margin-top: 10px;" ><div><span style="font-weight: bold; color: #336699;" >E-mail: </span><a href="mailto:sivas.srr@in.ibm.com" style="color: #555" >sivas.srr@in.ibm.com</a></div>
<div>E2E FSP Test Architecture, OpenBMC Test Lead, Lab Management</div>
<div>Automation is good, Identifying Defect earlier is better always</div>
<div>9902233500</div>
<div>08046678273</div></div></div></div></div></div></div></div></div>
<div> </div>
<div> </div>
<blockquote data-history-content-modified="1" style="border-left:solid #aaaaaa 2px; margin-left:5px; padding-left:5px; direction:ltr; margin-right:0px" >----- Original message -----<br>From: Michael Tritz <mtritz@us.ibm.com><br>Sent by: "openbmc" <openbmc-bounces+sivas.srr=in.ibm.com@lists.ozlabs.org><br>To: skiboot@lists.ozlabs.org, openbmc@lists.ozlabs.org<br>Cc: stewart@linux.vnet.ibm.com, Michael Tritz <mtritz@us.ibm.com>, cyrilbur@gmail.com<br>Subject: [PATCH v6] pflash option to retrieve PNOR partition flags<br>Date: Thu, Jul 6, 2017 12:47 AM<br> <br><tt><font size="3" face="" >This commit extends pflash with an option to retrieve and print</font></tt><br><tt><font size="3" face="" >information for a particular partition, including the content from</font></tt><br><tt><font size="3" face="" >"pflash -i" and a verbose list of set miscellaneous flags. -i option</font></tt><br><tt><font size="3" face="" >is also updated to print a short list of flags in addition to the</font></tt><br><tt><font size="3" face="" >ECC flag, with one character per flag. A test of the new option is</font></tt><br><tt><font size="3" face="" >included in libflash/test.</font></tt><br><br><tt><font size="3" face="" >V6: Reverted change to has_ecc() to avoid breaking libffs</font></tt><br><br><tt><font size="3" face="" >Change-Id: Iebb8a6d34c537cecd2eb44ddf41271c8fbe25258</font></tt><br><tt><font size="3" face="" >Signed-off-by: Michael Tritz <mtritz@us.ibm.com></font></tt><br><tt><font size="3" face="" >---</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >external/pflash/pflash.c | 134 ++++++++++++++++++++++++++++++++++----</font></tt><br> <tt><font size="3" face="" >libflash/libffs.c | 11 +++-</font></tt><br> <tt><font size="3" face="" >libflash/libffs.h | 4 ++</font></tt><br> <tt><font size="3" face="" >libflash/test/Makefile.check | 5 +-</font></tt><br> <tt><font size="3" face="" >libflash/test/test-miscprint.pnor | 103 +++++++++++++++++++++++++++++</font></tt><br> <tt><font size="3" face="" >libflash/test/test-miscprint.sh | 27 ++++++++</font></tt><br> <tt><font size="3" face="" >6 files changed, 269 insertions(+), 15 deletions(-)</font></tt><br> <tt><font size="3" face="" >create mode 100644 libflash/test/test-miscprint.pnor</font></tt><br> <tt><font size="3" face="" >create mode 100644 libflash/test/test-miscprint.sh</font></tt></li></ul><tt><font size="3" face="" >diff --git a/external/pflash/pflash.c b/external/pflash/pflash.c</font></tt><br><tt><font size="3" face="" >index a344987e..9d57feea 100644</font></tt><br><tt><font size="3" face="" >--- a/external/pflash/pflash.c</font></tt><br><tt><font size="3" face="" >+++ b/external/pflash/pflash.c</font></tt><br><tt><font size="3" face="" >@@ -14,6 +14,8 @@</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >* limitations under the License.</font></tt><br> <tt><font size="3" face="" >*/</font></tt></li></ul><tt><font size="3" face="" >+#define _GNU_SOURCE</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >#include <stdio.h></font></tt><br> <tt><font size="3" face="" >#include <stdlib.h></font></tt><br> <tt><font size="3" face="" >#include <string.h></font></tt></li></ul><tt><font size="3" face="" >@@ -90,6 +92,7 @@ static void print_ffs_info(uint32_t toc_offset)</font></tt><br><tt><font size="3" face="" >{</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >struct ffs_handle *ffs_handle;</font></tt><br> <tt><font size="3" face="" >uint32_t other_side_offset = 0;</font></tt></li></ul><tt><font size="3" face="" >+ struct ffs_entry *ent;</font></tt><br><tt><font size="3" face="" >int rc;</font></tt><br><tt><font size="3" face="" >uint32_t i;</font></tt><br><br><tt><font size="3" face="" >@@ -103,25 +106,40 @@ static void print_ffs_info(uint32_t toc_offset)</font></tt><br><tt><font size="3" face="" >return;</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >}</font></tt></li></ul><tt><font size="3" face="" >- for (i = 0;; i++) {</font></tt><br><tt><font size="3" face="" >+ for (i = 0; rc == 0; i++) {</font></tt><br><tt><font size="3" face="" >uint32_t start, size, act, end;</font></tt><br><tt><font size="3" face="" >- bool ecc;</font></tt><br><tt><font size="3" face="" >- char *name;</font></tt><br><tt><font size="3" face="" >+ char *name = NULL, *flags;</font></tt><br><tt><font size="3" face="" >+ int l;</font></tt><br><br><tt><font size="3" face="" >- rc = ffs_part_info(ffs_handle, i, &name, &start, &size, &act, &ecc);</font></tt><br><tt><font size="3" face="" >+ rc = ffs_part_info(ffs_handle, i, &name, &start, &size, &act, NULL);</font></tt>
<ul style="padding-left: 18pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >if (rc == FFS_ERR_PART_NOT_FOUND)</font></tt><br> <tt><font size="3" face="" >break;</font></tt></li></ul><tt><font size="3" face="" >- if (rc) {</font></tt><br><tt><font size="3" face="" >- fprintf(stderr, "Error %d scanning partitions\n", rc);</font></tt><br><tt><font size="3" face="" >- break;</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ ent = ffs_entry_get(ffs_handle, i);</font></tt><br><tt><font size="3" face="" >+ if (rc || !ent) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "Error %d scanning partitions\n",</font></tt><br><tt><font size="3" face="" >+ !ent ? FFS_ERR_PART_NOT_FOUND : rc);</font></tt><br><tt><font size="3" face="" >+ goto out;</font></tt><br><tt><font size="3" face="" >}</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ l = asprintf(&flags, "[%c%c%c%c%c]",</font></tt><br><tt><font size="3" face="" >+ has_ecc(ent) ? 'E' : '-',</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_PRESERVED) ? 'P' : '-',</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_READONLY) ? 'R' : '-',</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_BACKUP) ? 'B' : '-',</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_REPROVISION) ? 'F' : '-');</font></tt><br><tt><font size="3" face="" >+ if (l < 0)</font></tt><br><tt><font size="3" face="" >+ goto out;</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 18pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >end = start + size;</font></tt><br> <tt><font size="3" face="" >printf("ID=%02d %15s %08x..%08x (actual=%08x) %s\n",</font></tt></li></ul><tt><font size="3" face="" >- i, name, start, end, act, ecc ? "[ECC]" : "");</font></tt><br><tt><font size="3" face="" >+ i, name, start, end, act, flags);</font></tt>
<ul style="padding-left: 18pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >if (strcmp(name, "OTHER_SIDE") == 0)</font></tt><br> <tt><font size="3" face="" >other_side_offset = start;</font></tt></li></ul><tt><font size="3" face="" >+ free(flags);</font></tt><br><tt><font size="3" face="" >+out:</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >free(name);</font></tt><br> <tt><font size="3" face="" >}</font></tt></li></ul><tt><font size="3" face="" >@@ -413,6 +431,81 @@ static void disable_4B_addresses(void)</font></tt><br><tt><font size="3" face="" >}</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >}</font></tt></li></ul><tt><font size="3" face="" >+static void print_partition_detail(uint32_t toc_offset, uint32_t part_id, char *name)</font></tt><br><tt><font size="3" face="" >+{</font></tt><br><tt><font size="3" face="" >+ uint32_t start, size, act, end;</font></tt><br><tt><font size="3" face="" >+ struct ffs_handle *ffs_handle;</font></tt><br><tt><font size="3" face="" >+ char *ent_name = NULL, *flags;</font></tt><br><tt><font size="3" face="" >+ struct ffs_entry *ent;</font></tt><br><tt><font size="3" face="" >+ int rc, l;</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ rc = ffs_init(toc_offset, fl_total_size, bl, &ffs_handle, 0);</font></tt><br><tt><font size="3" face="" >+ if (rc) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "Error %d opening ffs !\n", rc);</font></tt><br><tt><font size="3" face="" >+ return;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ if (name) {</font></tt><br><tt><font size="3" face="" >+ uint32_t i;</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ for (i = 0;;i++) {</font></tt><br><tt><font size="3" face="" >+ rc = ffs_part_info(ffs_handle, i, &ent_name, &start, &size, &act,</font></tt><br><tt><font size="3" face="" >+ NULL);</font></tt><br><tt><font size="3" face="" >+ if (rc == FFS_ERR_PART_NOT_FOUND) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "Partition with name %s doesn't exist within TOC at 0x%08x\n", name, toc_offset);</font></tt><br><tt><font size="3" face="" >+ goto out;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+ if (rc || strncmp(ent_name, name, FFS_PART_NAME_MAX) == 0) {</font></tt><br><tt><font size="3" face="" >+ part_id = i;</font></tt><br><tt><font size="3" face="" >+ break;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+ free(ent_name);</font></tt><br><tt><font size="3" face="" >+ ent_name = NULL;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+ } else {</font></tt><br><tt><font size="3" face="" >+ rc = ffs_part_info(ffs_handle, part_id, &ent_name, &start, &size, &act,</font></tt><br><tt><font size="3" face="" >+ NULL);</font></tt><br><tt><font size="3" face="" >+ if (rc == FFS_ERR_PART_NOT_FOUND) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "Partition with ID %d doesn't exist within TOC at 0x%08x\n",</font></tt><br><tt><font size="3" face="" >+ part_id, toc_offset);</font></tt><br><tt><font size="3" face="" >+ goto out;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+ ent = ffs_entry_get(ffs_handle, part_id);</font></tt><br><tt><font size="3" face="" >+ if (rc || !ent) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "Error %d scanning partitions\n", !ent ?</font></tt><br><tt><font size="3" face="" >+ FFS_ERR_PART_NOT_FOUND : rc);</font></tt><br><tt><font size="3" face="" >+ goto out;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ printf("Detailed partition information\n");</font></tt><br><tt><font size="3" face="" >+ end = start + size;</font></tt><br><tt><font size="3" face="" >+ printf("Name:\n");</font></tt><br><tt><font size="3" face="" >+ printf("%s (ID=%02d)\n\n", ent_name, part_id);</font></tt><br><tt><font size="3" face="" >+ printf("%-10s %-10s %-10s\n", "Start", "End", "Actual");</font></tt><br><tt><font size="3" face="" >+ printf("0x%08x 0x%08x 0x%08x\n\n", start, end, act);</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ printf("Flags:\n");</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ l = asprintf(&flags, "%s%s%s%s%s", has_ecc(ent) ? "ECC [E]\n" : "",</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_PRESERVED) ? "PRESERVED [P]\n" : "",</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_READONLY) ? "READONLY [R]\n" : "",</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_BACKUP) ? "BACKUP [B]\n" : "",</font></tt><br><tt><font size="3" face="" >+ has_flag(ent, FFS_MISCFLAGS_REPROVISION) ?</font></tt><br><tt><font size="3" face="" >+ "REPROVISION [F]\n" : "");</font></tt><br><tt><font size="3" face="" >+ if (l < 0) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "Memory allocation failure printing flags!\n");</font></tt><br><tt><font size="3" face="" >+ goto out;</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ printf("%s", flags);</font></tt><br><tt><font size="3" face="" >+ free(flags);</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+out:</font></tt><br><tt><font size="3" face="" >+ ffs_close(ffs_handle);</font></tt><br><tt><font size="3" face="" >+ free(ent_name);</font></tt><br><tt><font size="3" face="" >+}</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >static void print_version(void)</font></tt><br> <tt><font size="3" face="" >{</font></tt></li></ul><tt><font size="3" face="" >printf("Open-Power Flash tool %s\n", version);</font></tt><br><tt><font size="3" face="" >@@ -494,6 +587,10 @@ static void print_help(const char *pname)</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >printf("\t\tpartition and then set all the ECC bits as they should be\n\n");</font></tt><br> <tt><font size="3" face="" >printf("\t-i, --info\n");</font></tt><br> <tt><font size="3" face="" >printf("\t\tDisplay some information about the flash.\n\n");</font></tt></li></ul><tt><font size="3" face="" >+ printf("\t--detail\n");</font></tt><br><tt><font size="3" face="" >+ printf("\t\tDisplays detailed info about a particular partition.\n");</font></tt><br><tt><font size="3" face="" >+ printf("\t\tAccepts a numeric partition or can be used in conjuction\n");</font></tt><br><tt><font size="3" face="" >+ printf("\t\twith the -P flag.\n\n");</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >printf("\t-h, --help\n");</font></tt><br> <tt><font size="3" face="" >printf("\t\tThis message.\n\n");</font></tt></li></ul><tt><font size="3" face="" >}</font></tt><br><tt><font size="3" face="" >@@ -508,7 +605,7 @@ void exiting(void)</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >int main(int argc, char *argv[])</font></tt><br> <tt><font size="3" face="" >{</font></tt></li></ul><tt><font size="3" face="" >const char *pname = argv[0];</font></tt><br><tt><font size="3" face="" >- uint32_t address = 0, read_size = 0, write_size = 0;</font></tt><br><tt><font size="3" face="" >+ uint32_t address = 0, read_size = 0, write_size = 0, detail_id = UINT_MAX;</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >uint32_t erase_start = 0, erase_size = 0;</font></tt><br> <tt><font size="3" face="" >bool erase = false, do_clear = false;</font></tt><br> <tt><font size="3" face="" >bool program = false, erase_all = false, info = false, do_read = false;</font></tt></li></ul><tt><font size="3" face="" >@@ -516,7 +613,7 @@ int main(int argc, char *argv[])</font></tt><br><tt><font size="3" face="" >bool show_help = false, show_version = false;</font></tt><br><tt><font size="3" face="" >bool no_action = false, tune = false;</font></tt><br><tt><font size="3" face="" >char *write_file = NULL, *read_file = NULL, *part_name = NULL;</font></tt><br><tt><font size="3" face="" >- bool ffs_toc_seen = false, direct = false;</font></tt><br><tt><font size="3" face="" >+ bool ffs_toc_seen = false, direct = false, print_detail = false;</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >int rc;</font></tt></li></ul><tt><font size="3" face="" >while(1) {</font></tt><br><tt><font size="3" face="" >@@ -535,6 +632,7 @@ int main(int argc, char *argv[])</font></tt>
<ul style="padding-left: 24pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >{"force", no_argument, NULL, 'f'},</font></tt><br> <tt><font size="3" face="" >{"flash-file", required_argument, NULL, 'F'},</font></tt><br> <tt><font size="3" face="" >{"info", no_argument, NULL, 'i'},</font></tt></li></ul><tt><font size="3" face="" >+ {"detail", optional_argument, NULL, 'm'},</font></tt><br><tt><font size="3" face="" >{"tune", no_argument, NULL, 't'},</font></tt><br><tt><font size="3" face="" >{"dummy", no_argument, NULL, 'd'},</font></tt><br><tt><font size="3" face="" >{"help", no_argument, NULL, 'h'},</font></tt><br><tt><font size="3" face="" >@@ -622,6 +720,11 @@ int main(int argc, char *argv[])</font></tt><br><tt><font size="3" face="" >case 'c':</font></tt>
<ul style="padding-left: 24pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >do_clear = true;</font></tt><br> <tt><font size="3" face="" >break;</font></tt></li></ul><tt><font size="3" face="" >+ case 'm':</font></tt><br><tt><font size="3" face="" >+ print_detail = true;</font></tt><br><tt><font size="3" face="" >+ if (optarg)</font></tt><br><tt><font size="3" face="" >+ detail_id = strtoul(optarg, NULL, 0);</font></tt><br><tt><font size="3" face="" >+ break;</font></tt>
<ul style="padding-left: 18pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >case ':':</font></tt><br> <tt><font size="3" face="" >fprintf(stderr, "Unrecognised option \"%s\" to '%c'\n", optarg, optopt);</font></tt><br> <tt><font size="3" face="" >no_action = true;</font></tt></li></ul><tt><font size="3" face="" >@@ -651,7 +754,7 @@ int main(int argc, char *argv[])</font></tt><br><tt><font size="3" face="" >* also tune them as a side effect</font></tt><br><tt><font size="3" face="" >*/</font></tt><br><tt><font size="3" face="" >no_action = no_action || (!erase && !program && !info && !do_read &&</font></tt><br><tt><font size="3" face="" >- !enable_4B && !disable_4B && !tune && !do_clear);</font></tt><br><tt><font size="3" face="" >+ !enable_4B && !disable_4B && !tune && !do_clear && !print_detail);</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >/* Nothing to do, if we didn't already, print usage */</font></tt><br> <tt><font size="3" face="" >if (no_action && !show_version)</font></tt></li></ul><tt><font size="3" face="" >@@ -684,6 +787,12 @@ int main(int argc, char *argv[])</font></tt><br><tt><font size="3" face="" >exit(1);</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >}</font></tt></li></ul><tt><font size="3" face="" >+ if (print_detail && ((detail_id == UINT_MAX && !part_name)</font></tt><br><tt><font size="3" face="" >+ || (detail_id != UINT_MAX && part_name))) {</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "--detail requires either a partition id or\n");</font></tt><br><tt><font size="3" face="" >+ fprintf(stderr, "a partition name with -P\n");</font></tt><br><tt><font size="3" face="" >+ }</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >/* part-name and erase-all make no sense together */</font></tt><br> <tt><font size="3" face="" >if (part_name && erase_all) {</font></tt></li></ul><tt><font size="3" face="" >fprintf(stderr, "--partition and --erase-all are mutually"</font></tt><br><tt><font size="3" face="" >@@ -872,6 +981,9 @@ int main(int argc, char *argv[])</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >print_flash_info(flash_side ? 0 : ffs_toc);</font></tt><br> <tt><font size="3" face="" >}</font></tt></li></ul><tt><font size="3" face="" >+ if (print_detail)</font></tt><br><tt><font size="3" face="" >+ print_partition_detail(flash_side ? 0 : ffs_toc, detail_id, part_name);</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >/* Unlock flash (PNOR only) */</font></tt><br> <tt><font size="3" face="" >if ((erase || program || do_clear) && !bmc_flash && !flashfilename) {</font></tt></li></ul><tt><font size="3" face="" >need_relock = arch_flash_set_wrprotect(bl, false);</font></tt><br><tt><font size="3" face="" >diff --git a/libflash/libffs.c b/libflash/libffs.c</font></tt><br><tt><font size="3" face="" >index 763e061c..daa62da6 100644</font></tt><br><tt><font size="3" face="" >--- a/libflash/libffs.c</font></tt><br><tt><font size="3" face="" >+++ b/libflash/libffs.c</font></tt><br><tt><font size="3" face="" >@@ -180,7 +180,12 @@ static int ffs_entry_to_cpu(struct ffs_hdr *hdr,</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >return rc;</font></tt><br> <tt><font size="3" face="" >}</font></tt></li></ul><tt><font size="3" face="" >-static struct ffs_entry *ffs_get_part(struct ffs_handle *ffs, uint32_t index)</font></tt><br><tt><font size="3" face="" >+bool has_flag(struct ffs_entry *ent, uint16_t flag)</font></tt><br><tt><font size="3" face="" >+{</font></tt><br><tt><font size="3" face="" >+ return ((ent->user.miscflags & flag) != 0);</font></tt><br><tt><font size="3" face="" >+}</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index)</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >{</font></tt><br> <tt><font size="3" face="" >int i = 0;</font></tt><br> <tt><font size="3" face="" >struct ffs_entry *ent = NULL;</font></tt></li></ul><tt><font size="3" face="" >@@ -369,7 +374,7 @@ int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,</font></tt><br><tt><font size="3" face="" >struct ffs_entry *ent;</font></tt><br><tt><font size="3" face="" >char *n;</font></tt><br><br><tt><font size="3" face="" >- ent = ffs_get_part(ffs, part_idx);</font></tt><br><tt><font size="3" face="" >+ ent = ffs_entry_get(ffs, part_idx);</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >if (!ent)</font></tt><br> <tt><font size="3" face="" >return FFS_ERR_PART_NOT_FOUND;</font></tt></li></ul><tt><font size="3" face="" >@@ -776,7 +781,7 @@ int ffs_update_act_size(struct ffs_handle *ffs, uint32_t part_idx,</font></tt><br><tt><font size="3" face="" >uint32_t offset;</font></tt><br><tt><font size="3" face="" >int rc;</font></tt><br><br><tt><font size="3" face="" >- ent = ffs_get_part(ffs, part_idx);</font></tt><br><tt><font size="3" face="" >+ ent = ffs_entry_get(ffs, part_idx);</font></tt>
<ul style="padding-left: 12pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >if (!ent) {</font></tt><br> <tt><font size="3" face="" >FL_DBG("FFS: Entry not found\n");</font></tt><br> <tt><font size="3" face="" >return FFS_ERR_PART_NOT_FOUND;</font></tt></li></ul><tt><font size="3" face="" >diff --git a/libflash/libffs.h b/libflash/libffs.h</font></tt><br><tt><font size="3" face="" >index 2c1fbd83..a86c698f 100644</font></tt><br><tt><font size="3" face="" >--- a/libflash/libffs.h</font></tt><br><tt><font size="3" face="" >+++ b/libflash/libffs.h</font></tt><br><tt><font size="3" face="" >@@ -92,6 +92,8 @@ struct ffs_entry_user {</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >bool has_ecc(struct ffs_entry *ent);</font></tt></li></ul><tt><font size="3" face="" >+bool has_flag(struct ffs_entry *ent, uint16_t flag);</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >/* Init */</font></tt></li></ul><tt><font size="3" face="" >int ffs_init(uint32_t offset, uint32_t max_size, struct blocklevel_device *bl,</font></tt><br><tt><font size="3" face="" >@@ -126,6 +128,8 @@ int ffs_part_info(struct ffs_handle *ffs, uint32_t part_idx,</font></tt>
<ul style="padding-left: 30pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >char **name, uint32_t *start,</font></tt><br> <tt><font size="3" face="" >uint32_t *total_size, uint32_t *act_size, bool *ecc);</font></tt></li></ul><tt><font size="3" face="" >+struct ffs_entry *ffs_entry_get(struct ffs_handle *ffs, uint32_t index);</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >int ffs_update_act_size(struct ffs_handle *ffs, uint32_t part_idx,</font></tt><br> <tt><font size="3" face="" >uint32_t act_size);</font></tt></li></ul><tt><font size="3" face="" >diff --git a/libflash/test/Makefile.check b/libflash/test/Makefile.check</font></tt><br><tt><font size="3" face="" >index 1f92b9d2..419a50a9 100644</font></tt><br><tt><font size="3" face="" >--- a/libflash/test/Makefile.check</font></tt><br><tt><font size="3" face="" >+++ b/libflash/test/Makefile.check</font></tt><br><tt><font size="3" face="" >@@ -4,7 +4,7 @@ LIBFLASH_TEST := libflash/test/test-flash libflash/test/test-ecc libflash/test/t</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >LCOV_EXCLUDE += $(LIBFLASH_TEST:%=%.c)</font></tt></li></ul><tt><font size="3" face="" >.PHONY : libflash-check libc-coverage</font></tt><br><tt><font size="3" face="" >-libflash-check: $(LIBFLASH_TEST:%=%-check) $(CORE_TEST:%=%-gcov-run)</font></tt><br><tt><font size="3" face="" >+libflash-check: $(LIBFLASH_TEST:%=%-check) libflash/test/test-miscprint $(CORE_TEST:%=%-gcov-run)</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >libflash-coverage: $(LIBFLASH_TEST:%=%-gcov-run)</font></tt></li></ul><tt><font size="3" face="" >check: libflash-check libc-coverage</font></tt><br><tt><font size="3" face="" >@@ -16,6 +16,9 @@ $(LIBFLASH_TEST:%=%-gcov-run) : %-run: %</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >$(LIBFLASH_TEST:%=%-check) : %-check: %</font></tt><br> <tt><font size="3" face="" >$(call QTEST, RUN-TEST ,$(VALGRIND) $<, $<)</font></tt></li></ul><tt><font size="3" face="" >+libflash/test/test-miscprint:</font></tt><br><tt><font size="3" face="" >+ $(call Q, RUN-TEST , ./libflash/test/test-miscprint.sh , $@)</font></tt><br><tt><font size="3" face="" >+</font></tt>
<ul style="padding-left: 6pt; margin-left: 0px; list-style-type: none;" > <li><tt><font size="3" face="" >libflash/test/stubs.o: libflash/test/stubs.c</font></tt><br> <tt><font size="3" face="" >$(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) -g -c -o $@ $<, $<)</font></tt></li></ul><tt><font size="3" face="" >diff --git a/libflash/test/test-miscprint.pnor b/libflash/test/test-miscprint.pnor</font></tt><br><tt><font size="3" face="" >new file mode 100644</font></tt><br><tt><font size="3" face="" >index 00000000..e3f3d355</font></tt><br><tt><font size="3" face="" >--- /dev/null</font></tt><br><tt><font size="3" face="" >+++ b/libflash/test/test-miscprint.pnor</font></tt><br><tt><font size="3" face="" >@@ -0,0 +1,103 @@</font></tt><br><tt><font size="3" face="" >+504152540000000100000001000000800000000500000300000000040000</font></tt><br><tt><font size="3" face="" >+0000000000000000000000000000504151d5706172740000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000001ffffffff0000000100000003000000010000</font></tt><br><tt><font size="3" face="" >+030000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000008f9e8e8950524553</font></tt><br><tt><font size="3" face="" >+4552564544000000000000000000000100000000ffffffff000000020000</font></tt><br><tt><font size="3" face="" >+000100000000000001000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+008000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+ae7fedeb524541444f4e4c5900000000000000000000000100000000ffff</font></tt><br><tt><font size="3" face="" >+ffff00000003000000010000000000000100000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000400000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+0000000000000000e2b4f3e1524550524f564953494f4e00000000000000</font></tt><br><tt><font size="3" face="" >+000100000000ffffffff0000000400000001000000000000010000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000010000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+00000000000000000000000000000000abb3a9fa4241434b555000000000</font></tt><br><tt><font size="3" face="" >+0000000000000000000200000000ffffffff000000050000000100000000</font></tt><br><tt><font size="3" face="" >+000001000000000000000000000000000000000000000000002000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000000000000000000000</font></tt><br><tt><font size="3" face="" >+000000000000000000000000000000000000000000000000e8cebdb2ffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >+ffffffffffffffffffffffff</font></tt><br><tt><font size="3" face="" >diff --git a/libflash/test/test-miscprint.sh b/libflash/test/test-miscprint.sh</font></tt><br><tt><font size="3" face="" >new file mode 100644</font></tt><br><tt><font size="3" face="" >index 00000000..224328be</font></tt><br><tt><font size="3" face="" >--- /dev/null</font></tt><br><tt><font size="3" face="" >+++ b/libflash/test/test-miscprint.sh</font></tt><br><tt><font size="3" face="" >@@ -0,0 +1,27 @@</font></tt><br><tt><font size="3" face="" >+#!/bin/bash</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+# test-miscprint.pnor is constructed as follows:</font></tt><br><tt><font size="3" face="" >+# PRESERVED,0x00000300,0x00000100,P,/dev/zero</font></tt><br><tt><font size="3" face="" >+# READONLY,0x00000400,0x00000100,R,/dev/zero</font></tt><br><tt><font size="3" face="" >+# REPROVISION,0x00000500,0x00000100,F,/dev/zero</font></tt><br><tt><font size="3" face="" >+# BACKUP,0x00000600,0x00000100,B,/dev/zero</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+wd=$(dirname -- "$0")</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+{</font></tt><br><tt><font size="3" face="" >+ xxd -p -r "$wd/test-miscprint.pnor" > "$wd/temp.pnor"</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ output1=$(pflash --detail=1 -F "$wd/temp.pnor" | grep "\[P\]")</font></tt><br><tt><font size="3" face="" >+ output2=$(pflash --detail=2 -F "$wd/temp.pnor" | grep "\[R\]")</font></tt><br><tt><font size="3" face="" >+ output3=$(pflash --detail=3 -F "$wd/temp.pnor" | grep "\[F\]")</font></tt><br><tt><font size="3" face="" >+ output4=$(pflash --detail=4 -F "$wd/temp.pnor" | grep "\[B\]")</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ if [[ $output1 == "PRESERVED [P]" && $output2 == "READONLY [R]" &&</font></tt><br><tt><font size="3" face="" >+ $output3 == "REPROVISION [F]" && $output4 == "BACKUP [B]" ]]; then</font></tt><br><tt><font size="3" face="" >+ echo "Test passed!"</font></tt><br><tt><font size="3" face="" >+ else</font></tt><br><tt><font size="3" face="" >+ echo "Test failed!"</font></tt><br><tt><font size="3" face="" >+ fi</font></tt><br><tt><font size="3" face="" >+</font></tt><br><tt><font size="3" face="" >+ rm "$wd/temp.pnor"</font></tt><br><tt><font size="3" face="" >+} > "$wd/test-miscprint.o"</font></tt><br><tt><font size="3" face="" >--</font></tt><br><tt><font size="3" face="" >2.11.0 (Apple Git-81)</font></tt></blockquote>
<div> </div></div></div><BR>