blob: 077292257dfe32f8033c124d64d38c8d6fd389e9 [file] [log] [blame]
PulkoMandy15f3f262014-06-28 11:45:08 +02001#include "loader.h"
kthacker6de67752006-04-17 15:02:26 +00002#include "rel.h"
PulkoMandyb2082f62014-06-30 13:11:14 +02003#include "log.h"
kthacker6de67752006-04-17 15:02:26 +00004#include <stddef.h>
Adrien Destugues69a6e722017-06-03 10:17:17 +02005#include <stdlib.h>
kthacker6de67752006-04-17 15:02:26 +00006
7extern void *progend;
8
9struct prg_hdr {
10 char *relocatedata;
11 char arch[8];
12 char version[8];
13 char initfunc[1];
14};
15
kthacker6de67752006-04-17 15:02:26 +000016unsigned 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
PulkoMandyb2082f62014-06-30 13:11:14 +020045
46static 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;
PulkoMandydf52c592014-07-03 15:36:50 +020053#if CTK_CONF_ICON_BITMAPS
54 data->icon->bitmap += loadaddr;
55#endif
56#if CTK_CONF_ICON_TEXTMAPS
PulkoMandyb2082f62014-06-30 13:11:14 +020057 data->icon->textmap += loadaddr;
PulkoMandydf52c592014-07-03 15:36:50 +020058#endif
PulkoMandyb2082f62014-06-30 13:11:14 +020059}
60
61
kthacker6de67752006-04-17 15:02:26 +000062struct dsc *loader_arch_load_dsc(const char *name)
63{
64 char *loadaddr;
PulkoMandyb2082f62014-06-30 13:11:14 +020065 struct dsc *dschdr;
kthacker6de67752006-04-17 15:02:26 +000066 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
PulkoMandyb2082f62014-06-30 13:11:14 +020081 dschdr = (struct dsc *)loadaddr;
kthacker6de67752006-04-17 15:02:26 +000082 /* relocate it */
PulkoMandyb2082f62014-06-30 13:11:14 +020083 relocate_dsc(dschdr, (int)loadaddr);
kthacker6de67752006-04-17 15:02:26 +000084
PulkoMandyb2082f62014-06-30 13:11:14 +020085 return dschdr;
kthacker6de67752006-04-17 15:02:26 +000086}
87
88void 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
97void loader_arch_free_dsc(struct dsc *dscdata)
98{
PulkoMandyb2082f62014-06-30 13:11:14 +020099 free(dscdata);
kthacker6de67752006-04-17 15:02:26 +0000100}
101