Enhance second stage header

This commit is contained in:
Laurent Vivier
2004-05-26 23:05:35 +00:00
parent 4e162a6fd7
commit c814cb68e9
3 changed files with 79 additions and 38 deletions
+29 -1
View File
@@ -14,7 +14,35 @@
_start:
bra setup
.word cmdline_length /* size of command line buffer */
/***************************************************************************
*
* second level arguments
*
***************************************************************************/
/* Header Signature */
.dc.b 'E','M','0','1'
.global _kernel_image_offset
_kernel_image_offset:
.long 0
.global _kernel_image_size
_kernel_image_size:
.long 0
.global _kernel_size
_kernel_size:
.long 0
.global _ramdisk_offset
_ramdisk_offset:
.long 0
.global _ramdisk_size
_ramdisk_size:
.long 0
.global _command_line
_command_line:
+25
View File
@@ -0,0 +1,25 @@
/*
*
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
*
*/
/*
* WARNING: remember that m68k is big endian, like powerPC.
* i386 is little-endian
*/
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];
};
#define EMILE_001_SIGNATURE (('E'<<24)|('M'<<16)|('0'<<8)|'1')
+25 -37
View File
@@ -10,10 +10,10 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "emile-first.h"
#define CMDLINE_OFFSET (FIRST_LEVEL_SIZE + 4)
#include "emile-second.h"
static void usage(int argc, char** argv)
{
@@ -37,10 +37,9 @@ static void usage(int argc, char** argv)
int set_cmdline(int readonly, char* image, char* cmdline)
{
emile_l2_header_t header;
int fd;
short buffer_size;
int ret;
int len;
if (readonly)
fd = open(image, O_RDONLY);
@@ -53,7 +52,7 @@ int set_cmdline(int readonly, char* image, char* cmdline)
return 2;
}
ret = lseek(fd, CMDLINE_OFFSET, SEEK_SET);
ret = lseek(fd, FIRST_LEVEL_SIZE, SEEK_SET);
if (ret == -1)
{
perror("Cannot go to buffer offset");
@@ -61,49 +60,37 @@ int set_cmdline(int readonly, char* image, char* cmdline)
return 3;
}
ret = read(fd, &buffer_size, sizeof(buffer_size));
if (ret != sizeof(buffer_size))
ret = read(fd, &header, sizeof(header));
if (ret != sizeof(header))
{
perror("Cannot read buffer size");
perror("Cannot read current command line");
close(fd);
return 3;
return 7;
}
if (EMILE_001_SIGNATURE != header.signature)
{
fprintf(stderr, "Bad Header signature\n");
return 8;
}
if (readonly)
{
char* buffer;
buffer = (char*)malloc(buffer_size);
if (buffer == NULL)
{
perror("Cannot malloc()");
close(fd);
return 6;
}
ret = read(fd, buffer, buffer_size);
if (ret != buffer_size)
{
perror("Cannot read current command line");
free(buffer);
close(fd);
return 7;
}
printf("Current command line: \"%s\"\n", buffer);
free(buffer);
}
printf("Current command line: \"%s\"\n", header.command_line);
else
{
len = strlen(cmdline) + 1;
if (len > buffer_size)
strncpy(header.command_line, cmdline, 256);
header.command_line[255] = 0;
ret = lseek(fd, FIRST_LEVEL_SIZE, SEEK_SET);
if (ret == -1)
{
fprintf(stderr, "Command line too long\n");
perror("Cannot go to buffer offset");
close(fd);
return 4;
return 3;
}
ret = write(fd, cmdline, len);
if (ret != len)
ret = write(fd, &header, sizeof(header));
if (ret != sizeof(header))
{
perror("Cannot set command line");
close(fd);
@@ -114,6 +101,7 @@ int set_cmdline(int readonly, char* image, char* cmdline)
}
close(fd);
return 0;
}