Skip to content

internal compiler error: unexpected panic #28410

Closed
@dongz9

Description

@dongz9

The compiler panicked when I tried to compile the following code:


extern crate x86;

use core::{ptr, intrinsics};
use self::x86::io::{inb, outb};

/***** Serial I/O code *****/
const COM1: u16              = 0x3f8;

const COM_RX: u16            = 0;    // In:  Receive buffer (DLAB=0)
const COM_TX: u16            = 0;    // Out: Transmit buffer (DLAB=0)
const COM_DLL: u16           = 1;    // Out: Divisor Latch Low (DLAB=1)
const COM_DLM: u16           = 1;    // Out: Divisor Latch High (DLAB=1)
const COM_IER: u16           = 1;    // Out: Interrupt Enable Register
const COM_IER_RDI: u8        = 0x01; //   Enable receiver data interrupt
const COM_IIR: u16           = 2;    // In: Interrupt ID Register
const COM_FCR: u16           = 2;    // Out: FIFO Control Register
const COM_LCR: u16           = 3;    // Out: Line Control Register
const COM_LCR_DLAB: u8       = 0x80; //   Divisor latch access bit
const COM_LCR_WLEN8: u8      = 0x03; //   Wordlength: 8 bits
const COM_MCR: u16           = 4;    // Out: Modem Control Register
const COM_MCR_RTS: u8        = 0x02; // RTS complement
const COM_MCR_DTR: u8        = 0x01; // DTR complement
const COM_MCR_OUT2: u8       = 0x08; // Out2 complement
const COM_LSR: u16           = 5;    // In: Line Status Register
const COM_LSR_DATA: u8       = 0x01; //   Data available
const COM_LSR_TXRDY: u8      = 0x20; //   Transmit buffer avail
const COM_LSR_TSRE: u8       = 0x40; //   Transmitter off

static mut serial_exists: bool = false;

const MONO_BASE: u16         = 0x3b4u16;
const MONO_BUF: u32          = 0xb0000;
const CGA_BASE: u16          = 0x3D4u16;
const CGA_BUF: u32           = 0xb8000;

const CRT_ROWS: u32          = 25;
const CRT_COLS: u32          = 80;
const CRT_SIZE: u32          = CRT_ROWS * CRT_COLS;

static mut crt_buf: *mut u16 = 0 as *mut u16;
static mut crt_pos: u16      = 0;

pub enum Color {
    Black      = 0,
    Blue       = 1,
    Green      = 2,
    Cyan       = 3,
    Red        = 4,
    Pink       = 5,
    Brown      = 6,
    LightGray  = 7,
    DarkGray   = 8,
    LightBlue  = 9,
    LightGreen = 10,
    LightCyan  = 11,
    LightRed   = 12,
    LightPink  = 13,
    Yellow     = 14,
    White      = 15,
}

pub fn clear_screen(background: u16) {
    for i in 0..80*25 {
        unsafe {
            *((0xb8000 + i * 2) as *mut u16) = (background as u16) << 12;
        }
    }
}

fn cga_init() {
    unsafe {
        crt_buf = CGA_BUF as *mut u16;
        let was: u16 = intrinsics::volatile_load(crt_buf);
        intrinsics::volatile_store(crt_buf, 0xa55a);
        let addr_6845: u16 =
            if intrinsics::volatile_load(crt_buf as *const u16) != 0xa55a {
                crt_buf = MONO_BUF as *mut u16;
                MONO_BASE
            } else {
                intrinsics::volatile_store(crt_buf, was);
                CGA_BASE
            };
        outb(addr_6845, 14);
        crt_pos  = (inb(addr_6845 + 1) as u16) << 8;
        outb(addr_6845, 15);
        crt_pos |= inb(addr_6845 + 1) as u16;
    }
}

fn serial_init() {
    unsafe {
        // Turn off the FIFO
        outb(COM1+COM_FCR, 0);

        // Set speed; requires DLAB latch
        outb(COM1+COM_LCR, COM_LCR_DLAB);
        outb(COM1+COM_DLL, (115200 / 9600) as u8);
        outb(COM1+COM_DLM, 0);
        
        // 8 data bits, 1 stop bit, parity off; turn off DLAB latch
        outb(COM1+COM_LCR, COM_LCR_WLEN8 & (!COM_LCR_DLAB));
        
        // No modem controls
        outb(COM1+COM_MCR, 0);
        // Enable rcv interrupts
        outb(COM1+COM_IER, COM_IER_RDI);
        
        // Clear any preexisting overrun indications and interrupts
        // Serial port doesn't exist if COM_LSR returns 0xFF
        serial_exists = inb(COM1+COM_LSR) != 0xff;
        
        inb(COM1+COM_IIR);
        inb(COM1+COM_RX);
    }
}

pub fn console_init() {
    cga_init();
    serial_init();
}

stack backtrace:


   1:     0x7fca77ef7579 - sys::backtrace::tracing::imp::write::h4dc38f76be463a237ls
   2:     0x7fca77eff296 - panicking::on_panic::h6397ac94db38aaebEmx
   3:     0x7fca77ec350e - rt::unwind::begin_unwind_inner::h75c2cf93044e2230iPw
   4:     0x7fca77ec4257 - rt::unwind::begin_unwind_fmt::h330a5507242e40f4oOw
   5:     0x7fca77efee91 - rust_begin_unwind
   6:     0x7fca77f5072f - panicking::panic_fmt::h8cd068804ffdc08dJ7E
   7:     0x7fca77f4aa42 - panicking::panic_bounds_check::hdce11bec4da8707bP6E
   8:     0x7fca775f7ae2 - back::write::report_inline_asm::he486ded170c4b7abAsd
   9:     0x7fca775f7bfe - back::write::inline_asm_handler::h24be2a5729e82af9Gtd
  10:     0x7fca73ffceb0 - _ZN12_GLOBAL__N_19AsmParser11DiagHandlerERKN4llvm12SMDiagnosticEPv
  11:     0x7fca7423fab4 - _ZNK4llvm9SourceMgr12PrintMessageERNS_11raw_ostreamENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS8_INS_7SMFixItEEEb
  12:     0x7fca7423fbc4 - _ZNK4llvm9SourceMgr12PrintMessageENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS6_INS_7SMFixItEEEb
  13:     0x7fca73ffd4b4 - _ZN12_GLOBAL__N_19AsmParser5ErrorEN4llvm5SMLocERKNS1_5TwineENS1_8ArrayRefINS1_7SMRangeEEE
  14:     0x7fca736ae361 - _ZN12_GLOBAL__N_112X86AsmParser26MatchAndEmitATTInstructionEN4llvm5SMLocERjRNS1_15SmallVectorImplISt10unique_ptrINS1_18MCParsedAsmOperandESt14default_deleteIS6_EEEERNS1_10MCStreamerERmb.constprop.217
  15:     0x7fca740052bf - _ZN12_GLOBAL__N_19AsmParser14parseStatementERNS_18ParseStatementInfoEPN4llvm23MCAsmParserSemaCallbackE.constprop.430
  16:     0x7fca740076d0 - _ZN12_GLOBAL__N_19AsmParser3RunEbb
  17:     0x7fca739438ad - _ZNK4llvm10AsmPrinter13EmitInlineAsmENS_9StringRefERKNS_15MCSubtargetInfoERKNS_15MCTargetOptionsEPKNS_6MDNodeENS_9InlineAsm10AsmDialectE
  18:     0x7fca7394457b - _ZNK4llvm10AsmPrinter13EmitInlineAsmEPKNS_12MachineInstrE
  19:     0x7fca739413bc - _ZN4llvm10AsmPrinter16EmitFunctionBodyEv
  20:     0x7fca736af1b5 - _ZN4llvm13X86AsmPrinter20runOnMachineFunctionERNS_15MachineFunctionE
  21:     0x7fca741b0c2e - _ZN4llvm13FPPassManager13runOnFunctionERNS_8FunctionE
  22:     0x7fca741b0faa - _ZN4llvm13FPPassManager11runOnModuleERNS_6ModuleE
  23:     0x7fca741b07e8 - _ZN4llvm6legacy15PassManagerImpl3runERNS_6ModuleE
  24:     0x7fca73171653 - LLVMRustWriteOutputFile
                        at /home/dongz/scratch/rust/src/rustllvm/PassWrapper.cpp:251
  25:     0x7fca775f6113 - back::write::write_output_file::h8ba8deba603b318bW9c
  26:     0x7fca775f88dd - back::write::optimize_and_codegen::closure.46515
  27:     0x7fca7760032b - back::write::execute_work_item::h8b77bd32204d4bf1dZd
  28:     0x7fca775f98c8 - back::write::run_passes::hf3594005c97f9531rKd
  29:     0x7fca784625e6 - driver::phase_5_run_llvm_passes::h45d30a833d0bcb75rOa
  30:     0x7fca7841892a - driver::compile_input::h5e69299e94f977e5Tba
  31:     0x7fca7857a80b - run_compiler::hb83720387e7df0e70bc
  32:     0x7fca785780d7 - boxed::F.FnBox::call_box::h13079848712025015541
  33:     0x7fca78577b44 - rt::unwind::try::try_fn::h13173708879882063258
  34:     0x7fca77efee38 - __rust_try
  35:     0x7fca77eeb6a2 - rt::unwind::try::inner_try::hf6306aae862ccdd9bLw
  36:     0x7fca78577cd8 - boxed::F.FnBox::call_box::h14316091596318611009
  37:     0x7fca77efe283 - sys::thread::Thread::new::thread_start::h03e9a5e6682fce11YUv
  38:     0x7fca7271e0a3 - start_thread
  39:     0x7fca77b7e07c - clone
  40:                0x0 - 

rust version:
rustc 1.4.0-dev (7bb0d0d 2015-08-30)
binary: rustc
commit-hash: 7bb0d0d
commit-date: 2015-08-30
host: x86_64-unknown-linux-gnu
release: 1.4.0-dev

Metadata

Metadata

Assignees

No one assigned

    Labels

    I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions