remove the preliminary Mach device name support, upgrade help2man, fix many bugs in the keyboard configuration support.

This commit is contained in:
okuji 1999-10-27 05:55:46 +00:00
parent 482c5a1631
commit 3195af515d
12 changed files with 293 additions and 273 deletions

View file

@ -1,3 +1,31 @@
1999-10-27 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
* stage2/disk_io.c (set_device) [!STAGE1_5]: Remove the
preliminary Mach-style device name support. I've decided that
the support is not necessary.
(setup_part) [!STAGE1_5]: Do not strip the leading "/dev/".
* docs/help2man: Upgraded to 1.016.
* docs/mbchk.1: Regenerated.
* docs/grub.8: Likewise.
* grub/asmstub.c: Rename KEY_MAP to BIOS_KEY_MAP.
* stage2/asm.S [!STAGE1_5] (set_int15_handler): Use 0 instead of
the maximum number for the segment.
[!STAGE1_5] (unset_int15_handler): Likewise.
[!STAGE1_5] (int15_handler): Almost rewritten. If non-carrier,
ignore the scancode. If the scancode is E1 or E0, then set
INT15_SKIP_FLAG to 0x74, and if the previous scancode is E1 or
E0, set INT15_SKIP_FLAG to 0xea. Clear bit 7 in %dl. Save bit 7
of %al in %bl. Do not lcall. Use ljmp instead.
[!STAGE1_5] (key_map): Renamed to ...
[!STAGE1_5] (bios_key_map): ... this.
* stage2/builtins.c (keycode_func): Check if FROM is greater
than 0xff instead of double-checking for TO. Use BIOS_KEY_MAP
instead of KEY_MAP.
* stage2/shared.h (KEY_MAP_SIZE): Set to 32.
(key_map): Removed.
(bios_key_map): Declared.
1999-10-26 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
Now the BIOS drive remapping is functional.

2
TODO
View file

@ -12,8 +12,6 @@ Priorities:
Things in this file are ranked with one to three !; the more, the
higher priority.
* Support partition syntax to correspond with BSD ``slice'' syntax
(`(hd0,1a)' -> `/dev/hd0s2a'). !!
? Add a partition naming syntax that means ``the first partition of
this type''. We need this for clean Hurd install floppies.
* Add a real scripting language, possibly retaining backward

View file

@ -1,12 +1,11 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.013.
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.016.
.TH GRUB "8" "October 1999" "GNU GRUB 0.5.94" FSF
.SH NAME
GRUB \- the grub shell
.SH SYNOPSIS
.B GRUB
.B grub
[\fIOPTION\fR]...
.SH DESCRIPTION
.PP
Enter the GRand Unified Bootloader command shell.
.TP
\fB\-\-batch\fR

View file

@ -18,6 +18,7 @@
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Written by Brendan O'Dea <bod@compusol.com.au>
# Available from ftp://ftp.gnu.org/gnu/help2man/
use 5.004;
use strict;
@ -26,7 +27,7 @@ use Text::Tabs qw(expand);
use POSIX qw(strftime setlocale LC_TIME);
my $this_program = 'help2man';
my $this_version = '1.013';
my $this_version = '1.016';
my $version_info = <<EOT;
$this_program $this_version
@ -49,7 +50,7 @@ Usage: $this_program [OPTION]... EXECUTABLE
-o, --output=FILE send output to `FILE'
-N, --no-info suppress pointer to Texinfo manual
--help print this help, then exit
--version print $this_program program version number, then exit
--version print version number, then exit
EXECUTABLE should accept `--help' and `--version' options.
EOT
@ -73,7 +74,7 @@ GetOptions (
die $help_info unless @ARGV == 1;
my %include = ();
my @include = (); # to retain order
my @include = (); # retain order given in include file
# Process include file (if given). Format is:
#
@ -111,11 +112,7 @@ if ($include or $opt_include)
unless %include;
# Compress trailing blank lines.
for (keys %include)
{
$include{$_} =~ s/\n+$//;
$include{$_} .= "\n" unless /^NAME$/;
}
for (keys %include) { $include{$_} =~ s/\n+$/\n/ }
}
else
{
@ -126,17 +123,14 @@ if ($include or $opt_include)
# Turn off localisation of executable's ouput.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
# Turn off localisation of date (for strftime)
# Turn off localisation of date (for strftime).
setlocale LC_TIME, 'C';
# Expand tabs, strip trailing spaces and break into paragraphs
sub paragraphs { split /\n\n+/, join '', expand @_ }
# Grab help and version paragraphs from executable
my @help = paragraphs `$ARGV[0] --help 2>/dev/null`
# Grab help and version info from executable.
my $help_text = join '', map { expand $_ } `$ARGV[0] --help 2>/dev/null`
or die "$this_program: can't get `--help' info from $ARGV[0]\n";
my @version = paragraphs `$ARGV[0] --version 2>/dev/null`
my $version_text = join '', map { expand $_ } `$ARGV[0] --version 2>/dev/null`
or die "$this_program: can't get `--version' info from $ARGV[0]\n";
my $date = strftime "%B %Y", localtime;
@ -165,7 +159,7 @@ if ($opt_output)
#
# and seperated from any copyright/author details by a blank line.
$_ = shift @version;
($_, $version_text) = split /\n+/, $version_text, 2;
if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or
/^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/)
@ -187,163 +181,208 @@ else
$program =~ s!.*/!!;
# no info for `info' itself
# No info for `info' itself.
$opt_no_info = 1 if $program eq 'info';
# --name overrides --include contents
$include{NAME} = "$program \\- $opt_name" if $opt_name;
# --name overrides --include contents.
$include{NAME} = "$program \\- $opt_name\n" if $opt_name;
# Default (useless) NAME paragraph
$include{NAME} ||= "$program \\- manual page for $program $version";
# Default (useless) NAME paragraph.
$include{NAME} ||= "$program \\- manual page for $program $version\n";
# Man pages traditionally have the page title in caps.
my $PROGRAM = uc $program;
# Header.
print <<EOT;
.\\" DO NOT MODIFY THIS FILE! It was generated by $this_program $this_version.
.TH $PROGRAM "$section" "$date" "$package $version" FSF
.SH NAME
$include{NAME}
EOT
# Extract usage clause(s) [if any] for SYNOPSIS.
if ($help_text =~ s/^Usage: +(\S.*)(\n *or: +\S.*)*//m)
{
my @syn = $1;
my $break;
my $accumulate = 1;
my @description = ();
if ($_ = $2)
{
for (split /\n/) { push @syn, $1 if /or: +(\S.*)/ }
}
my $synopsis = '';
for (@syn)
{
$synopsis .= ".br\n" if $synopsis;
s/(\S+) *//;
$synopsis .= ".B $1\n";
s/\s+$//;
s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
s/^/\\fI/ unless s/^\\fR//;
$_ .= '\fR';
s/(\\fI)( *)/$2$1/g;
s/\\fI\\fR//g;
s/^\\fR//;
s/\\fI$//;
s/^\./\\&./;
$synopsis .= "$_\n";
}
$include{SYNOPSIS} ||= $synopsis;
}
# Process text, initial section is DESCRIPTION.
my $sect = 'DESCRIPTION';
$_ = "$help_text\n\n$version_text";
# Normalise paragraph breaks.
s/^\n+//;
s/\n*$/\n/;
s/\n\n+/\n\n/g;
# Temporarily exchange leading dots and backslashes for tokens.
s/^\./\x80/mg;
s/\\/\x81/g;
sub convert_option;
# Output converted --help information.
for (@help)
while (length)
{
chomp;
if (s/^Usage: +\S+ +(.*)\n?//)
# Convert some standard paragraph names.
if (s/^(Options|Examples): *\n//)
{
# Turn the usage clause into a synopsis.
my $synopsis = '';
do {
my $syn = $1;
$syn =~ s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
$syn =~ s/^/\\fI/ unless $syn =~ s/^\\fR//;
$syn .= '\fR';
$syn =~ s/\\fI( *)\\fR/$1/g;
$synopsis .= ".br\n" unless $accumulate;
$synopsis .= ".B $program\n";
$synopsis .= "$syn\n";
$accumulate = 0;
} while s/^(?:Usage| *or): +\S+ +(.*)\n?//;
# Include file overrides SYNOPSIS.
print ".SH SYNOPSIS\n", $include{SYNOPSIS} || $synopsis;
# Dump any accumulated description text.
print ".SH DESCRIPTION\n";
print @description;
# Add additional description text from include file.
if ($include{DESCRIPTION})
{
print ".PP\n" unless $include{DESCRIPTION} =~ /^\..P/;
print $include{DESCRIPTION};
}
$break = 1;
next unless $_;
}
# Accumulate text if the synopsis has not been produced yet.
if ($accumulate)
{
push @description, ".PP\n" if @description;
push @description, "$_\n";
$sect = uc $1;
next;
}
# Convert some standard paragraph names
if (s/^(Options|Examples): *\n//)
# Copyright section
if (/^Copyright [\(\xa9]/)
{
print qq(.SH \U$1\n);
$break = '';
next unless length;
$sect = 'COPYRIGHT';
$include{$sect} ||= '';
$include{$sect} .= ".PP\n" if $include{$sect};
my $copy;
($copy, $_) = split /\n\n/, $_, 2;
for ($copy)
{
# Add back newline
s/\n*$/\n/;
# Convert iso9959-1 copyright symbol or (c) to nroff
# character.
s/^Copyright (?:\xa9|\([Cc]\))/Copyright \\(co/mg;
# Insert line breaks before additional copyright messages
# and the disclaimer.
s/(.)\n(Copyright |This is free software)/$1\n.br\n$2/g;
# Join hyphenated lines.
s/([A-Za-z])-\n */$1/g;
}
$include{$sect} .= $copy;
$_ ||= '';
next;
}
# Catch bug report text.
if (/^Report bugs |^Email bug reports to /)
if (/^(Report bugs|Email bug reports to) /)
{
print qq(.SH "REPORTING BUGS"\n$_\n);
$break = '';
$sect = 'REPORTING BUGS';
}
# Author section.
elsif (/^Written +by/)
{
$sect = 'AUTHOR';
}
# Examples, indicated by an indented leading $, % or > are
# rendered in a constant width font.
if (/^( +)([\$\%>] )\S/)
{
my $indent = $1;
my $prefix = $2;
my $break = '.IP';
$include{$sect} ||= '';
while (s/^$indent\Q$prefix\E(\S.*)\n*//)
{
$include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n";
$break = '.br';
}
next;
}
# Option subsections have second line indented.
if (s/^(\S.*)\n / /)
$include{$sect} ||= '';
# Sub-sections have a trailing colon and the second line indented.
if (s/^(\S.*:) *\n / /)
{
print qq(.SS "$1"\n);
$break = '';
$include{$sect} .= qq(.SS "$1"\n);
}
my $output = '';
while (length)
my $indent = 0;
my $content = '';
# Tagged paragraph (option).
if (s/^( {1,10}(-\S+(?:, *-\S+)*))(?: +|\n( {20,}))([^\s-].*)\n//)
{
my $indent = 0;
# Tagged paragraph
if (s/^( +(\S.*?) +)(\S.*)\n?//)
$indent = length ($3 || $1);
my $tag = $2;
my $desc = $4;
unless ($3)
{
$indent = length $1;
$output .= ".TP\n$2\n$3\n";
$break = 1;
$indent = length $1 if /^( {20,})[^\s-]/;
}
# Indented paragraph
elsif (s/^( +)(\S.*)\n?//)
{
$indent = length $1;
$output .= ".IP\n$2\n";
$break = 1;
}
# Left justified paragraph
else
{
s/(.*)\n?//;
$output .= ".PP\n" if $break;
$output .= "$1\n";
$break = 1;
}
# Continuations
$output .= "$1\n" while s/^ {$indent}(\S.*)\n?//;
$content = ".TP\n\x82$tag\n\x82$desc\n";
}
$_ = $output;
# Tagged paragraph (other).
elsif (s/^( +(\S.*?) +)(\S.*)\n//)
{
$indent = length $1;
$content = ".TP\n\x82$2\n\x82$3\n";
}
# Escape backslashes.
s/\\/\\e/g;
# Indented paragraph.
elsif (s/^( +)(\S.*)\n//)
{
$indent = length $1;
$content = ".IP\n\x82$2\n";
}
# Convert options.
s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge;
print;
}
# Left justified paragraph.
else
{
s/(.*)\n//;
$content = ".PP\n" if $include{$sect};
$content .= "$1\n";
}
# Print any include items other than the ones we have already dealt
# with.
for (@include)
{
print qq(.SH "$_"\n$include{$_})
unless /^(NAME|SYNOPSIS|DESCRIPTION|SEE ALSO)$/;
# Append continuations.
$content .= "\x82$1\n" while s/^ {$indent}(\S.*)\n//;
# Move to next paragraph.
s/^\n+//;
for ($content)
{
# Leading dot protection.
s/\x82\./\x80/g;
s/\x82//g;
# Convert options.
s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge;
}
$include{$sect} .= $content;
}
# Refer to the real documentation.
if ($include{'SEE ALSO'} or !$opt_no_info)
unless ($opt_no_info)
{
print qq(.SH "SEE ALSO"\n);
print $include{'SEE ALSO'}, ".PP\n" if $include{'SEE ALSO'};
print <<EOT unless $opt_no_info;
$sect = 'SEE ALSO';
$include{$sect} ||= '';
$include{$sect} .= ".PP\n" if $include{$sect};
$include{$sect} .= <<EOT;
The full documentation for
.B $program
is maintained as a Texinfo manual. If the
@ -358,27 +397,33 @@ should give you access to the complete manual.
EOT
}
# Output converted --version information.
for (@version)
# Output header.
print <<EOT;
.\\" DO NOT MODIFY THIS FILE! It was generated by $this_program $this_version.
.TH $PROGRAM "$section" "$date" "$package $version" FSF
EOT
# Section ordering.
my @pre = qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES);
my @post = ('AUTHOR', 'REPORTING BUGS', 'COPYRIGHT', 'SEE ALSO');
my $filter = join '|', @pre, @post;
# Output content.
for (@pre, (grep ! /^($filter)$/o, @include), @post)
{
chomp;
# Join hyphenated lines.
s/([A-Za-z])-\n */$1/g;
# Convert copyright symbol or (c) to nroff character.
s/Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/g;
# Insert appropriate headings for copyright and author.
if (/^Copyright \\/) { print ".SH COPYRIGHT\n" }
elsif (/^Written +by/) { print ".SH AUTHOR\n" }
else { print ".PP\n"; }
# Insert line breaks before additional copyright messages and the
# disclaimer.
s/(.)\n(Copyright |This is free software)/$1\n.br\n$2/g;
print "$_\n";
if ($include{$_})
{
my $quote = /\W/ ? '"' : '';
print ".SH $quote$_$quote\n";
for ($include{$_})
{
# Replace leading dot an backslash tokens.
s/\x80/\\&./g;
s/\x81/\\e/g;
print;
}
}
}
exit;
@ -387,15 +432,15 @@ exit;
# embolden. Option arguments get italicised.
sub convert_option
{
my $option = '\fB' . shift;
local $_ = '\fB' . shift;
$option =~ s/-/\\-/g;
unless ($option =~ s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
s/-/\\-/g;
unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
{
$option =~ s/=(.)/\\fR=\\fI$1/;
$option =~ s/ (.)/ \\fI$1/;
$option .= '\fR';
s/=(.)/\\fR=\\fI$1/;
s/ (.)/ \\fI$1/;
$_ .= '\fR';
}
$option;
$_;
}

View file

@ -1,12 +1,11 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.013.
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.016.
.TH MBCHK "1" "October 1999" "GNU GRUB 0.5.94" FSF
.SH NAME
mbchk \- Multiboot format checker
mbchk \- check the format of a Multiboot kernel
.SH SYNOPSIS
.B mbchk
[\fIOPTION\fR]... [\fIFILE\fR]...
.SH DESCRIPTION
.PP
Check if the format of FILE complies with the Multiboot Specification.
.TP
\fB\-q\fR, \fB\-\-quiet\fR

View file

@ -1,3 +1,3 @@
@set UPDATED 13 October 1999
@set UPDATED 26 October 1999
@set EDITION 0.5.94
@set VERSION 0.5.94

View file

@ -1,3 +1,3 @@
@set UPDATED 13 October 1999
@set UPDATED 26 October 1999
@set EDITION 0.5.94
@set VERSION 0.5.94

View file

@ -612,7 +612,7 @@ unset_int15_handler (void)
}
/* The key map. */
unsigned short key_map[KEY_MAP_SIZE + 1];
unsigned short bios_key_map[KEY_MAP_SIZE + 1];
/* Copy MAP to the drive map and set up the int13 handler. */
void

View file

@ -433,11 +433,10 @@ ENTRY(set_int15_handler)
movw %ax, ABS(int15_segment)
/* save the new int15 handler */
movl $ABS(int15_handler), %eax
rorl $4, %eax
movw %ax, 2(%edi)
shrl $28, %eax
movw $ABS(int15_handler), %ax
movw %ax, (%edi)
xorw %ax, %ax
movw %ax, 2(%edi)
popl %edi
ret
@ -453,13 +452,12 @@ ENTRY(unset_int15_handler)
/* check if int15_handler is set */
movl $0x54, %edi
movl $ABS(int15_handler), %eax
rorl $4, %eax
cmpw %ax, 2(%edi)
jne 1f
shrl $28, %eax
movw $ABS(int15_handler), %ax
cmpw %ax, (%edi)
jne 1f
xorw %ax, %ax
cmpw %ax, 2(%edi)
jne 1f
/* restore the original */
movw ABS(int15_offset), %ax
@ -474,24 +472,46 @@ ENTRY(unset_int15_handler)
/*
* Translate a key code to another.
*
* Note: This implementation cannot handle more than one length
* scancodes (such as Right Ctrl).
*/
.code16
int15_handler:
/* if non-carrier, ignore it */
jnc 1f
/* check if AH=4F */
cmpb $0x4F, %ah
jmp 1f
jne 1f
/* E0 and E1 are special */
cmpb $0xE1, %al
je 4f
cmpb $0xE0, %al
/* this flag is actually the machine code (je or jmp) */
int15_skip_flag:
je 4f
pushw %bp
movw %sp, %bp
pushw %bx
pushw %dx
pushw %ds
pushw %si
/* save %ax in %dx */
/* save bits 0-6 of %al in %dl */
movw %ax, %dx
andb $0x7f, %dl
/* save the highest bit in %bl */
movb %al, %bl
xorb %dl, %bl
/* set %ds to 0 */
xorw %ax, %ax
movw %ax, %ds
/* set %si to the key map */
movw $ABS(key_map), %si
movw $ABS(bios_key_map), %si
/* find the key code from the key map */
2:
lodsw
@ -506,23 +526,31 @@ int15_handler:
3:
/* restore %ax */
movw %dx, %ax
orb %bl, %al
/* make sure that CF is set */
orw $1, 6(%bp)
/* restore other registers */
popw %si
popw %ds
popw %dx
popw %bx
popw %bp
iret
4:
/* tricky: jmp (0x74) <-> je (0xeb) */
xorb $(0x74 ^ 0xeb), ABS(int15_skip_flag)
1:
/* simulate the interrupt call */
pushf
/* just cascade to the original */
/* ljmp */
.byte 0x9a
.byte 0xea
int15_offset: .word 0
int15_segment: .word 0
iret
.code32
ENTRY(key_map)
.align 4
ENTRY(bios_key_map)
.space (KEY_MAP_SIZE + 1) * 2
@ -622,7 +650,7 @@ int13_handler:
/* set %ax and %bp to the original values */
movw 2(%bp), %ax
movw (%bp), %bp
/* ljmp */
/* lcall */
.byte 0x9a
int13_offset: .word 0
int13_segment: .word 0

View file

@ -1503,7 +1503,7 @@ keycode_func (char *arg, int flags)
safe_parse_maxint (&from_code, &from);
if (errnum)
return 1;
if (from < 0 || to > 0xff)
if (from < 0 || from > 0xff)
{
/* FIXME: more appropriate error code! */
errnum = ERR_NUMBER_PARSING;
@ -1513,13 +1513,13 @@ keycode_func (char *arg, int flags)
/* Find an empty slot. */
for (i = 0; i < KEY_MAP_SIZE; i++)
{
if ((key_map[i] & 0xff) == from)
if ((bios_key_map[i] & 0xff) == from)
{
/* Perhaps the user wants to overwrite the map. */
break;
}
if (! key_map[i])
if (! bios_key_map[i])
break;
}
@ -1531,10 +1531,10 @@ keycode_func (char *arg, int flags)
if (to == from)
/* If TO is equal to FROM, delete the entry. */
grub_memmove ((char *) &key_map[i], (char *) &key_map[i + 1],
grub_memmove ((char *) &bios_key_map[i], (char *) &bios_key_map[i + 1],
sizeof (unsigned short) * (KEY_MAP_SIZE - i));
else
key_map[i] = (to << 8) | from;
bios_key_map[i] = (to << 8) | from;
/* Ugly but should work. */
unset_int15_handler ();

View file

@ -803,78 +803,6 @@ set_device (char *device)
}
}
}
else
{
char ch;
/* A Mach-style absolute partition name. */
ch = *device;
if ((*device != 'f' && *device != 'h') ||
(device += 2, (*(device - 1) != 'd')))
errnum = ERR_DEV_FORMAT;
else
safe_parse_maxint (&device, (int *) &current_drive);
disk_choice = 0;
if (ch != 'f')
current_drive += 0x80;
if (errnum)
return 0;
if (*device == '/')
{
part_choice = PART_CHOSEN;
result = 1;
}
else if (*device == 's')
{
/* An absolute PC partition. */
disk_choice = 0;
part_choice ++;
device ++;
if (*device >= '0' && *device <= '9')
{
part_choice ++;
current_partition = 0;
if (!(current_drive & 0x80) ||
!safe_parse_maxint (&device, (int *) &current_partition) ||
(--current_partition) > 254)
{
errnum = ERR_DEV_FORMAT;
return 0;
}
current_partition = (current_partition << 16) + 0xFFFF;
if (*device >= 'a' && *device <= 'h')
{
/* A BSD partition within the slice. */
current_partition = (((*(device ++) - 'a') << 8)
| (current_partition & 0xFF00FF));
}
}
}
else if (*device >= 'a' && *device <= 'h')
{
/* An absolute BSD partition. */
part_choice ++;
current_partition = ((*(device ++) - 'a') << 8) | 0xFF00FF;
}
if (*device == '/')
{
if (part_choice == PART_DISK)
{
current_partition = saved_partition;
part_choice ++;
}
result = 1;
}
}
if (! sane_partition ())
return 0;
@ -963,11 +891,6 @@ setup_part (char *filename)
#else /* ! STAGE1_5 */
/* FIXME: decide on syntax for blocklist vs. old-style vs. /dev/hd0s1 */
/* Strip any leading /dev. */
if (substring ("/dev/", filename) < 1)
filename += 5;
if (*filename == '(')
{
if ((filename = set_device (filename)) == 0)

View file

@ -121,7 +121,7 @@ extern char *grub_scratch_mem;
#define DRIVE_MAP_SIZE 8
/* The size of the key map. */
#define KEY_MAP_SIZE 8
#define KEY_MAP_SIZE 32
/*
@ -511,7 +511,7 @@ void set_int15_handler (void);
void unset_int15_handler (void);
/* The key map. */
extern unsigned short key_map[];
extern unsigned short bios_key_map[];
/* calls for direct boot-loader chaining */
void chain_stage1 (int segment, int offset, int part_table_addr)