PulkoMandy | 15f3f26 | 2014-06-28 11:45:08 +0200 | [diff] [blame] | 1 | #include "loader.h" |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 2 | #include "rel.h" |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 3 | #include "log.h" |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 4 | #include <stddef.h> |
Adrien Destugues | 69a6e72 | 2017-06-03 10:17:17 +0200 | [diff] [blame^] | 5 | #include <stdlib.h> |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 6 | |
| 7 | extern void *progend; |
| 8 | |
| 9 | struct prg_hdr { |
| 10 | char *relocatedata; |
| 11 | char arch[8]; |
| 12 | char version[8]; |
| 13 | char initfunc[1]; |
| 14 | }; |
| 15 | |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 16 | unsigned char loader_arch_load(const char *name, char *arg) |
| 17 | { |
| 18 | char *loadaddr; |
| 19 | struct prg_hdr *prghdr; |
| 20 | int length; |
| 21 | |
| 22 | /* get length of file */ |
| 23 | length = get_file_length(name); |
| 24 | if (length==0) |
| 25 | return LOADER_ERR_OPEN; |
| 26 | |
| 27 | /* allocate memory */ |
| 28 | loadaddr = malloc(length); |
| 29 | if (loadaddr==NULL) |
| 30 | return LOADER_ERR_MEM; |
| 31 | |
| 32 | /* load the file */ |
| 33 | load_file(name,loadaddr); |
| 34 | |
| 35 | prghdr = (struct prg_hdr *)loadaddr; |
| 36 | |
| 37 | /* relocate it */ |
| 38 | relocate(prghdr->relocatedata,loadaddr); |
| 39 | |
| 40 | ((void (*)(char *))prghdr->initfunc)(arg); |
| 41 | |
| 42 | return LOADER_OK; |
| 43 | } |
| 44 | |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 45 | |
| 46 | static void relocate_dsc(struct dsc* data, int loadaddr) |
| 47 | { |
| 48 | data->description += loadaddr; |
| 49 | data->prgname += loadaddr; |
| 50 | data->icon = (struct ctk_icon*)(((char*)data->icon)+ loadaddr); |
| 51 | |
| 52 | data->icon->title += loadaddr; |
PulkoMandy | df52c59 | 2014-07-03 15:36:50 +0200 | [diff] [blame] | 53 | #if CTK_CONF_ICON_BITMAPS |
| 54 | data->icon->bitmap += loadaddr; |
| 55 | #endif |
| 56 | #if CTK_CONF_ICON_TEXTMAPS |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 57 | data->icon->textmap += loadaddr; |
PulkoMandy | df52c59 | 2014-07-03 15:36:50 +0200 | [diff] [blame] | 58 | #endif |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 59 | } |
| 60 | |
| 61 | |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 62 | struct dsc *loader_arch_load_dsc(const char *name) |
| 63 | { |
| 64 | char *loadaddr; |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 65 | struct dsc *dschdr; |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 66 | int length; |
| 67 | |
| 68 | /* get length of file */ |
| 69 | length = get_file_length(name); |
| 70 | if (length==0) |
| 71 | return NULL; |
| 72 | |
| 73 | /* allocate memory */ |
| 74 | loadaddr = malloc(length); |
| 75 | if (loadaddr==NULL) |
| 76 | return NULL; |
| 77 | |
| 78 | /* load the file */ |
| 79 | load_file(name, loadaddr); |
| 80 | |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 81 | dschdr = (struct dsc *)loadaddr; |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 82 | /* relocate it */ |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 83 | relocate_dsc(dschdr, (int)loadaddr); |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 84 | |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 85 | return dschdr; |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 86 | } |
| 87 | |
| 88 | void loader_arch_free(void *loadaddr) |
| 89 | { |
| 90 | /* free module */ |
| 91 | /* we're given the start of 'arch' member of the prg_hdr, |
| 92 | calculate the real start address and then free the block */ |
| 93 | void *header = (void *)((char *)loadaddr - offsetof(struct prg_hdr,arch)); |
| 94 | free(header); |
| 95 | } |
| 96 | |
| 97 | void loader_arch_free_dsc(struct dsc *dscdata) |
| 98 | { |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame] | 99 | free(dscdata); |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 100 | } |
| 101 | |