Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:12.2:ARM
s390-tools
s390-tools-sles11sp2-zipl-fix_scsi_dump.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File s390-tools-sles11sp2-zipl-fix_scsi_dump.patch of Package s390-tools
Description: zipl: fix scsi dump. Symptom: Scsi dump does not work on LPAR with "ERROR: Could not enable dump device". Problem: The machine loader needs to find a gap in memory to store some internal information after the first bootmap entry. The current implementation leaves no space between first and second entry. Solution: Put the stage 3 loader as first entry into the bootmap. --- zipl/src/bootmap.c | 74 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 32 deletions(-) --- a/zipl/src/bootmap.c +++ b/zipl/src/bootmap.c @@ -464,6 +464,46 @@ add_ipl_program(int fd, struct job_ipl_d /* Fill in component table header */ create_component_header(VOID_ADD(table, offset), type); offset += sizeof(struct component_header); + /* + * Workaround for machine loader bug + * need to define the stage 3 loader at first position in the bootmap + * file + */ + /* initiate values for ramdisk */ + stats.st_size = 0; + if (ipl->ramdisk != NULL) { + /* Add ramdisk */ + if (verbose) { + printf(" initial ramdisk...: %s\n", ipl->ramdisk); + } + /* Get ramdisk file size */ + if (stat(ipl->ramdisk, &stats)) { + error_reason(strerror(errno)); + error_text("Could not get information for file '%s'", + ipl->ramdisk); + free(table); + return -1; + } + } + /* Add stage 3 loader to bootmap */ + rc = boot_get_stage3(&stage3, &stage3_size, ipl->parm_addr, + ipl->ramdisk_addr, (size_t) stats.st_size, + ipl->image_addr, + (info->type == disk_type_scsi) ? 0 : 1); + if (rc) { + free(table); + return rc; + } + rc = add_component_buffer(fd, stage3, stage3_size, + DEFAULT_STAGE3_ADDRESS, + VOID_ADD(table, offset), info, &comp_loc[3]); + free(stage3); + if (rc) { + error_text("Could not add stage 3 boot loader"); + free(table); + return -1; + } + offset += sizeof(struct component_entry); /* Add kernel image */ if (verbose) { printf(" kernel image......: %s\n", ipl->image); @@ -495,20 +535,9 @@ add_ipl_program(int fd, struct job_ipl_d } offset += sizeof(struct component_entry); } - stats.st_size = 0; + + /* finally add ramdisk */ if (ipl->ramdisk != NULL) { - /* Add ramdisk */ - if (verbose) { - printf(" initial ramdisk...: %s\n", ipl->ramdisk); - } - /* Get ramdisk file size */ - if (stat(ipl->ramdisk, &stats)) { - error_reason(strerror(errno)); - error_text("Could not get information for file '%s'", - ipl->ramdisk); - free(table); - return -1; - } rc = add_component_file(fd, ipl->ramdisk, ipl->ramdisk_addr, 0, VOID_ADD(table, offset), @@ -521,25 +550,6 @@ add_ipl_program(int fd, struct job_ipl_d } offset += sizeof(struct component_entry); } - /* Add stage 3 loader to bootmap */ - rc = boot_get_stage3(&stage3, &stage3_size, ipl->parm_addr, - ipl->ramdisk_addr, (size_t) stats.st_size, - ipl->image_addr, - (info->type == disk_type_scsi) ? 0 : 1); - if (rc) { - free(table); - return rc; - } - rc = add_component_buffer(fd, stage3, stage3_size, - DEFAULT_STAGE3_ADDRESS, - VOID_ADD(table, offset), info, &comp_loc[3]); - free(stage3); - if (rc) { - error_text("Could not add stage 3 boot loader"); - free(table); - return -1; - } - offset += sizeof(struct component_entry); if (verbose) print_components(comp_name, comp_loc, 4); /* Terminate component table */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor