| /* |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * Copyright (C) Hewlett-Packard (Paul Bame) paul_bame@hp.com |
| */ |
| #include "common.h" |
| #include "load.h" |
| #include <linux/som.h> |
| #include <stdio.h> |
| |
| int prepare_SOM_loadable(int fd, struct loadable *loadable, int *wide) |
| { |
| struct som_hdr sh; |
| struct som_exec_auxhdr aux; |
| |
| *wide = 0; |
| |
| STRUCTREAD(fd, sh, 0); |
| /* check for a good SOM header */ |
| if (__be16_to_cpu(sh.system_id) != SOM_SID_PARISC_1_1 || |
| __be16_to_cpu(sh.a_magic) != SOM_EXEC_NONSHARE) |
| { |
| return PREPARE_CONTINUE; |
| } |
| |
| printf("SOM-format executable %08x\n", sh.aux_header_location); |
| |
| STRUCTREAD(fd, aux, __be32_to_cpu(sh.aux_header_location)); |
| |
| loadable->segment[0].offset = __be32_to_cpu(aux.exec_tfile); |
| loadable->offset0 = loadable->segment[0].offset; |
| loadable->segment[0].length = __be32_to_cpu(aux.exec_tsize); |
| loadable->segment[0].mem = __be32_to_cpu(aux.exec_tmem); |
| loadable->segment[0].zeros = __be32_to_cpu(aux.exec_dmem) |
| - (__be32_to_cpu(aux.exec_tmem) + __be32_to_cpu(aux.exec_tsize)); |
| loadable->segment[1].offset = __be32_to_cpu(aux.exec_dfile); |
| loadable->segment[1].length = __be32_to_cpu(aux.exec_dsize); |
| loadable->segment[1].mem = __be32_to_cpu(aux.exec_dmem); |
| loadable->segment[1].zeros = __be32_to_cpu(aux.exec_bsize); |
| |
| loadable->entry = __be32_to_cpu(aux.exec_entry); |
| loadable->first = __be32_to_cpu(aux.exec_tmem); |
| loadable->size = __be32_to_cpu(aux.exec_dmem) + |
| __be32_to_cpu(aux.exec_dsize) - __be32_to_cpu(aux.exec_tmem); |
| loadable->n = 2; |
| |
| return PREPARE_OK; |
| } |