blob: 34936ca77569b81a0f01b36bea44e45fabaac1d3 [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>
5#include <malloc.h>
6
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;
53 //data->icon->bitmap += loadaddr;
54 data->icon->textmap += loadaddr;
55}
56
57
kthacker6de67752006-04-17 15:02:26 +000058struct dsc *loader_arch_load_dsc(const char *name)
59{
60 char *loadaddr;
PulkoMandyb2082f62014-06-30 13:11:14 +020061 struct dsc *dschdr;
kthacker6de67752006-04-17 15:02:26 +000062 int length;
63
64 /* get length of file */
65 length = get_file_length(name);
66 if (length==0)
67 return NULL;
68
69 /* allocate memory */
70 loadaddr = malloc(length);
71 if (loadaddr==NULL)
72 return NULL;
73
74 /* load the file */
75 load_file(name, loadaddr);
76
PulkoMandyb2082f62014-06-30 13:11:14 +020077 dschdr = (struct dsc *)loadaddr;
kthacker6de67752006-04-17 15:02:26 +000078 /* relocate it */
PulkoMandyb2082f62014-06-30 13:11:14 +020079 relocate_dsc(dschdr, (int)loadaddr);
kthacker6de67752006-04-17 15:02:26 +000080
PulkoMandyb2082f62014-06-30 13:11:14 +020081 return dschdr;
kthacker6de67752006-04-17 15:02:26 +000082}
83
84void loader_arch_free(void *loadaddr)
85{
86 /* free module */
87 /* we're given the start of 'arch' member of the prg_hdr,
88 calculate the real start address and then free the block */
89 void *header = (void *)((char *)loadaddr - offsetof(struct prg_hdr,arch));
90 free(header);
91}
92
93void loader_arch_free_dsc(struct dsc *dscdata)
94{
PulkoMandyb2082f62014-06-30 13:11:14 +020095 free(dscdata);
kthacker6de67752006-04-17 15:02:26 +000096}
97