| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010, Google Inc. | 2 * Copyright 2010, Google Inc. |
| 3 * All rights reserved. | 3 * All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include <stdlib.h> | 27 #include <stdlib.h> |
| 28 #include <string.h> | 28 #include <string.h> |
| 29 #include <unistd.h> | 29 #include <unistd.h> |
| 30 | 30 |
| 31 #include "lib/flashrom.h" | 31 #include "lib/flashrom.h" |
| 32 | 32 |
| 33 /* The best choice is PATH_MAX. However, it leads portibility issue. | 33 /* The best choice is PATH_MAX. However, it leads portibility issue. |
| 34 * So, define a long enough length here. */ | 34 * So, define a long enough length here. */ |
| 35 #define CMD_BUF_SIZE (4096) | 35 #define CMD_BUF_SIZE (4096) |
| 36 | 36 |
| 37 #define PARTIAL_WRITE_AREA_NAME "pw_name" | |
| 38 | |
| 39 static uint8_t layout_filename[] = "/tmp/vpd.layout.XXXXXX"; | |
| 40 | |
| 41 static uint8_t flashrom_cmd[] = "flashrom"; | 37 static uint8_t flashrom_cmd[] = "flashrom"; |
| 42 | 38 |
| 43 /* The argument for flashrom. | 39 /* The argument for flashrom. |
| 44 * bus=spi: The VPD data are stored in BIOS flash, which is attached | 40 * bus=spi: The VPD data are stored in BIOS flash, which is attached |
| 45 * to the SPI bus. | 41 * to the SPI bus. |
| 46 */ | 42 */ |
| 47 static uint8_t flashrom_arguments[] = " -p internal:bus=spi "; | 43 static uint8_t flashrom_arguments[] = " -p internal:bus=spi "; |
| 48 | 44 |
| 49 int flashromRead(const char* tmp_file) { | 45 int flashromRead(const char* part_file, const char* full_file, |
| 46 const char* partition_name) { |
| 50 char cmd[CMD_BUF_SIZE]; | 47 char cmd[CMD_BUF_SIZE]; |
| 51 int ret = 0; | 48 int ret = 0; |
| 52 | 49 |
| 53 snprintf(cmd, sizeof(cmd), "%s %s -r '%s' >/dev/null 2>&1", | 50 snprintf(cmd, sizeof(cmd), "%s %s -i '%s':'%s' -r '%s' >/dev/null 2>&1", |
| 54 flashrom_cmd, flashrom_arguments, tmp_file); | 51 flashrom_cmd, flashrom_arguments, |
| 52 partition_name, part_file, full_file); |
| 55 ret = system(cmd); | 53 ret = system(cmd); |
| 56 if (ret == 0) | 54 if (ret == 0) |
| 57 return FLASHROM_OK; | 55 return FLASHROM_OK; |
| 58 else | 56 else |
| 59 return FLASHROM_FAIL; | 57 return FLASHROM_FAIL; |
| 60 } | 58 } |
| 61 | 59 |
| 62 int flashromPartialWrite(const char* tmp_file, | 60 int flashromPartialWrite(const char* part_file, const char* full_file, |
| 63 const off_t section_offset, | 61 const char* partition_name) { |
| 64 const size_t section_size) { | |
| 65 int fd; | 62 int fd; |
| 66 char cmd[CMD_BUF_SIZE]; | 63 char cmd[CMD_BUF_SIZE]; |
| 67 FILE* fp; | 64 FILE* fp; |
| 68 int ret = 0; | 65 int ret = 0; |
| 69 | 66 |
| 70 fd = mkstemp(layout_filename); | |
| 71 if (fd < 0) { | |
| 72 fprintf(stderr, "mkstemp(%s) failed.\n", layout_filename); | |
| 73 return FLASHROM_FAIL; | |
| 74 } else { | |
| 75 close(fd); | |
| 76 } | |
| 77 | |
| 78 /* generate layout file */ | |
| 79 if (!(fp = fopen(layout_filename, "w"))) { | |
| 80 fprintf(stderr, "cannot create layout file: [%s]\n", layout_filename); | |
| 81 return FLASHROM_FAIL; | |
| 82 } | |
| 83 fprintf(fp, "0x%lx:0x%lx %s\n", section_offset, | |
| 84 section_offset + section_size - 1, | |
| 85 PARTIAL_WRITE_AREA_NAME); | |
| 86 fclose(fp); | |
| 87 | |
| 88 /* write it back */ | 67 /* write it back */ |
| 89 snprintf(cmd, sizeof(cmd), "%s %s -l %s -i '%s' -w '%s' >/tmp/null 2>&1", | 68 snprintf(cmd, sizeof(cmd), "%s %s -i '%s':'%s' -w '%s' >/tmp/null 2>&1", |
| 90 flashrom_cmd, flashrom_arguments, layout_filename, | 69 flashrom_cmd, flashrom_arguments, |
| 91 PARTIAL_WRITE_AREA_NAME, tmp_file); | 70 partition_name, part_file, full_file); |
| 92 ret = system(cmd); | 71 ret = system(cmd); |
| 93 | 72 |
| 94 if (ret == 0) | 73 if (ret == 0) |
| 95 return FLASHROM_OK; | 74 return FLASHROM_OK; |
| 96 else | 75 else |
| 97 return FLASHROM_FAIL; | 76 return FLASHROM_FAIL; |
| 98 } | 77 } |
| OLD | NEW |