mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-02 23:18:44 +00:00
Fix execution bug w/o binfmt_misc
The longjmp relocation in the master boot record coincidentally had a quote character in it, which caused the master boot record to be used when interpreter by the shell. The solution, is to move the grub stub below the long mode loader so the real mode loader relocation is near the master boot record. This change includes a regression test.
This commit is contained in:
parent
1a29424c52
commit
8f12cd980d
3 changed files with 61 additions and 46 deletions
83
ape/ape.S
83
ape/ape.S
|
@ -553,6 +553,7 @@ apesh: .ascii "'\n#'\"\n" # sixth edition shebang
|
|||
.ascii "[ x\"$1\" != x--assimilate ] && {\n"
|
||||
.ascii "t=\"${TMPDIR:-/tmp}/ape\"\n"
|
||||
.ascii "[ -x \"$t\" ] || {\n"
|
||||
.ascii "mkdir -p \"${t%/*}\" &&\n"
|
||||
.ascii "dd if=\"$o\" of=\"$t.$$\" skip=\""
|
||||
.shstub ape_loader_dd_skip,2
|
||||
.ascii "\" count=\""
|
||||
|
@ -1168,47 +1169,6 @@ gdt: .short 2f-1f # table byte length
|
|||
.quad 0b0000000010101111100100110000000000000000000000001111111111111111 #48
|
||||
2: .endobj gdt,global,hidden
|
||||
|
||||
/*─────────────────────────────────────────────────────────────────────────────╗
|
||||
│ αcτµαlly pδrταblε εxεcµταblε § multiboot stub │
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
boot modernized for the nineties */
|
||||
|
||||
#define GRUB_MAGIC 0x1BADB002
|
||||
#define GRUB_EAX 0x2BADB002
|
||||
#define GRUB_AOUT (1 << 16)
|
||||
#define GRUB_CHECKSUM(FLAGS) (-(GRUB_MAGIC + (FLAGS)) & 0xffffffff)
|
||||
|
||||
// Grub Header.
|
||||
.align 4
|
||||
ape_grub:
|
||||
.long GRUB_MAGIC # Magic
|
||||
.long GRUB_AOUT # Flags
|
||||
.long GRUB_CHECKSUM(GRUB_AOUT) # Checksum
|
||||
.long RVA(ape_grub) # HeaderPhysicalAddress
|
||||
.long IMAGE_BASE_PHYSICAL # TextPhysicalAddress
|
||||
.long PHYSICAL(_edata) # LoadEndPhysicalAddress
|
||||
.long PHYSICAL(_end) # BssEndPhysicalAddress
|
||||
.long RVA(ape_grub_entry) # EntryPhysicalAddress
|
||||
.endobj ape_grub,globl
|
||||
|
||||
// Grub Entrypoint.
|
||||
// Takes CPU out of legacy mode and jumps to normal entrypoint.
|
||||
// @noreturn
|
||||
.align 4
|
||||
ape_grub_entry:
|
||||
.code32
|
||||
// cmp $GRUB_EAX,%eax
|
||||
// jne triplf
|
||||
push $0
|
||||
popf
|
||||
mov $0x40,%dl
|
||||
mov %cr0,%eax
|
||||
and $~CR0_PE,%eax
|
||||
mov %eax,%cr0
|
||||
ljmpw $0,$REAL(pc)
|
||||
.code16
|
||||
.endfn ape_grub_entry
|
||||
|
||||
/*─────────────────────────────────────────────────────────────────────────────╗
|
||||
│ αcτµαlly pδrταblε εxεcµταblε § real mode │
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
|
@ -1485,6 +1445,47 @@ long: push $GDT_LONG_DATA
|
|||
jmp *%rax
|
||||
.endfn long
|
||||
|
||||
/*─────────────────────────────────────────────────────────────────────────────╗
|
||||
│ αcτµαlly pδrταblε εxεcµταblε § multiboot stub │
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
boot modernized for the nineties */
|
||||
|
||||
#define GRUB_MAGIC 0x1BADB002
|
||||
#define GRUB_EAX 0x2BADB002
|
||||
#define GRUB_AOUT (1 << 16)
|
||||
#define GRUB_CHECKSUM(FLAGS) (-(GRUB_MAGIC + (FLAGS)) & 0xffffffff)
|
||||
|
||||
// Grub Header.
|
||||
.align 4
|
||||
ape_grub:
|
||||
.long GRUB_MAGIC # Magic
|
||||
.long GRUB_AOUT # Flags
|
||||
.long GRUB_CHECKSUM(GRUB_AOUT) # Checksum
|
||||
.long RVA(ape_grub) # HeaderPhysicalAddress
|
||||
.long IMAGE_BASE_PHYSICAL # TextPhysicalAddress
|
||||
.long PHYSICAL(_edata) # LoadEndPhysicalAddress
|
||||
.long PHYSICAL(_end) # BssEndPhysicalAddress
|
||||
.long RVA(ape_grub_entry) # EntryPhysicalAddress
|
||||
.endobj ape_grub,globl
|
||||
|
||||
// Grub Entrypoint.
|
||||
// Takes CPU out of legacy mode and jumps to normal entrypoint.
|
||||
// @noreturn
|
||||
.align 4
|
||||
ape_grub_entry:
|
||||
.code32
|
||||
// cmp $GRUB_EAX,%eax
|
||||
// jne triplf
|
||||
push $0
|
||||
popf
|
||||
mov $0x40,%dl
|
||||
mov %cr0,%eax
|
||||
and $~CR0_PE,%eax
|
||||
mov %eax,%cr0
|
||||
ljmpw $0,$REAL(pc)
|
||||
.code64
|
||||
.endfn ape_grub_entry
|
||||
|
||||
/* ▄▄▒▀▀▀▀▒▒▄
|
||||
█████▓▓▄░░░░ ▒▒▄
|
||||
▐█▓▓█▓▄█████▓░ ▀▒▄
|
||||
|
|
|
@ -105,6 +105,20 @@ void RunApeTest(const char *path) {
|
|||
EXPECT_STREQN("MZqFpD", buf, 6);
|
||||
}
|
||||
|
||||
TEST(ape, noAccidentalQuotesInMasterBootRecord) {
|
||||
int i, quotes = 0;
|
||||
char buf[512] = {0};
|
||||
EXPECT_SYS(0, 3, open("bin/apetest.com", O_RDONLY));
|
||||
EXPECT_SYS(0, 512, read(3, buf, 512));
|
||||
EXPECT_SYS(0, 0, close(3));
|
||||
for (i = 0; i < 512; ++i) {
|
||||
if (buf[i] == '\'') {
|
||||
++quotes;
|
||||
}
|
||||
}
|
||||
EXPECT_EQ(1, quotes);
|
||||
}
|
||||
|
||||
TEST(apeNoModifySelf, runsWithoutModifyingSelf) {
|
||||
RunApeTest("bin/apetest.com");
|
||||
}
|
||||
|
|
10
third_party/chibicc/chibicc.mk
vendored
10
third_party/chibicc/chibicc.mk
vendored
|
@ -10,8 +10,8 @@
|
|||
# This makefile compiles and runs each test twice. The first with
|
||||
# GCC-built chibicc, and a second time with chibicc-built chibicc
|
||||
|
||||
CHIBICC = o/$(MODE)/third_party/chibicc/chibicc.com.dbg
|
||||
CHIBICC2 = o/$(MODE)/third_party/chibicc/chibicc2.com.dbg
|
||||
CHIBICC = o/$(MODE)/third_party/chibicc/chibicc.com
|
||||
CHIBICC2 = o/$(MODE)/third_party/chibicc/chibicc2.com
|
||||
CHIBICC_FLAGS = \
|
||||
-fno-common \
|
||||
-include libc/integral/normalize.inc \
|
||||
|
@ -134,11 +134,11 @@ o/$(MODE)/third_party/chibicc/chibicc.o: \
|
|||
o/$(MODE)/third_party/chibicc/chibicc.chibicc.o: \
|
||||
CHIBICC_FLAGS += $(THIRD_PARTY_CHIBICC_DEFINES)
|
||||
|
||||
o/$(MODE)/%.chibicc.o: %.s o/$(MODE)/third_party/chibicc/chibicc.com.dbg
|
||||
o/$(MODE)/%.chibicc.o: %.s $(CHIBICC)
|
||||
@$(COMPILE) -ACHIBICC -T$@ $(CHIBICC) $(CHIBICC_FLAGS) -c -o $@ $<
|
||||
o/$(MODE)/%.chibicc.o: %.c o/$(MODE)/third_party/chibicc/chibicc.com.dbg
|
||||
o/$(MODE)/%.chibicc.o: %.c $(CHIBICC)
|
||||
@$(COMPILE) -ACHIBICC -T$@ $(CHIBICC) $(CHIBICC_FLAGS) -c -o $@ $<
|
||||
o/$(MODE)/%.chibicc2.o: %.c o/$(MODE)/third_party/chibicc/chibicc2.com.dbg
|
||||
o/$(MODE)/%.chibicc2.o: %.c $(CHIBICC2)
|
||||
@$(COMPILE) -ACHIBICC2 -T$@ $(CHIBICC2) $(CHIBICC_FLAGS) -c -o $@ $<
|
||||
|
||||
THIRD_PARTY_CHIBICC_LIBS = $(foreach x,$(THIRD_PARTY_CHIBICC_ARTIFACTS),$($(x)))
|
||||
|
|
Loading…
Add table
Reference in a new issue