Andrey Shuvikov <mr_hyro@yahoo.com>
Bibo Mao <bibo.mao@intel.com>
+David Miller <davem@davemloft.net>
Guillem Jover <guillem@hadrons.org>
Harley D. Eades III <hde@foobar-qux.org>
Hitoshi Ozeki <h-ozeki@ck2.so-net.ne.jp>
vga_text_mod_CFLAGS = $(COMMON_CFLAGS)
vga_text_mod_LDFLAGS = $(COMMON_LDFLAGS)
+pkglib_MODULES += relocator.mod
+relocator_mod_SOURCES = lib/i386/relocator.c lib/i386/relocator_asm.S lib/i386/relocator_backward.S
+relocator_mod_CFLAGS = $(COMMON_CFLAGS)
+relocator_mod_ASFLAGS = $(COMMON_ASFLAGS)
+relocator_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
pkglib_MODULES += ata.mod
ata_mod_SOURCES = disk/ata.c
ata_mod_CFLAGS = $(COMMON_CFLAGS)
--- /dev/null
+/* memory.h - describe the memory map */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2007,2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MEMORY_CPU_HEADER
+#define GRUB_MEMORY_CPU_HEADER 1
+
+/* The flag for protected mode. */
+#define GRUB_MEMORY_CPU_CR0_PE_ON 0x1
+#define GRUB_MEMORY_CPU_CR4_PAE_ON 0x00000040
+#define GRUB_MEMORY_CPU_CR0_PAGING_ON 0x80000000
+#define GRUB_MEMORY_CPU_AMD64_MSR 0xc0000080
+#define GRUB_MEMORY_CPU_AMD64_MSR_ON 0x00000100
+
+#endif /* ! GRUB_MEMORY_CPU_HEADER */
struct multiboot_info *mbi)
__attribute__ ((noreturn));
-extern grub_addr_t grub_multiboot_payload_orig;
+extern grub_uint32_t grub_multiboot_payload_eip;
+extern char *grub_multiboot_payload_orig;
extern grub_addr_t grub_multiboot_payload_dest;
extern grub_size_t grub_multiboot_payload_size;
-extern grub_uint32_t grub_multiboot_payload_entry_offset;
-extern grub_uint8_t grub_multiboot_forward_relocator;
-extern grub_uint8_t grub_multiboot_forward_relocator_end;
-extern grub_uint8_t grub_multiboot_backward_relocator;
-extern grub_uint8_t grub_multiboot_backward_relocator_end;
-
-#define RELOCATOR_SIZEOF(x) (&grub_multiboot_##x##_relocator_end - &grub_multiboot_##x##_relocator)
+#define GRUB_MULTIBOOT_STACK_SIZE 4096
#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
#include <grub/memory.h>
#endif
+#include <grub/i386/memory.h>
+
/* The scratch buffer used in real mode code. */
#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000
#define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4)
/* The address where another boot loader is loaded. */
#define GRUB_MEMORY_MACHINE_BOOT_LOADER_ADDR 0x7c00
-/* The flag for protected mode. */
-#define GRUB_MEMORY_MACHINE_CR0_PE_ON 0x1
-
/* The code segment of the protected mode. */
#define GRUB_MEMORY_MACHINE_PROT_MODE_CSEG 0x8
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_RELOCATOR_CPU_HEADER
+#define GRUB_RELOCATOR_CPU_HEADER 1
+
+#include <grub/types.h>
+#include <grub/err.h>
+
+struct grub_relocator32_state
+{
+ grub_uint32_t esp;
+ grub_uint32_t eax;
+ grub_uint32_t ebx;
+ grub_uint32_t ecx;
+ grub_uint32_t edx;
+ grub_uint32_t eip;
+};
+
+void *grub_relocator32_alloc (grub_size_t size);
+grub_err_t grub_relocator32_boot (void *relocator, grub_uint32_t dest,
+ struct grub_relocator32_state state);
+void *grub_relocator32_realloc (void *relocator, grub_size_t size);
+void grub_relocator32_free (void *relocator);
+
+#endif /* ! GRUB_RELOCATOR_CPU_HEADER */
/* turn on protected mode */
movl %cr0, %eax
- orl $GRUB_MEMORY_MACHINE_CR0_PE_ON, %eax
+ orl $GRUB_MEMORY_CPU_CR0_PE_ON, %eax
movl %eax, %cr0
/* jump to relocation, flush prefetch queue, and reload %cs */
/* clear the PE bit of CR0 */
movl %cr0, %eax
- andl $(~GRUB_MEMORY_MACHINE_CR0_PE_ON), %eax
+ andl $(~GRUB_MEMORY_CPU_CR0_PE_ON), %eax
movl %eax, %cr0
/* flush prefetch queue, reload %cs */
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/mm.h>
+#include <grub/misc.h>
+
+#include <grub/types.h>
+#include <grub/types.h>
+#include <grub/err.h>
+
+#include <grub/i386/relocator.h>
+
+extern grub_uint8_t grub_relocator32_forward_start;
+extern grub_uint8_t grub_relocator32_forward_end;
+extern grub_uint8_t grub_relocator32_backward_start;
+extern grub_uint8_t grub_relocator32_backward_end;
+
+extern grub_uint32_t grub_relocator32_backward_dest;
+extern grub_uint32_t grub_relocator32_backward_size;
+extern grub_addr_t grub_relocator32_backward_src;
+
+extern grub_uint32_t grub_relocator32_forward_dest;
+extern grub_uint32_t grub_relocator32_forward_size;
+extern grub_addr_t grub_relocator32_forward_src;
+
+extern grub_uint32_t grub_relocator32_forward_eax;
+extern grub_uint32_t grub_relocator32_forward_ebx;
+extern grub_uint32_t grub_relocator32_forward_ecx;
+extern grub_uint32_t grub_relocator32_forward_edx;
+extern grub_uint32_t grub_relocator32_forward_eip;
+extern grub_uint32_t grub_relocator32_forward_esp;
+
+extern grub_uint32_t grub_relocator32_backward_eax;
+extern grub_uint32_t grub_relocator32_backward_ebx;
+extern grub_uint32_t grub_relocator32_backward_ecx;
+extern grub_uint32_t grub_relocator32_backward_edx;
+extern grub_uint32_t grub_relocator32_backward_eip;
+extern grub_uint32_t grub_relocator32_backward_esp;
+
+#define RELOCATOR_SIZEOF(x) (&grub_relocator32_##x##_end - &grub_relocator32_##x##_start)
+#define RELOCATOR_ALIGN 16
+#define PREFIX(x) grub_relocator32_ ## x
+
+static void
+write_call_relocator_bw (void *ptr, void *src, grub_uint32_t dest,
+ grub_size_t size, struct grub_relocator32_state state)
+{
+ grub_relocator32_backward_dest = dest;
+ grub_relocator32_backward_src = PTR_TO_UINT64 (src);
+ grub_relocator32_backward_size = size;
+
+ grub_relocator32_backward_eax = state.eax;
+ grub_relocator32_backward_ebx = state.ebx;
+ grub_relocator32_backward_ecx = state.ecx;
+ grub_relocator32_backward_edx = state.edx;
+ grub_relocator32_backward_eip = state.eip;
+ grub_relocator32_backward_esp = state.esp;
+
+ grub_memmove (ptr,
+ &grub_relocator32_backward_start,
+ RELOCATOR_SIZEOF (backward));
+ ((void (*) (void)) ptr) ();
+}
+
+static void
+write_call_relocator_fw (void *ptr, void *src, grub_uint32_t dest,
+ grub_size_t size, struct grub_relocator32_state state)
+{
+
+ grub_relocator32_forward_dest = dest;
+ grub_relocator32_forward_src = PTR_TO_UINT64 (src);
+ grub_relocator32_forward_size = size;
+
+ grub_relocator32_forward_eax = state.eax;
+ grub_relocator32_forward_ebx = state.ebx;
+ grub_relocator32_forward_ecx = state.ecx;
+ grub_relocator32_forward_edx = state.edx;
+ grub_relocator32_forward_eip = state.eip;
+ grub_relocator32_forward_esp = state.esp;
+
+ grub_memmove (ptr,
+ &grub_relocator32_forward_start,
+ RELOCATOR_SIZEOF (forward));
+ ((void (*) (void)) ptr) ();
+}
+
+#include "../relocator.c"
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/symbol.h>
+#include <grub/i386/memory.h>
+
+#ifdef BACKWARD
+#define RELOCATOR_VARIABLE(x) VARIABLE(grub_relocator32_backward_ ## x)
+#else
+#define RELOCATOR_VARIABLE(x) VARIABLE(grub_relocator32_forward_ ## x)
+#endif
+#ifdef __x86_64__
+#define RAX %rax
+#define RCX %rcx
+#define RDX %rdx
+#define RDI %rdi
+#define RSI %rdi
+#else
+#define RAX %eax
+#define RCX %ecx
+#define RDX %edx
+#define RDI %edi
+#define RSI %esi
+#endif
+
+/* The code segment of the protected mode. */
+#define CODE_SEGMENT 0x10
+
+/* The data segment of the protected mode. */
+#define DATA_SEGMENT 0x18
+
+ .p2align 4 /* force 16-byte alignment */
+
+RELOCATOR_VARIABLE(start)
+#ifdef BACKWARD
+LOCAL(base):
+#endif
+ cli
+
+#ifndef __x86_64__
+ /* mov imm32, %eax */
+ .byte 0xb8
+RELOCATOR_VARIABLE(dest)
+ .long 0
+ movl %eax, %edi
+
+ /* mov imm32, %eax */
+ .byte 0xb8
+RELOCATOR_VARIABLE(src)
+ .long 0
+ movl %eax, %esi
+
+ /* mov imm32, %ecx */
+ .byte 0xb9
+RELOCATOR_VARIABLE(size)
+ .long 0
+#else
+ xorq %rax, %rax
+
+ /* mov imm32, %eax */
+ .byte 0xb8
+RELOCATOR_VARIABLE(dest)
+ .long 0
+ movq %rax, %rdi
+
+ /* mov imm64, %rax */
+ .byte 0x48
+ .byte 0xb8
+RELOCATOR_VARIABLE(src)
+ .long 0, 0
+ movq %rax, %rsi
+
+ xorq %rcx, %rcx
+ /* mov imm32, %ecx */
+ .byte 0xb9
+RELOCATOR_VARIABLE(size)
+ .long 0
+
+#endif
+
+ mov RDI, RAX
+
+#ifdef BACKWARD
+ add RCX, RSI
+ add RDX, RDI
+#endif
+
+#ifndef BACKWARD
+ add RCX, RAX
+#endif
+ add $0x3, RCX
+ shr $2, RCX
+
+
+#ifdef BACKWARD
+ /* Backward movsl is implicitly off-by-four. compensate that. */
+ sub $4, RSI
+ sub $4, RDI
+
+ /* Backward copy. */
+ std
+
+ rep
+ movsl
+
+#else
+ /* Forward copy. */
+ cld
+ rep
+ movsl
+#endif
+
+ /* %rax contains now our new 'base'. */
+ mov RAX, RSI
+ add $(LOCAL(cont0) - LOCAL(base)), RAX
+ jmp *RAX
+LOCAL(cont0):
+ lea (LOCAL(cont1) - LOCAL(base)) (RSI, 1), RAX
+ movl %eax, (LOCAL(jump_vector) - LOCAL(base)) (RSI, 1)
+
+ lea (LOCAL(gdt) - LOCAL(base)) (RSI, 1), RAX
+ mov RAX, (LOCAL(gdt_addr) - LOCAL(base)) (RSI, 1)
+
+ /* Switch to compatibility mode. */
+
+ lgdt (LOCAL(gdtdesc) - LOCAL(base)) (RSI, 1)
+
+ /* Update %cs. Thanks to David Miller for pointing this mistake out. */
+ ljmp *(LOCAL(jump_vector) - LOCAL(base)) (RSI, 1)
+
+LOCAL(cont1):
+ .code32
+
+ /* Update other registers. */
+ movl $DATA_SEGMENT, %eax
+ movl %eax, %ds
+ movl %eax, %es
+ movl %eax, %fs
+ movl %eax, %gs
+ movl %eax, %ss
+
+ /* Disable paging. */
+ movl %cr0, %eax
+ andl $(~GRUB_MEMORY_CPU_CR0_PAGING_ON), %eax
+ movl %eax, %cr0
+
+ /* Disable amd64. */
+ movl $GRUB_MEMORY_CPU_AMD64_MSR, %ecx
+ rdmsr
+ andl $(~GRUB_MEMORY_CPU_AMD64_MSR_ON), %eax
+ wrmsr
+
+ /* Turn off PAE. */
+ movl %cr4, %eax
+ andl $GRUB_MEMORY_CPU_CR4_PAE_ON, %eax
+ movl %eax, %cr4
+
+ jmp LOCAL(cont2)
+LOCAL(cont2):
+ .code32
+
+ /* mov imm32, %eax */
+ .byte 0xb8
+RELOCATOR_VARIABLE (esp)
+ .long 0
+
+ movl %eax, %esp
+
+ /* mov imm32, %eax */
+ .byte 0xb8
+RELOCATOR_VARIABLE (eax)
+ .long 0
+
+ /* mov imm32, %ebx */
+ .byte 0xbb
+RELOCATOR_VARIABLE (ebx)
+ .long 0
+
+ /* mov imm32, %ecx */
+ .byte 0xb9
+RELOCATOR_VARIABLE (ecx)
+ .long 0
+
+ /* mov imm32, %edx */
+ .byte 0xba
+RELOCATOR_VARIABLE (edx)
+ .long 0
+
+ /* Cleared direction flag is of no problem with any current
+ payload and makes this implementation easier. */
+ cld
+
+ .byte 0xea
+RELOCATOR_VARIABLE (eip)
+ .long 0
+ .word 0x08
+
+ /* GDT. Copied from loader/i386/linux.c. */
+ .p2align 4
+LOCAL(gdt):
+ /* NULL. */
+ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+ /* Reserved. */
+ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
+ /* Code segment. */
+ .byte 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9A, 0xCF, 0x00
+
+ /* Data segment. */
+ .byte 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x92, 0xCF, 0x00
+
+ .p2align 4
+LOCAL(gdtdesc):
+ .word 0x27
+LOCAL(gdt_addr):
+#ifdef __x86_64__
+ /* Filled by the code. */
+ .quad 0
+#else
+ /* Filled by the code. */
+ .long 0
+#endif
+
+ .p2align 4
+LOCAL(jump_vector):
+ /* Jump location. Is filled by the code */
+ .long 0
+ .long CODE_SEGMENT
+
+#ifndef BACKWARD
+LOCAL(base):
+#endif
+
+RELOCATOR_VARIABLE(end)
--- /dev/null
+#define BACKWARD
+#include "relocator_asm.S"
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/mm.h>
+#include <grub/misc.h>
+
+#include <grub/types.h>
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/cache.h>
+
+#include <grub/mips/relocator.h>
+
+/* Remark: doesn't work with source outside of 4G.
+ Use relocator64 in this case.
+ */
+
+extern grub_uint8_t grub_relocator32_forward_start;
+extern grub_uint8_t grub_relocator32_forward_end;
+extern grub_uint8_t grub_relocator32_backward_start;
+extern grub_uint8_t grub_relocator32_backward_end;
+
+#define REGW_SIZEOF (2 * sizeof (grub_uint32_t))
+#define JUMP_SIZEOF (sizeof (grub_uint32_t))
+
+#define RELOCATOR_SRC_SIZEOF(x) (&grub_relocator32_##x##_end \
+ - &grub_relocator32_##x##_start)
+#define RELOCATOR_SIZEOF(x) (RELOCATOR_SRC_SIZEOF(x) \
+ + REGW_SIZEOF * (31 + 3) + JUMP_SIZEOF)
+#define RELOCATOR_ALIGN 16
+
+#define PREFIX(x) grub_relocator32_ ## x
+
+static void
+write_reg (int regn, grub_uint32_t val, void **target)
+{
+ /* lui $r, (val+0x8000). */
+ *(grub_uint32_t *) *target = ((0x3c00 | regn) << 16) | ((val + 0x8000) >> 16);
+ *target = ((grub_uint32_t *) *target) + 1;
+ /* addiu $r, $r, val. */
+ *(grub_uint32_t *) *target = (((0x2400 | regn << 5 | regn) << 16)
+ | (val & 0xffff));
+ *target = ((grub_uint32_t *) *target) + 1;
+}
+
+static void
+write_jump (int regn, void **target)
+{
+ /* j $r. */
+ *(grub_uint32_t *) *target = (regn<<21) | 0x8;
+ *target = ((grub_uint32_t *) *target) + 1;
+}
+
+static void
+write_call_relocator_bw (void *ptr0, void *src, grub_uint32_t dest,
+ grub_size_t size, struct grub_relocator32_state state)
+{
+ void *ptr = ptr0;
+ int i;
+ write_reg (8, (grub_uint32_t) src, &ptr);
+ write_reg (9, dest, &ptr);
+ write_reg (10, size, &ptr);
+ grub_memcpy (ptr, &grub_relocator32_backward_start,
+ RELOCATOR_SRC_SIZEOF (backward));
+ ptr = (grub_uint8_t *) ptr + RELOCATOR_SRC_SIZEOF (backward);
+ for (i = 1; i < 32; i++)
+ write_reg (i, state.gpr[i], &ptr);
+ write_jump (state.jumpreg, &ptr);
+ grub_arch_sync_caches (ptr0, (grub_uint8_t *) ptr - (grub_uint8_t *) ptr0);
+ grub_dprintf ("relocator", "Backward relocator: about to jump to %p\n", ptr0);
+ ((void (*) (void)) ptr0) ();
+}
+
+static void
+write_call_relocator_fw (void *ptr0, void *src, grub_uint32_t dest,
+ grub_size_t size, struct grub_relocator32_state state)
+{
+ void *ptr = ptr0;
+ int i;
+ write_reg (8, (grub_uint32_t) src, &ptr);
+ write_reg (9, dest, &ptr);
+ write_reg (10, size, &ptr);
+ grub_memcpy (ptr, &grub_relocator32_forward_start,
+ RELOCATOR_SRC_SIZEOF (forward));
+ ptr = (grub_uint8_t *) ptr + RELOCATOR_SRC_SIZEOF (forward);
+ for (i = 1; i < 32; i++)
+ write_reg (i, state.gpr[i], &ptr);
+ write_jump (state.jumpreg, &ptr);
+ grub_arch_sync_caches (ptr0, (grub_uint8_t *) ptr - (grub_uint8_t *) ptr0);
+ grub_dprintf ("relocator", "Forward relocator: about to jump to %p\n", ptr0);
+ ((void (*) (void)) ptr0) ();
+}
+
+#include "../relocator.c"
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/symbol.h>
+
+ .p2align 4 /* force 16-byte alignment */
+
+VARIABLE (grub_relocator32_forward_start)
+ move $12, $9
+ move $13, $10
+
+copycont1:
+ lb $11,0($8)
+ sb $11,0($9)
+ addiu $8, $8, 0x1
+ addiu $9, $9, 0x1
+ addiu $10, $10, 0xffff
+ subu $11,$10,$0
+ bne $11, $0, copycont1
+
+cachecont1:
+ cache 1,0($12)
+ cache 0,0($12)
+ addiu $12, $12, 0x1
+ addiu $13, $13, 0xffff
+ subu $11,$13,$0
+ bne $11, $0, cachecont1
+VARIABLE (grub_relocator32_forward_end)
+
+VARIABLE (grub_relocator32_backward_start)
+ move $12, $9
+ move $13, $10
+
+ addu $9, $9, $10
+ addu $8, $8, $10
+ /* Backward movsl is implicitly off-by-one. compensate that. */
+ addiu $9, $9, 0xffff
+ addiu $8, $8, 0xffff
+copycont2:
+ lb $11,0($8)
+ sb $11,0($9)
+ cache 1, 0($9)
+ cache 0, 0($9)
+ addiu $8, $8, 0xffff
+ addiu $9, $9, 0xffff
+ addiu $10, 0xffff
+ subu $11,$10,$0
+ bne $11, $0, copycont2
+cachecont2:
+ cache 1,0($12)
+ cache 0,0($12)
+ addiu $12, $12, 0x1
+ addiu $13, $13, 0xffff
+ subu $11,$13,$0
+ bne $11, $0, cachecont2
+VARIABLE (grub_relocator32_backward_end)
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+void *
+PREFIX (alloc) (grub_size_t size)
+{
+ char *playground;
+
+ playground = grub_malloc ((RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN)
+ + size
+ + (RELOCATOR_SIZEOF (backward) +
+ RELOCATOR_ALIGN));
+ if (!playground)
+ return 0;
+
+ *(grub_size_t *) playground = size;
+
+ return playground + RELOCATOR_SIZEOF (forward);
+}
+
+void *
+PREFIX (realloc) (void *relocator, grub_size_t size)
+{
+ char *playground;
+
+ playground = (char *) relocator - RELOCATOR_SIZEOF (forward);
+
+ playground = grub_realloc (playground,
+ (RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN)
+ + size
+ + (RELOCATOR_SIZEOF (backward) + RELOCATOR_ALIGN));
+ if (!playground)
+ return 0;
+
+ *(grub_size_t *) playground = size;
+
+ return playground + RELOCATOR_SIZEOF (forward);
+}
+
+void
+PREFIX(free) (void *relocator)
+{
+ if (relocator)
+ grub_free ((char *) relocator - RELOCATOR_SIZEOF (forward));
+}
+
+grub_err_t
+PREFIX (boot) (void *relocator, grub_uint32_t dest,
+ struct grub_relocator32_state state)
+{
+ grub_size_t size;
+ char *playground;
+
+ playground = (char *) relocator - RELOCATOR_SIZEOF (forward);
+ size = *(grub_size_t *) playground;
+
+ grub_dprintf ("relocator",
+ "Relocator: source: %p, destination: 0x%x, size: 0x%x\n",
+ relocator, dest, size);
+
+ if (UINT_TO_PTR (dest) >= relocator)
+ {
+ int overhead;
+ overhead =
+ ALIGN_UP (dest - RELOCATOR_SIZEOF (backward) - RELOCATOR_ALIGN,
+ RELOCATOR_ALIGN);
+ grub_dprintf ("relocator",
+ "Backward relocator: code %p, source: %p, "
+ "destination: 0x%x, size: 0x%x\n",
+ (char *) relocator - overhead,
+ (char *) relocator - overhead,
+ dest - overhead, size + overhead);
+
+ write_call_relocator_bw ((char *) relocator - overhead,
+ (char *) relocator - overhead,
+ dest - overhead, size + overhead, state);
+ }
+ else
+ {
+ int overhead;
+
+ overhead = ALIGN_UP (dest + size, RELOCATOR_ALIGN)
+ + RELOCATOR_SIZEOF (forward) - (dest + size);
+ grub_dprintf ("relocator",
+ "Forward relocator: code %p, source: %p, "
+ "destination: 0x%x, size: 0x%x\n",
+ (char *) relocator + size + overhead
+ - RELOCATOR_SIZEOF (forward),
+ relocator, dest, size + overhead);
+
+ write_call_relocator_fw ((char *) relocator + size + overhead
+ - RELOCATOR_SIZEOF (forward),
+ relocator, dest, size + overhead, state);
+ }
+
+ /* Not reached. */
+ return GRUB_ERR_NONE;
+}
#include <grub/device.h>
#include <grub/partition.h>
#endif
+#include <grub/i386/relocator.h>
extern grub_dl_t my_mod;
static struct multiboot_info *mbi, *mbi_dest;
-static grub_addr_t entry;
-static char *playground = 0;
static grub_size_t code_size;
+char *grub_multiboot_payload_orig;
+grub_addr_t grub_multiboot_payload_dest;
+grub_size_t grub_multiboot_payload_size;
+grub_uint32_t grub_multiboot_payload_eip;
+grub_uint32_t grub_multiboot_payload_esp;
+
static grub_err_t
grub_multiboot_boot (void)
{
- grub_multiboot_real_boot (entry, mbi_dest);
+ struct grub_relocator32_state state =
+ {
+ .eax = MULTIBOOT_MAGIC2,
+ .ebx = PTR_TO_UINT32 (mbi_dest),
+ .ecx = 0,
+ .edx = 0,
+ .eip = grub_multiboot_payload_eip,
+ .esp = grub_multiboot_payload_esp
+ };
+
+ grub_relocator32_boot (grub_multiboot_payload_orig,
+ grub_multiboot_payload_dest,
+ state);
/* Not reached. */
return GRUB_ERR_NONE;
static grub_err_t
grub_multiboot_unload (void)
{
- if (playground)
+ if (mbi)
{
unsigned int i;
for (i = 0; i < mbi->mods_count; i++)
((struct multiboot_mod_list *) mbi->mods_addr)[i].cmdline);
}
grub_free ((void *) mbi->mods_addr);
- grub_free (playground);
}
+ grub_relocator32_free (grub_multiboot_payload_orig);
mbi = NULL;
- playground = NULL;
+ grub_multiboot_payload_orig = NULL;
grub_dl_unref (my_mod);
return GRUB_ERR_NONE;
goto fail;
}
- if (playground)
- {
- grub_free (playground);
- playground = NULL;
- }
+ grub_relocator32_free (grub_multiboot_payload_orig);
+ grub_multiboot_payload_orig = NULL;
mmap_length = grub_get_multiboot_mmap_len ();
((void *) ((x) + code_size + cmdline_length))
#define mbi_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length))
#define mmap_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info)))
+#define stack_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info) + mmap_length + GRUB_MULTIBOOT_STACK_SIZE))
grub_multiboot_payload_size = cmdline_length
/* boot_loader_name_length might need to grow for mbi,etc to be aligned (see below) */
+ boot_loader_name_length + 3
- + sizeof (struct multiboot_info) + mmap_length;
+ + sizeof (struct multiboot_info) + mmap_length
+ + GRUB_MULTIBOOT_STACK_SIZE;
if (header->flags & MULTIBOOT_AOUT_KLUDGE)
{
grub_multiboot_payload_dest = header->load_addr;
grub_multiboot_payload_size += code_size;
- playground = grub_malloc (RELOCATOR_SIZEOF(forward) + grub_multiboot_payload_size + RELOCATOR_SIZEOF(backward));
- if (! playground)
- goto fail;
- grub_multiboot_payload_orig = (long) playground + RELOCATOR_SIZEOF(forward);
+ grub_multiboot_payload_orig
+ = grub_relocator32_alloc (grub_multiboot_payload_size);
+
+ if (! grub_multiboot_payload_orig)
+ goto fail;
if ((grub_file_seek (file, offset)) == (grub_off_t) - 1)
goto fail;
grub_memset ((void *) (grub_multiboot_payload_orig + load_size), 0,
header->bss_end_addr - header->load_addr - load_size);
- grub_multiboot_payload_entry_offset = header->entry_addr - header->load_addr;
+ grub_multiboot_payload_eip = header->entry_addr;
}
else if (grub_multiboot_load_elf (file, buffer) != GRUB_ERR_NONE)
mbi->mmap_addr = (grub_uint32_t) mmap_addr (grub_multiboot_payload_dest);
mbi->flags |= MULTIBOOT_INFO_MEM_MAP;
- if (grub_multiboot_payload_dest >= grub_multiboot_payload_orig)
- {
- grub_memmove (playground, &grub_multiboot_forward_relocator, RELOCATOR_SIZEOF(forward));
- entry = (grub_addr_t) playground;
- }
- else
- {
- grub_memmove ((char *) (grub_multiboot_payload_orig + grub_multiboot_payload_size),
- &grub_multiboot_backward_relocator, RELOCATOR_SIZEOF(backward));
- entry = (grub_addr_t) grub_multiboot_payload_orig + grub_multiboot_payload_size;
- }
-
- grub_dprintf ("multiboot_loader", "dest=%p, size=0x%x, entry_offset=0x%x\n",
- (void *) grub_multiboot_payload_dest,
- grub_multiboot_payload_size,
- grub_multiboot_payload_entry_offset);
-
/* Convert from bytes to kilobytes. */
mbi->mem_lower = grub_mmap_get_lower () / 1024;
mbi->mem_upper = grub_mmap_get_upper () / 1024;
if (grub_multiboot_get_bootdev (&mbi->boot_device))
mbi->flags |= MULTIBOOT_INFO_BOOTDEV;
+ grub_multiboot_payload_esp = PTR_TO_UINT32 (stack_addr (grub_multiboot_payload_dest));
+
grub_loader_set (grub_multiboot_boot, grub_multiboot_unload, 1);
fail:
#error "I'm confused"
#endif
+#include <grub/i386/relocator.h>
+
#define CONCAT(a,b) CONCAT_(a, b)
#define CONCAT_(a,b) a ## b
grub_multiboot_payload_dest = phdr(lowest_segment)->p_paddr;
grub_multiboot_payload_size += code_size;
- playground = grub_malloc (RELOCATOR_SIZEOF(forward) + grub_multiboot_payload_size + RELOCATOR_SIZEOF(backward));
- if (! playground)
- return grub_errno;
- grub_multiboot_payload_orig = (long) playground + RELOCATOR_SIZEOF(forward);
+ grub_multiboot_payload_orig
+ = grub_relocator32_alloc (grub_multiboot_payload_size);
+
+ if (!grub_multiboot_payload_orig)
+ return grub_errno;
/* Load every loadable segment in memory. */
for (i = 0; i < ehdr->e_phnum; i++)
if (phdr(i)->p_vaddr <= ehdr->e_entry
&& phdr(i)->p_vaddr + phdr(i)->p_memsz > ehdr->e_entry)
{
- grub_multiboot_payload_entry_offset = (ehdr->e_entry - phdr(i)->p_vaddr)
- + (phdr(i)->p_paddr - phdr(lowest_segment)->p_paddr);
+ grub_multiboot_payload_eip = ehdr->e_entry;
break;
}
.p2align 2 /* force 4-byte alignment */
-/*
- * This starts the multiboot kernel.
- */
-
-VARIABLE(grub_multiboot_payload_size)
- .long 0
-VARIABLE(grub_multiboot_payload_orig)
- .long 0
-VARIABLE(grub_multiboot_payload_dest)
- .long 0
-VARIABLE(grub_multiboot_payload_entry_offset)
- .long 0
-
-/*
- * The relocators below understand the following parameters:
- * ecx: Size of the block to be copied.
- * esi: Where to copy from (always lowest address, even if we're relocating
- * backwards).
- * edi: Where to copy to (likewise).
- * edx: Offset of the entry point (relative to the beginning of the block).
- */
-
-VARIABLE(grub_multiboot_forward_relocator)
- /* Add entry offset. */
- addl %edi, %edx
-
- /* Forward copy. */
- cld
- rep
- movsb
-
- jmp *%edx
-VARIABLE(grub_multiboot_forward_relocator_end)
-
-VARIABLE(grub_multiboot_backward_relocator)
- /* Add entry offset (before %edi is mangled). */
- addl %edi, %edx
-
- /* Backward movsb is implicitly off-by-one. compensate that. */
- decl %esi
- decl %edi
-
- /* Backward copy. */
- std
- addl %ecx, %esi
- addl %ecx, %edi
- rep
- movsb
-
- cld
- jmp *%edx
-VARIABLE(grub_multiboot_backward_relocator_end)
-
-FUNCTION(grub_multiboot_real_boot)
- /* Push the entry address on the stack. */
- pushl %eax
- /* Move the address of the multiboot information structure to ebx. */
- movl %edx,%ebx
-
- /* Interrupts should be disabled. */
- cli
-
- /* Where do we copy what from. */
- movl EXT_C(grub_multiboot_payload_size), %ecx
- movl EXT_C(grub_multiboot_payload_orig), %esi
- movl EXT_C(grub_multiboot_payload_dest), %edi
- movl EXT_C(grub_multiboot_payload_entry_offset), %edx
-
- /* Move the magic value into eax. */
- movl $MULTIBOOT_MAGIC2, %eax
-
- /* Jump to the relocator. */
- popl %ebp
- jmp *%ebp
-
/*
* This starts the multiboot 2 kernel.
*/
msgstr ""
"Project-Id-Version: GNU GRUB\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-22 11:45+0000\n"
+"POT-Creation-Date: 2009-11-25 23:35+0100\n"
"PO-Revision-Date: 2009-11-17 12:26+0100\n"
"Last-Translator: Robert Millan <rmh.grub@aybabtu.com>\n"
"Language-Team: None <no-team-yet@li.org>\n"
msgid "Core image is too big (%p > %p)\n"
msgstr ""
-#: util/i386/pc/grub-mkimage.c:321 util/i386/pc/grub-setup.c:587
+#: util/i386/pc/grub-mkimage.c:321 util/i386/pc/grub-setup.c:589
#, c-format
msgid "Try ``%s --help'' for more information.\n"
msgstr "Proveu «%s --help» per a obtenir més informació.\n"
msgid "If you really want blocklists, use --force."
msgstr ""
-#: util/i386/pc/grub-setup.c:439
+#: util/i386/pc/grub-setup.c:441
#, c-format
msgid "attempting to read the core image `%s' from GRUB"
msgstr ""
-#: util/i386/pc/grub-setup.c:440
+#: util/i386/pc/grub-setup.c:442
#, c-format
msgid "attempting to read the core image `%s' from GRUB again"
msgstr ""
-#: util/i386/pc/grub-setup.c:498
+#: util/i386/pc/grub-setup.c:500
#, c-format
msgid "Cannot read `%s' correctly"
msgstr ""
-#: util/i386/pc/grub-setup.c:511
+#: util/i386/pc/grub-setup.c:513
msgid "No terminator in the core image"
msgstr ""
-#: util/i386/pc/grub-setup.c:522
+#: util/i386/pc/grub-setup.c:524
msgid "Failed to read the first sector of the core image"
msgstr ""
-#: util/i386/pc/grub-setup.c:528
+#: util/i386/pc/grub-setup.c:530
msgid "Failed to read the rest sectors of the core image"
msgstr ""
-#: util/i386/pc/grub-setup.c:547
+#: util/i386/pc/grub-setup.c:549
#, c-format
msgid "Cannot open `%s'"
msgstr ""
-#: util/i386/pc/grub-setup.c:589
+#: util/i386/pc/grub-setup.c:591
#, c-format
msgid ""
"Usage: grub-setup [OPTION]... DEVICE\n"
"Report bugs to <%s>.\n"
msgstr ""
-#: util/i386/pc/grub-setup.c:719
+#: util/i386/pc/grub-setup.c:721
#, c-format
msgid "No device is specified.\n"
msgstr ""
-#: util/i386/pc/grub-setup.c:725
+#: util/i386/pc/grub-setup.c:727
#, c-format
msgid "Unknown extra argument `%s'.\n"
msgstr ""
-#: util/i386/pc/grub-setup.c:742
+#: util/i386/pc/grub-setup.c:744
#, c-format
msgid "Invalid device `%s'.\n"
msgstr ""
-#: util/i386/pc/grub-setup.c:755
+#: util/i386/pc/grub-setup.c:757
#, c-format
msgid "Invalid root device `%s'"
msgstr ""
-#: util/i386/pc/grub-setup.c:768
+#: util/i386/pc/grub-setup.c:770
msgid "Cannot guess the root device. Specify the option ``--root-device''."
msgstr ""
msgstr ""
"Project-Id-Version: grub 1.97+20091122\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-22 11:48+0100\n"
+"POT-Creation-Date: 2009-11-25 23:35+0100\n"
"PO-Revision-Date: 2009-11-22 20:00+0700\n"
"Last-Translator: Arif E. Nugroho <arif_endro@yahoo.com>\n"
"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
msgid "Core image is too big (%p > %p)\n"
msgstr "Image core terlalu besar (%p >%p)\n"
-#: util/i386/pc/grub-mkimage.c:321 util/i386/pc/grub-setup.c:587
+#: util/i386/pc/grub-mkimage.c:321 util/i386/pc/grub-setup.c:589
#, c-format
msgid "Try ``%s --help'' for more information.\n"
msgstr "Coba ``%s --help'' untuk informasi lebih lanjut.\n"
" -p, --prefix=DIR set direktori grub_prefix [baku=%s]\n"
" -m, --memdisk=BERKAS tempatkan BERKAS sebagai sebuah image memdisk\n"
" -c, --config=BERKAS tempatkan BERKAS sebagai konfigurasi boot\n"
-" -o, --output=BERKAS keluarkan sebuah image yang dihasilkan ke BERKAS [baku=stdout]\n"
+" -o, --output=BERKAS keluarkan sebuah image yang dihasilkan ke BERKAS "
+"[baku=stdout]\n"
" -h, --help tampilkan pesan ini dan keluar\n"
" -V, --version tampilkan informasi versi dan keluar\n"
" -v, --verbose tampilkan informasi secara detail\n"
#: util/i386/pc/grub-setup.c:261
#, c-format
msgid "Unable to identify a filesystem in %s; safety check can't be performed"
-msgstr "Tidak dapat mengidentifikasikan sebuah sistem berkas dalam %s; pemeriksaan keamanan tidak dapat dilakukan"
+msgstr ""
+"Tidak dapat mengidentifikasikan sebuah sistem berkas dalam %s; pemeriksaan "
+"keamanan tidak dapat dilakukan"
#: util/i386/pc/grub-setup.c:265
#, c-format
-msgid "%s appears to contain a %s filesystem which isn't known to reserve space for DOS-style boot. Installing GRUB there could result in FILESYSTEM DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe disables this check, use at your own risk)"
-msgstr "%s sepertinya berisi sebuah sistem berkas %s yang tidak diketahui untuk mereserve ruang untuk boot gaya-DOS. Memasang GRUB disana dapat berakibat KERUSAKAN SISTEM BERKAS jika data berharga dipaksa tulis oleh grub-setup (--skip-fs-probe menonaktifkan pemeriksaan ini, gunakan sesuai resiko anda)"
+msgid ""
+"%s appears to contain a %s filesystem which isn't known to reserve space for "
+"DOS-style boot. Installing GRUB there could result in FILESYSTEM "
+"DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe "
+"disables this check, use at your own risk)"
+msgstr ""
+"%s sepertinya berisi sebuah sistem berkas %s yang tidak diketahui untuk "
+"mereserve ruang untuk boot gaya-DOS. Memasang GRUB disana dapat berakibat "
+"KERUSAKAN SISTEM BERKAS jika data berharga dipaksa tulis oleh grub-setup (--"
+"skip-fs-probe menonaktifkan pemeriksaan ini, gunakan sesuai resiko anda)"
#: util/i386/pc/grub-setup.c:314
msgid "No DOS-style partitions found"
msgstr "Tidak ditemukan gaya partisi DOS"
#: util/i386/pc/grub-setup.c:330 util/i386/pc/grub-setup.c:355
-msgid "Attempting to install GRUB to a partitionless disk. This is a BAD idea."
-msgstr "Mencoba memasang GRUB ke sebuah disk yang tidak berpartisi. Ini mungkin bukan ide baik."
+msgid ""
+"Attempting to install GRUB to a partitionless disk. This is a BAD idea."
+msgstr ""
+"Mencoba memasang GRUB ke sebuah disk yang tidak berpartisi. Ini mungkin "
+"bukan ide baik."
#: util/i386/pc/grub-setup.c:336
-msgid "Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea."
-msgstr "Mencoba memasang GRUB ke sebuah partisi daripada MBR. Ini mungkin bukan ide baik."
+msgid ""
+"Attempting to install GRUB to a partition instead of the MBR. This is a BAD "
+"idea."
+msgstr ""
+"Mencoba memasang GRUB ke sebuah partisi daripada MBR. Ini mungkin bukan ide "
+"baik."
#: util/i386/pc/grub-setup.c:365
-msgid "This msdos-style partition label has no post-MBR gap; embedding won't be possible!"
-msgstr "Label partisi gaya msdos ini tidak memiliki post-MBR gap; penempatan tidak memungkinkan!"
+msgid ""
+"This msdos-style partition label has no post-MBR gap; embedding won't be "
+"possible!"
+msgstr ""
+"Label partisi gaya msdos ini tidak memiliki post-MBR gap; penempatan tidak "
+"memungkinkan!"
#: util/i386/pc/grub-setup.c:367
-msgid "This GPT partition label has no BIOS Boot Partition; embedding won't be possible!"
-msgstr "Label partisi GPT ini tidak memiliki partisi boot BIOS; penempatan tidak memungkinkan!"
+msgid ""
+"This GPT partition label has no BIOS Boot Partition; embedding won't be "
+"possible!"
+msgstr ""
+"Label partisi GPT ini tidak memiliki partisi boot BIOS; penempatan tidak "
+"memungkinkan!"
#: util/i386/pc/grub-setup.c:374
msgid "Your core.img is unusually large. It won't fit in the embedding area."
-msgstr "Besar core.img anda sangat besar. Ini tidak akan masuk dalam area penempatan."
+msgstr ""
+"Besar core.img anda sangat besar. Ini tidak akan masuk dalam area penempatan."
#: util/i386/pc/grub-setup.c:376
msgid "Your embedding area is unusually small. core.img won't fit in it."
msgstr "Penempatan anda sangat kecil. core.img tidak akan masuk disana."
#: util/i386/pc/grub-setup.c:418
-msgid "Embedding is not possible, but this is required when the root device is on a RAID array or LVM volume."
-msgstr "Penempatan tidak memungkinkan, tetapi ini dibutuhkan ketika perangkat root berada di sebuah array RAID atau volume LVM."
+msgid ""
+"Embedding is not possible, but this is required when the root device is on a "
+"RAID array or LVM volume."
+msgstr ""
+"Penempatan tidak memungkinkan, tetapi ini dibutuhkan ketika perangkat root "
+"berada di sebuah array RAID atau volume LVM."
#: util/i386/pc/grub-setup.c:421
-msgid "Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and its use is discouraged."
-msgstr "Penempatan tidak memungkinkan. GRUB hanya dapat dipasang di konfigurasi ini dengan menggunakan blocklists. Akan tetapi, blocklists TIDAK DAPAT DIJAGAKAN dan penggunaan ini tidak disarankan."
+msgid ""
+"Embedding is not possible. GRUB can only be installed in this setup by "
+"using blocklists. However, blocklists are UNRELIABLE and its use is "
+"discouraged."
+msgstr ""
+"Penempatan tidak memungkinkan. GRUB hanya dapat dipasang di konfigurasi ini "
+"dengan menggunakan blocklists. Akan tetapi, blocklists TIDAK DAPAT DIJAGAKAN "
+"dan penggunaan ini tidak disarankan."
#: util/i386/pc/grub-setup.c:425
msgid "If you really want blocklists, use --force."
msgstr "Jika anda benar benar menginginkan blocklists, gunakan --force."
-#: util/i386/pc/grub-setup.c:439
+#: util/i386/pc/grub-setup.c:441
#, c-format
msgid "attempting to read the core image `%s' from GRUB"
msgstr "mencoba untuk membaca image core `%s' dari GRUB"
-#: util/i386/pc/grub-setup.c:440
+#: util/i386/pc/grub-setup.c:442
#, c-format
msgid "attempting to read the core image `%s' from GRUB again"
msgstr "mencoba untuk membaca image core `%s' dari GRUB lagi"
-#: util/i386/pc/grub-setup.c:498
+#: util/i386/pc/grub-setup.c:500
#, c-format
msgid "Cannot read `%s' correctly"
msgstr "Tidak dapat membaca `%s' secara benar"
-#: util/i386/pc/grub-setup.c:511
+#: util/i386/pc/grub-setup.c:513
msgid "No terminator in the core image"
msgstr "Tidak ada pengakhir dalam image core"
-#: util/i386/pc/grub-setup.c:522
+#: util/i386/pc/grub-setup.c:524
msgid "Failed to read the first sector of the core image"
msgstr "Gagal untuk membaca sektor pertama dari core image"
-#: util/i386/pc/grub-setup.c:528
+#: util/i386/pc/grub-setup.c:530
msgid "Failed to read the rest sectors of the core image"
msgstr "Gagal untuk membaca sektor selanjutnya dari image core"
-#: util/i386/pc/grub-setup.c:547
+#: util/i386/pc/grub-setup.c:549
#, c-format
msgid "Cannot open `%s'"
msgstr "Tidak dapat membuka `%s'"
-#: util/i386/pc/grub-setup.c:589
+#: util/i386/pc/grub-setup.c:591
#, c-format
msgid ""
"Usage: grub-setup [OPTION]... DEVICE\n"
" -m, --device-map=BERKAS gunakan BERKAS sebagai peta perangkat [baku=%s]\n"
" -r, --root-device=DEV gunakan DEV sebagai perangkat root [baku=ditebak]\n"
" -f, --force pasang walaupun masalah terdeteksi\n"
-" -s, --skip-fs-probe jangan periksa untuk sistem berkas dalam PERANGKAT\n"
+" -s, --skip-fs-probe jangan periksa untuk sistem berkas dalam "
+"PERANGKAT\n"
" -h, --help tampilkan pesan bantuan ini dan keluar\n"
" -V, --version tampilkan informasi versi dan keluar\n"
" -v, --verbose tampilkan informasi secara detail\n"
"\n"
"Laporkan bugs ke <%s>.\n"
-#: util/i386/pc/grub-setup.c:719
+#: util/i386/pc/grub-setup.c:721
#, c-format
msgid "No device is specified.\n"
msgstr "Perangkat tidak dispesifikasikan.\n"
-#: util/i386/pc/grub-setup.c:725
+#: util/i386/pc/grub-setup.c:727
#, c-format
msgid "Unknown extra argument `%s'.\n"
msgstr "Argumen ekstra `%s' tidak diketahui.\n"
-#: util/i386/pc/grub-setup.c:742
+#: util/i386/pc/grub-setup.c:744
#, c-format
msgid "Invalid device `%s'.\n"
msgstr "Perangkat `%s' tidak valid.\n"
-#: util/i386/pc/grub-setup.c:755
+#: util/i386/pc/grub-setup.c:757
#, c-format
msgid "Invalid root device `%s'"
msgstr "Perangkat root `%s' tidak valid"
-#: util/i386/pc/grub-setup.c:768
+#: util/i386/pc/grub-setup.c:770
msgid "Cannot guess the root device. Specify the option ``--root-device''."
-msgstr "Tidak dapat menebak perangkat root. Spesifikasikan pilihan ``--root-device''."
+msgstr ""
+"Tidak dapat menebak perangkat root. Spesifikasikan pilihan ``--root-device''."
#: util/mkisofs/eltorito.c:96
#, c-format
#: util/mkisofs/eltorito.c:98
#, c-format
msgid "This file must be removed before a bootable CD can be done.\n"
-msgstr "Berkas ini mungkin telah terhapus sebelum sebuah CD bootable dapat dilakukan.\n"
+msgstr ""
+"Berkas ini mungkin telah terhapus sebelum sebuah CD bootable dapat "
+"dilakukan.\n"
#: util/mkisofs/eltorito.c:110
#, c-format
#: util/mkisofs/joliet.c:359 util/mkisofs/write.c:981
#, c-format
msgid "Unable to generate sane path tables - too many directories (%d)\n"
-msgstr "Tidak dapat menghasilkan tabel jalur yang masuk akal - terlalu banyak direktori (%d)\n"
+msgstr ""
+"Tidak dapat menghasilkan tabel jalur yang masuk akal - terlalu banyak "
+"direktori (%d)\n"
#: util/mkisofs/joliet.c:398 util/mkisofs/write.c:1017
#, c-format
msgid "Unexpected joliet directory length %d %d %s\n"
msgstr "Panjang direktori joliet tidak terduga %d %d %s\n"
+#: util/mkisofs/mkisofs.c:203
+msgid "Process all files (don't skip backup files)"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:205
+#, fuzzy
+msgid "Set Abstract filename"
+msgstr "String nama berkas abstrak terlalu panjang\n"
+
+#: util/mkisofs/mkisofs.c:207
+msgid "Set Application ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:209
+#, fuzzy
+msgid "Set Bibliographic filename"
+msgstr "String nama berkas bibliographic terlalu panjang\n"
+
+#: util/mkisofs/mkisofs.c:211
+#, fuzzy
+msgid "Set Copyright filename"
+msgstr "String nama berkas Hak Cipta terlalu panjang\n"
+
+#: util/mkisofs/mkisofs.c:213
+msgid "Set El Torito boot image name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:215
+#, fuzzy
+msgid "Set El Torito boot catalog name"
+msgstr "Error menulis ke katalog boot"
+
+#: util/mkisofs/mkisofs.c:217
+msgid "Patch Boot Info Table in El Torito boot image"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:219
+msgid "Dummy option for backward compatibility"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:221
+msgid "Enable floppy drive emulation for El Torito"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:223
+msgid "Magic parameters from cdrecord"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:225
+msgid "Omit trailing periods from filenames"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:227
+#, fuzzy
+msgid "Disable deep directory relocation"
+msgstr "Fatal goof - tidak dapat menemukan lokasi direktori\n"
+
+#: util/mkisofs/mkisofs.c:229
+msgid "Follow symbolic links"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:231 util/mkisofs/mkisofs.c:233
+msgid "Print option help"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:235
+msgid "Print version information and exit"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:237
+msgid "Hide ISO9660/RR file"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:239
+msgid "Hide Joliet file"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:241
+#, fuzzy
+msgid "No longer supported"
+msgstr "pilihan -i tidak lagi didukung.\n"
+
+#: util/mkisofs/mkisofs.c:243
+msgid "Generate Joliet directory information"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:245
+msgid "Allow full 32 character filenames for iso9660 names"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:247
+msgid "Allow iso9660 filenames to start with '.'"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:249
+#, fuzzy
+msgid "Re-direct messages to LOG_FILE"
+msgstr "menredireksikan seluruh pesan ke %s\n"
+
+#: util/mkisofs/mkisofs.c:251
+msgid "Exclude file name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:253
+#, fuzzy
+msgid "Set path to previous session to merge"
+msgstr "Tidak dapat membuka sesi image sebelumnya %s\n"
+
+#: util/mkisofs/mkisofs.c:255
+msgid "Omit version number from iso9660 filename"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:257
+msgid "Inhibit splitting symlink components"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:259
+msgid "Inhibit splitting symlink fields"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:261
+msgid "Set output file name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:263
+msgid "Set Volume preparer"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:265
+msgid "Print estimated filesystem size and exit"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:267
+msgid "Set Volume publisher"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:269
+msgid "Run quietly"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:271
+msgid "Generate rationalized Rock Ridge directory information"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:273
+msgid "Generate Rock Ridge directory information"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:275
+msgid "Split output into files of approx. 1GB size"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:277
+msgid "Set System ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:279
+msgid ""
+"Generate translation tables for systems that don't understand long filenames"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:281
+msgid "Verbose"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:283
+msgid "Set Volume ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:285
+msgid "Set Volume set ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:287
+msgid "Set Volume set size"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:289
+#, fuzzy
+msgid "Set Volume set sequence number"
+msgstr "Set urutan nomor volume terlalu besar\n"
+
+#: util/mkisofs/mkisofs.c:291
+msgid "Exclude file name (deprecated)"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:297
+msgid "Override creation date"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:299
+msgid "Override modification date"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:301
+msgid "Override expiration date"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:303
+msgid "Override effective date"
+msgstr ""
+
#: util/mkisofs/mkisofs.c:373
#, c-format
msgid "Using \"%s\"\n"
#: util/mkisofs/mkisofs.c:978
#, c-format
msgid "Multisession usage bug: Must specify -C if -M is used.\n"
-msgstr "Bug penggunaan multi sesi: Harus menspesifikasikan -C jika -M digunakan.\n"
+msgstr ""
+"Bug penggunaan multi sesi: Harus menspesifikasikan -C jika -M digunakan.\n"
#: util/mkisofs/mkisofs.c:984
#, c-format
-msgid "Warning: -C specified without -M: old session data will not be merged.\n"
-msgstr "Peringatan: -C dispesifikasikan tanpa -M: data sesi lama tidak akan digabungkan.\n"
+msgid ""
+"Warning: -C specified without -M: old session data will not be merged.\n"
+msgstr ""
+"Peringatan: -C dispesifikasikan tanpa -M: data sesi lama tidak akan "
+"digabungkan.\n"
#: util/mkisofs/mkisofs.c:1023
#, c-format
#: util/mkisofs/multi.c:546
#, c-format
-msgid "Warning: Neither Rock Ridge (-R) nor TRANS.TBL (-T) name translations were found on previous session. ISO (8.3) file names have been used instead.\n"
-msgstr "Peringatan: Bukan Rock Ridge (-R) ataupun TRANS.TBL (-T) nama terjemahan ditemukan dalam sesi sebelumnya. ISO (8.3) nama berkas yang telah digunakan.\n"
+msgid ""
+"Warning: Neither Rock Ridge (-R) nor TRANS.TBL (-T) name translations were "
+"found on previous session. ISO (8.3) file names have been used instead.\n"
+msgstr ""
+"Peringatan: Bukan Rock Ridge (-R) ataupun TRANS.TBL (-T) nama terjemahan "
+"ditemukan dalam sesi sebelumnya. ISO (8.3) nama berkas yang telah "
+"digunakan.\n"
#: util/mkisofs/multi.c:764
#, c-format
#: util/mkisofs/rock.c:309
#, c-format
msgid "symbolic link ``%s'' to long for one SL System Use Field, splitting"
-msgstr "link simbolik ``%s'' terlalu panjang untuk satu SL Sistem Menggunakan Field, dipisahkan"
+msgstr ""
+"link simbolik ``%s'' terlalu panjang untuk satu SL Sistem Menggunakan "
+"Field, dipisahkan"
#: util/mkisofs/rock.c:517
#, c-format
msgid "Unable to insert transparent compressed file - name conflict\n"
-msgstr "Tidak dapat memasukan berkas terkompress secara transparan - konflik nama\n"
+msgstr ""
+"Tidak dapat memasukan berkas terkompress secara transparan - konflik nama\n"
#: util/mkisofs/rock.c:591
msgid "Extension record too long\n"
#: util/mkisofs/tree.c:997 util/mkisofs/tree.c:1103
#, c-format
msgid "Unable to stat file %s - ignoring and continuing.\n"
-msgstr "Tidak dapat memperoleh statistik berkas %s - mengabaikan dan melanjutkan.\n"
+msgstr ""
+"Tidak dapat memperoleh statistik berkas %s - mengabaikan dan melanjutkan.\n"
#: util/mkisofs/tree.c:1003
#, c-format
#: util/mkisofs/write.c:1154
#, c-format
-msgid "Number of extents written different than what was predicted. Please fix.\n"
-msgstr "Jumlah dari ekstensi yang ditulis berbeda dari apa yang direncanakan. Mohon betulkan.\n"
+msgid ""
+"Number of extents written different than what was predicted. Please fix.\n"
+msgstr ""
+"Jumlah dari ekstensi yang ditulis berbeda dari apa yang direncanakan. Mohon "
+"betulkan.\n"
#: util/mkisofs/write.c:1155
#, c-format
msgid "Path table size(bytes): %d\n"
msgstr "Ukuran tabel jalur(bytes): %d\n"
+#: normal/menu_text.c:97
+#, c-format
+msgid ""
+"\n"
+" Use the %C and %C keys to select which entry is highlighted.\n"
+msgstr ""
+
#: util/grub.d/10_kfreebsd.in:40
msgid "%s, with kFreeBSD %s"
msgstr "%s, dengan kFreeBSD %s"
#~ msgid "the core image will be embedded at sector 0x%llx"
#~ msgstr "core image akan di ditempatkan di sektor 0x%llx"
-#~ msgid "succeeded in opening the core image but the size is different (%d != %d)"
+#~ msgid ""
+#~ "succeeded in opening the core image but the size is different (%d != %d)"
#~ msgstr "sukses dalam membuka image core tetapi ukurannya berbeda (%d != %d)"
#~ msgid "succeeded in opening the core image but cannot read %d bytes"
msgstr ""
"Project-Id-Version: grub 1.97+20091122\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-22 11:48+0100\n"
+"POT-Creation-Date: 2009-11-25 23:35+0100\n"
"PO-Revision-Date: 2009-11-23 18:36+0800\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
-"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists.sourceforge.net>\n"
+"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists."
+"sourceforge.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "Core image is too big (%p > %p)\n"
msgstr "核心映像太大(%p > %p)\n"
-#: util/i386/pc/grub-mkimage.c:321 util/i386/pc/grub-setup.c:587
+#: util/i386/pc/grub-mkimage.c:321 util/i386/pc/grub-setup.c:589
#, c-format
msgid "Try ``%s --help'' for more information.\n"
msgstr "请尝试运行 ``%s --help'' 以获得更多信息。\n"
#: util/i386/pc/grub-setup.c:265
#, c-format
-msgid "%s appears to contain a %s filesystem which isn't known to reserve space for DOS-style boot. Installing GRUB there could result in FILESYSTEM DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe disables this check, use at your own risk)"
+msgid ""
+"%s appears to contain a %s filesystem which isn't known to reserve space for "
+"DOS-style boot. Installing GRUB there could result in FILESYSTEM "
+"DESTRUCTION if valuable data is overwritten by grub-setup (--skip-fs-probe "
+"disables this check, use at your own risk)"
msgstr ""
#: util/i386/pc/grub-setup.c:314
msgstr "未找到 DOS 类型分区"
#: util/i386/pc/grub-setup.c:330 util/i386/pc/grub-setup.c:355
-msgid "Attempting to install GRUB to a partitionless disk. This is a BAD idea."
+msgid ""
+"Attempting to install GRUB to a partitionless disk. This is a BAD idea."
msgstr "正在试图安装 GRUB 到未分区的磁盘。 这是一个坏主意。"
#: util/i386/pc/grub-setup.c:336
-msgid "Attempting to install GRUB to a partition instead of the MBR. This is a BAD idea."
+msgid ""
+"Attempting to install GRUB to a partition instead of the MBR. This is a BAD "
+"idea."
msgstr "正在试图安装 GRUB 到分区而非 MBR。 这是一个坏主意。"
#: util/i386/pc/grub-setup.c:365
-msgid "This msdos-style partition label has no post-MBR gap; embedding won't be possible!"
+msgid ""
+"This msdos-style partition label has no post-MBR gap; embedding won't be "
+"possible!"
msgstr ""
#: util/i386/pc/grub-setup.c:367
-msgid "This GPT partition label has no BIOS Boot Partition; embedding won't be possible!"
+msgid ""
+"This GPT partition label has no BIOS Boot Partition; embedding won't be "
+"possible!"
msgstr ""
#: util/i386/pc/grub-setup.c:374
msgstr "您的嵌入式环境超乎寻常的小。core.img 无法适用于此处。"
#: util/i386/pc/grub-setup.c:418
-msgid "Embedding is not possible, but this is required when the root device is on a RAID array or LVM volume."
+msgid ""
+"Embedding is not possible, but this is required when the root device is on a "
+"RAID array or LVM volume."
msgstr ""
#: util/i386/pc/grub-setup.c:421
-msgid "Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and its use is discouraged."
+msgid ""
+"Embedding is not possible. GRUB can only be installed in this setup by "
+"using blocklists. However, blocklists are UNRELIABLE and its use is "
+"discouraged."
msgstr ""
#: util/i386/pc/grub-setup.c:425
msgid "If you really want blocklists, use --force."
msgstr ""
-#: util/i386/pc/grub-setup.c:439
+#: util/i386/pc/grub-setup.c:441
#, c-format
msgid "attempting to read the core image `%s' from GRUB"
msgstr "正在尝试从 GRUB 读取核心映像 `%s'"
-#: util/i386/pc/grub-setup.c:440
+#: util/i386/pc/grub-setup.c:442
#, c-format
msgid "attempting to read the core image `%s' from GRUB again"
msgstr "正在再次尝试从 GRUB 读取核心映像 `%s'"
-#: util/i386/pc/grub-setup.c:498
+#: util/i386/pc/grub-setup.c:500
#, c-format
msgid "Cannot read `%s' correctly"
msgstr "无法正确读取 `%s'"
-#: util/i386/pc/grub-setup.c:511
+#: util/i386/pc/grub-setup.c:513
msgid "No terminator in the core image"
msgstr "核心映像中没有终止符"
-#: util/i386/pc/grub-setup.c:522
+#: util/i386/pc/grub-setup.c:524
msgid "Failed to read the first sector of the core image"
msgstr ""
-#: util/i386/pc/grub-setup.c:528
+#: util/i386/pc/grub-setup.c:530
msgid "Failed to read the rest sectors of the core image"
msgstr ""
-#: util/i386/pc/grub-setup.c:547
+#: util/i386/pc/grub-setup.c:549
#, c-format
msgid "Cannot open `%s'"
msgstr "无法打开 `%s'"
-#: util/i386/pc/grub-setup.c:589
+#: util/i386/pc/grub-setup.c:591
#, c-format
msgid ""
"Usage: grub-setup [OPTION]... DEVICE\n"
"Report bugs to <%s>.\n"
msgstr ""
-#: util/i386/pc/grub-setup.c:719
+#: util/i386/pc/grub-setup.c:721
#, c-format
msgid "No device is specified.\n"
msgstr "没有指定设备。\n"
-#: util/i386/pc/grub-setup.c:725
+#: util/i386/pc/grub-setup.c:727
#, c-format
msgid "Unknown extra argument `%s'.\n"
msgstr "未知的额外参数 `%s'。\n"
-#: util/i386/pc/grub-setup.c:742
+#: util/i386/pc/grub-setup.c:744
#, c-format
msgid "Invalid device `%s'.\n"
msgstr "无效的设备 `%s'。\n"
-#: util/i386/pc/grub-setup.c:755
+#: util/i386/pc/grub-setup.c:757
#, c-format
msgid "Invalid root device `%s'"
msgstr "无效的根设备 `%s'"
-#: util/i386/pc/grub-setup.c:768
+#: util/i386/pc/grub-setup.c:770
msgid "Cannot guess the root device. Specify the option ``--root-device''."
msgstr "无法猜测根设备。请使用 ``--root-device'' 选项指定。"
msgid "Unexpected joliet directory length %d %d %s\n"
msgstr ""
+#: util/mkisofs/mkisofs.c:203
+msgid "Process all files (don't skip backup files)"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:205
+msgid "Set Abstract filename"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:207
+msgid "Set Application ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:209
+msgid "Set Bibliographic filename"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:211
+msgid "Set Copyright filename"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:213
+msgid "Set El Torito boot image name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:215
+msgid "Set El Torito boot catalog name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:217
+msgid "Patch Boot Info Table in El Torito boot image"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:219
+msgid "Dummy option for backward compatibility"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:221
+msgid "Enable floppy drive emulation for El Torito"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:223
+msgid "Magic parameters from cdrecord"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:225
+msgid "Omit trailing periods from filenames"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:227
+msgid "Disable deep directory relocation"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:229
+msgid "Follow symbolic links"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:231 util/mkisofs/mkisofs.c:233
+msgid "Print option help"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:235
+msgid "Print version information and exit"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:237
+msgid "Hide ISO9660/RR file"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:239
+msgid "Hide Joliet file"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:241
+#, fuzzy
+msgid "No longer supported"
+msgstr "-i 选项已不再被支持。\n"
+
+#: util/mkisofs/mkisofs.c:243
+msgid "Generate Joliet directory information"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:245
+msgid "Allow full 32 character filenames for iso9660 names"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:247
+msgid "Allow iso9660 filenames to start with '.'"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:249
+msgid "Re-direct messages to LOG_FILE"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:251
+msgid "Exclude file name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:253
+#, fuzzy
+msgid "Set path to previous session to merge"
+msgstr "无法打开上一会话使用的映像 %s\n"
+
+#: util/mkisofs/mkisofs.c:255
+msgid "Omit version number from iso9660 filename"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:257
+msgid "Inhibit splitting symlink components"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:259
+msgid "Inhibit splitting symlink fields"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:261
+msgid "Set output file name"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:263
+msgid "Set Volume preparer"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:265
+msgid "Print estimated filesystem size and exit"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:267
+msgid "Set Volume publisher"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:269
+msgid "Run quietly"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:271
+msgid "Generate rationalized Rock Ridge directory information"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:273
+msgid "Generate Rock Ridge directory information"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:275
+msgid "Split output into files of approx. 1GB size"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:277
+msgid "Set System ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:279
+msgid ""
+"Generate translation tables for systems that don't understand long filenames"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:281
+msgid "Verbose"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:283
+msgid "Set Volume ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:285
+msgid "Set Volume set ID"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:287
+msgid "Set Volume set size"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:289
+msgid "Set Volume set sequence number"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:291
+msgid "Exclude file name (deprecated)"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:297
+msgid "Override creation date"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:299
+msgid "Override modification date"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:301
+msgid "Override expiration date"
+msgstr ""
+
+#: util/mkisofs/mkisofs.c:303
+msgid "Override effective date"
+msgstr ""
+
#: util/mkisofs/mkisofs.c:373
#, c-format
msgid "Using \"%s\"\n"
#: util/mkisofs/mkisofs.c:984
#, c-format
-msgid "Warning: -C specified without -M: old session data will not be merged.\n"
+msgid ""
+"Warning: -C specified without -M: old session data will not be merged.\n"
msgstr ""
#: util/mkisofs/mkisofs.c:1023
#: util/mkisofs/multi.c:546
#, c-format
-msgid "Warning: Neither Rock Ridge (-R) nor TRANS.TBL (-T) name translations were found on previous session. ISO (8.3) file names have been used instead.\n"
+msgid ""
+"Warning: Neither Rock Ridge (-R) nor TRANS.TBL (-T) name translations were "
+"found on previous session. ISO (8.3) file names have been used instead.\n"
msgstr ""
#: util/mkisofs/multi.c:764
#: util/mkisofs/write.c:1154
#, c-format
-msgid "Number of extents written different than what was predicted. Please fix.\n"
+msgid ""
+"Number of extents written different than what was predicted. Please fix.\n"
msgstr ""
#: util/mkisofs/write.c:1155
msgid "Path table size(bytes): %d\n"
msgstr ""
+#: normal/menu_text.c:97
+#, c-format
+msgid ""
+"\n"
+" Use the %C and %C keys to select which entry is highlighted.\n"
+msgstr ""
+
#: util/grub.d/10_kfreebsd.in:40
msgid "%s, with kFreeBSD %s"
msgstr ""