64bit support

This commit is contained in:
Laurent Vivier 2004-06-02 17:40:47 +00:00
parent 35c022d25d
commit 5430f75fb4
6 changed files with 59 additions and 52 deletions

View File

@ -6,6 +6,7 @@
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@ -52,7 +53,7 @@ int first_info(char* image)
printf("Boot Block Header:\n\n");
printf("Boot blocks signature: 0x%x\n",
read_short(&firstBlock.boot_block_header.ID));
printf("Entry point to bootcode: 0x%lX\n",
printf("Entry point to bootcode: 0x%X\n",
read_long(&firstBlock.boot_block_header.Entry));
printf("Boot blocks version number: %x\n",
read_short(&firstBlock.boot_block_header.Version));
@ -81,11 +82,11 @@ int first_info(char* image)
read_short(&firstBlock.boot_block_header.CntFCBs));
printf("Number of event queue elements: %d\n",
read_short(&firstBlock.boot_block_header.CntEvts));
printf("System heap size on 128K Mac: 0x%lx\n",
printf("System heap size on 128K Mac: 0x%x\n",
read_long(&firstBlock.boot_block_header.Heap128K));
printf("System heap size on 256K Mac: 0x%lx\n",
printf("System heap size on 256K Mac: 0x%x\n",
read_long(&firstBlock.boot_block_header.Heap256K));
printf("System heap size on all machines: 0x%lx\n",
printf("System heap size on all machines: 0x%x\n",
read_long(&firstBlock.boot_block_header.SysHeapSize));
if ( strncmp( firstBlock.boot_block_header.SysName+1,
@ -97,9 +98,9 @@ int first_info(char* image)
read_short(&firstBlock.second_param_block.ioVRefNum));
printf("File reference number: %d\n",
read_short(&firstBlock.second_param_block.ioRefNum));
printf("Second level size: %ld\n",
printf("Second level size: %d\n",
read_long(&firstBlock.second_param_block.ioReqCount));
printf("Second level offset: %ld\n",
printf("Second level offset: %d\n",
read_long(&firstBlock.second_param_block.ioPosOffset));
}

View File

@ -80,9 +80,9 @@ int first_tune( char* image, unsigned short tune_mask, int drive_num,
read_short(&firstBlock.second_param_block.ioVRefNum));
printf("File reference number: %d\n",
read_short(&firstBlock.second_param_block.ioRefNum));
printf("Second level size: %ld\n",
printf("Second level size: %d\n",
read_long(&firstBlock.second_param_block.ioReqCount));
printf("Second level offset: %ld\n",
printf("Second level offset: %d\n",
read_long(&firstBlock.second_param_block.ioPosOffset));
}
else

View File

@ -18,22 +18,22 @@
typedef struct BootBlkHdr BootBlkHdr_t;
struct BootBlkHdr {
unsigned short ID; /* boot blocks signature */
unsigned long Entry; /* entry point to bootcode */
unsigned short Version; /* boot blocks version number */
unsigned short PageFlags; /* used internally */
unsigned char SysName[16]; /* System filename */
unsigned char ShellName[16]; /* Finder filename */
unsigned char Dbg1Name[16]; /* debugger filename */
unsigned char Dbg2Name[16]; /* debugger filename */
unsigned char ScreenName[16]; /* name of startup screen */
unsigned char HelloName[16]; /* name of startup program */
unsigned char ScrapName[16]; /* name of system scrap file */
unsigned short CntFCBs; /* number of FCBs to allocate */
unsigned short CntEvts; /* number of event queue elements */
unsigned long Heap128K; /* system heap size on 128K Mac */
unsigned long Heap256K; /* used internally */
unsigned long SysHeapSize; /* system heap size on all machines */
u_int16_t ID; /* boot blocks signature */
u_int32_t Entry; /* entry point to bootcode */
u_int16_t Version; /* boot blocks version number */
u_int16_t PageFlags; /* used internally */
u_int8_t SysName[16]; /* System filename */
u_int8_t ShellName[16]; /* Finder filename */
u_int8_t Dbg1Name[16]; /* debugger filename */
u_int8_t Dbg2Name[16]; /* debugger filename */
u_int8_t ScreenName[16]; /* name of startup screen */
u_int8_t HelloName[16]; /* name of startup program */
u_int8_t ScrapName[16]; /* name of system scrap file */
u_int16_t CntFCBs; /* number of FCBs to allocate */
u_int16_t CntEvts; /* number of event queue elements */
u_int32_t Heap128K; /* system heap size on 128K Mac */
u_int32_t Heap256K; /* used internally */
u_int32_t SysHeapSize; /* system heap size on all machines */
} __attribute__((packed));
#define ASSERT_BBH(a) if ( sizeof(BootBlkHdr_t) != 138 ) { a }
@ -45,7 +45,7 @@ typedef struct eBootBlock eBootBlock_t;
struct eBootBlock {
BootBlkHdr_t boot_block_header;
ParamBlockRec_t second_param_block;
unsigned char boot_code[1024 - sizeof(BootBlkHdr_t)
u_int8_t boot_code[1024 - sizeof(BootBlkHdr_t)
- sizeof(ParamBlockRec_t)];
} __attribute__((packed));

View File

@ -68,11 +68,11 @@ static int second_tune(int fd, char* second_level, char *kernel_image, unsigned
write_long(&header.ramdisk_size, get_size(ramdisk));
}
printf("Setting second level info: \n");
printf("kernel offset %ld, kernel size %ld, buffer size %ld\n",
printf("kernel offset %d, kernel size %d, buffer size %d\n",
read_long(&header.kernel_image_offset),
read_long(&header.kernel_image_size),
read_long(&header.kernel_size));
printf("ramdisk offset %ld, ramdisk size %ld\n",
printf("ramdisk offset %d, ramdisk size %d\n",
read_long(&header.ramdisk_offset),
read_long(&header.ramdisk_size));
@ -119,7 +119,7 @@ static int first_tune(int fd, char* second_level)
write_long(&firstBlock.second_param_block.ioReqCount, get_size(second_level));
printf(
"Setting second level position to: drive %d, offset %ld, size %ld\n",
"Setting second level position to: drive %d, offset %d, size %d\n",
read_short(&firstBlock.second_param_block.ioVRefNum),
read_long(&firstBlock.second_param_block.ioPosOffset),
read_long(&firstBlock.second_param_block.ioReqCount));
@ -131,7 +131,6 @@ static int first_tune(int fd, char* second_level)
return 11;
ret = write(fd, &firstBlock, sizeof(firstBlock));
if (ret != sizeof(firstBlock))
if (ret != sizeof(firstBlock))
return 12;
@ -302,6 +301,13 @@ int main(int argc, char** argv)
int i;
int ret;
ASSERT_BBH(
{fprintf(stderr,"Internal Error: Bad BootBlkHdr size\n"); exit(1);});
ASSERT_PBR(
{fprintf(stderr,"Internal Error: Bad ParamBlockRec size\n"); exit(1);});
ASSERT_BB(
{fprintf(stderr,"Internal Error: Bad boot block size\n"); exit(1);});
if ((argc != 12) && (argc != 10))
{
usage(argc, argv);

View File

@ -12,14 +12,14 @@
typedef struct emile_l2_header emile_l2_header_t;
struct emile_l2_header {
unsigned long entry;
unsigned long signature; /* EM01 */
unsigned long kernel_image_offset;
unsigned long kernel_image_size;
unsigned long kernel_size;
unsigned long ramdisk_offset;
unsigned long ramdisk_size;
char command_line[256];
u_int32_t entry;
u_int32_t signature; /* EM01 */
u_int32_t kernel_image_offset;
u_int32_t kernel_image_size;
u_int32_t kernel_size;
u_int32_t ramdisk_offset;
u_int32_t ramdisk_size;
int8_t command_line[256];
};
#define EMILE_001_SIGNATURE (('E'<<24)|('M'<<16)|('0'<<8)|'1')

View File

@ -10,22 +10,22 @@
/* nothing to do, because m68k is big endian too */
static inline unsigned short read_short(unsigned short* addr)
static inline u_int16_t read_short(u_int16_t* addr)
{
return *addr;
}
static inline void write_short(unsigned short* addr, unsigned short value)
static inline void write_short(u_int16_t* addr, u_int16_t value)
{
*addr = value;
}
static inline unsigned long read_long(unsigned long* addr)
static inline u_int32_t read_long(u_int32_t* addr)
{
return *addr;
}
static inline void write_long(unsigned long* addr, unsigned long value)
static inline void write_long(u_int32_t* addr, u_int32_t value)
{
*addr = value;
}
@ -34,14 +34,14 @@ static inline void write_long(unsigned long* addr, unsigned long value)
/* little endian (or unknown), read byte by byte to get it in good order */
static inline unsigned short read_short(unsigned short* addr)
static inline u_int16_t read_short(u_int16_t* addr)
{
unsigned char* baddr = (unsigned char*)addr;
return ((unsigned short)(*baddr) << 8) | (unsigned short)*(baddr+1);
return ((u_int16_t)(*baddr) << 8) | (u_int16_t)*(baddr+1);
}
static inline void write_short(unsigned short* addr, unsigned short value)
static inline void write_short(u_int16_t* addr, u_int16_t value)
{
unsigned char* baddr = (unsigned char*)addr;
@ -49,19 +49,19 @@ static inline void write_short(unsigned short* addr, unsigned short value)
*(baddr+1) = (unsigned char)value;
}
static inline unsigned long read_long(unsigned long* addr)
static inline u_int32_t read_long(u_int32_t* addr)
{
unsigned short* saddr = (unsigned short*)addr;
u_int16_t* saddr = (u_int16_t*)addr;
return ((unsigned long)read_short(saddr) << 16) |
(unsigned long)read_short(saddr+1);;
return ((u_int32_t)read_short(saddr) << 16) |
(u_int32_t)read_short(saddr+1);;
}
static inline void write_long(unsigned long* addr, unsigned long value)
static inline void write_long(u_int32_t* addr, u_int32_t value)
{
unsigned short* saddr = (unsigned short*)addr;
u_int16_t* saddr = (u_int16_t*)addr;
write_short(saddr, (unsigned short)(value>>16));
write_short(saddr+1, (unsigned short)value);
write_short(saddr, (u_int16_t)(value>>16));
write_short(saddr+1, (u_int16_t)value);
}
#endif