cmdline.s
来自「xen虚拟机源代码安装包」· S 代码 · 共 365 行
S
365 行
/****************************************************************************** * cmdline.S * * Early command-line parsing. */ .code32#include "video.h"# NB. String pointer on stack is modified to point past parsed digits..Latoi: push %ebx push %ecx push %edx push %esi xor %ebx,%ebx /* %ebx = accumulator */ mov $10,%ecx /* %ecx = base (default base 10) */ mov 16+4(%esp),%esi /* %esi = pointer into ascii string. */ lodsb cmpb $'0',%al jne 2f mov $8,%ecx /* Prefix '0' => octal (base 8) */ lodsb cmpb $'x',%al jne 2f mov $16,%ecx /* Prefix '0x' => hex (base 16) */1: lodsb2: sub $'0',%al jb 4f cmp $9,%al jbe 3f sub $'A'-'0'-10,%al jb 4f cmp $15,%al jbe 3f sub $'a'-'A',%al jb 4f3: cmp %cl,%al jae 4f movzbl %al,%eax xchg %eax,%ebx mul %ecx xchg %eax,%ebx add %eax,%ebx jmp 1b4: mov %ebx,%eax dec %esi mov %esi,16+4(%esp) pop %esi pop %edx pop %ecx pop %ebx ret.Lstrstr: push %ecx push %edx push %esi push %edi xor %eax,%eax xor %ecx,%ecx not %ecx mov 16+4(%esp),%esi mov 16+8(%esp),%edi repne scasb not %ecx dec %ecx mov %ecx,%edx1: mov 16+8(%esp),%edi mov %esi,%eax mov %edx,%ecx repe cmpsb je 2f xchg %eax,%esi inc %esi cmpb $0,-1(%eax) jne 1b xor %eax,%eax2: pop %edi pop %esi pop %edx pop %ecx ret.Lstr_prefix: push %esi push %edi mov 8+4(%esp),%esi /* 1st arg is prefix string */ mov 8+8(%esp),%edi /* 2nd arg is main string */1: lodsb test %al,%al jz 2f scasb je 1b sbb %eax,%eax or $1,%al jmp 3f2: xor %eax,%eax3: pop %edi pop %esi ret.Lstrlen: push %ecx push %esi push %edi xor %eax,%eax xor %ecx,%ecx not %ecx mov 12+4(%esp),%edi repne scasb not %ecx dec %ecx mov %ecx,%eax pop %edi pop %esi pop %ecx ret.Lfind_option: mov 4(%esp),%eax dec %eax push %ebx1: pushl 4+8(%esp) inc %eax push %eax call .Lstrstr add $8,%esp test %eax,%eax jz 3f cmp %eax,4+4(%esp) je 2f cmpb $' ',-1(%eax) jne 1b2: mov %eax,%ebx pushl 4+8(%esp) call .Lstrlen add $4,%esp xadd %eax,%ebx cmpb $'\0',(%ebx) je 3f cmpb $' ',(%ebx) je 3f cmpb $'=',(%ebx) jne 1b3: pop %ebx ret/* multiboot_info structure offsets. */#define MB_flags 0#define MB_cmdline 16cmdline_parse_early: pusha /* Bail if there is no command line to parse. */ mov sym_phys(multiboot_ptr),%ebx mov MB_flags(%ebx),%eax test $4,%al jz .Lcmdline_exit mov MB_cmdline(%ebx),%eax test %eax,%eax jz .Lcmdline_exit /* Check for 'no-real-mode' command-line option. */ pushl $sym_phys(.Lno_rm_opt) pushl MB_cmdline(%ebx) call .Lfind_option test %eax,%eax setnz bootsym_phys(skip_realmode) /* Check for 'tboot=' command-line option. */ movl $sym_phys(.Ltboot_opt),4(%esp) call .Lfind_option test %eax,%eax setnz bootsym_phys(skip_realmode) /* tboot= implies no-real-mode */.Lparse_edd: /* Check for 'edd=' command-line option. */ movl $sym_phys(.Ledd_opt),4(%esp) call .Lfind_option test %eax,%eax jz .Lparse_edid cmpb $'=',3(%eax) jne .Lparse_edid add $4,%eax movb $2,bootsym_phys(opt_edd) /* opt_edd=2: edd=off */ cmpw $0x666f,(%eax) /* 0x666f == "of" */ je .Lparse_edid decb bootsym_phys(opt_edd) /* opt_edd=1: edd=skipmbr */ cmpw $0x6b73,(%eax) /* 0x6b73 == "sk" */ je .Lparse_edid decb bootsym_phys(opt_edid) /* opt_edd=0: edd=on (default) */.Lparse_edid: /* Check for 'edid=' command-line option. */ movl $sym_phys(.Ledid_opt),4(%esp) call .Lfind_option test %eax,%eax jz .Lparse_vga cmpb $'=',4(%eax) jne .Lparse_vga add $5,%eax mov %eax,%ebx push %ebx pushl $sym_phys(.Ledid_force) call .Lstr_prefix add $8,%esp movb $2,bootsym_phys(opt_edid) /* opt_edid=2: edid=force */ test %eax,%eax jz .Lparse_vga push %ebx pushl $sym_phys(.Ledid_no) call .Lstr_prefix add $8,%esp decb bootsym_phys(opt_edid) /* opt_edid=1: edid=no */ test %eax,%eax jz .Lparse_vga decb bootsym_phys(opt_edid) /* opt_edid=0: default */.Lparse_vga: /* Check for 'vga=' command-line option. */ movl $sym_phys(.Lvga_opt),4(%esp) call .Lfind_option add $8,%esp test %eax,%eax jz .Lcmdline_exit cmpb $'=',3(%eax) jne .Lcmdline_exit add $4,%eax /* Found the 'vga=' option. Default option is to display vga menu. */ movw $ASK_VGA,bootsym_phys(boot_vid_mode) /* Check for 'vga=text-80x<rows>. */ mov %eax,%ebx push %ebx pushl $sym_phys(.Lvga_text80) call .Lstr_prefix add $8,%esp test %eax,%eax jnz .Lparse_vga_gfx /* We have 'vga=text-80x<rows>'. */ add $8,%ebx push %ebx call .Latoi add $4,%esp mov %ax,%bx lea sym_phys(.Lvga_text_modes),%esi1: lodsw test %ax,%ax jz .Lcmdline_exit cmp %ax,%bx lodsw jne 1b mov %ax,bootsym_phys(boot_vid_mode) jmp .Lcmdline_exit.Lparse_vga_gfx: /* Check for 'vga=gfx-<width>x<height>x<depth>'. */ push %ebx pushl $sym_phys(.Lvga_gfx) call .Lstr_prefix add $8,%esp test %eax,%eax jnz .Lparse_vga_mode /* We have 'vga=gfx-<width>x<height>x<depth>'. */ /* skip 'gfx-' */ add $4,%ebx /* parse <width> */ push %ebx call .Latoi pop %esi mov %ax,bootsym_phys(vesa_size)+0 /* skip 'x' */ lodsb cmpb $'x',%al jne .Lcmdline_exit /* parse <height> */ push %esi call .Latoi pop %esi mov %ax,bootsym_phys(vesa_size)+2 /* skip 'x' */ lodsb cmpb $'x',%al jne .Lcmdline_exit /* parse <depth> */ push %esi call .Latoi pop %esi mov %ax,bootsym_phys(vesa_size)+4 /* commit to vesa mode */ movw $VIDEO_VESA_BY_SIZE,bootsym_phys(boot_vid_mode) jmp .Lcmdline_exit.Lparse_vga_mode: /* Check for 'vga=mode-<mode>'. */ push %ebx pushl $sym_phys(.Lvga_mode) call .Lstr_prefix add $8,%esp test %eax,%eax jnz .Lparse_vga_current /* We have 'vga=mode-<mode>'. */ add $5,%ebx push %ebx call .Latoi add $4,%esp mov %ax,bootsym_phys(boot_vid_mode) jmp .Lcmdline_exit.Lparse_vga_current: /* Check for 'vga=current'. */ push %ebx pushl $sym_phys(.Lvga_current) call .Lstr_prefix add $8,%esp test %eax,%eax jnz .Lcmdline_exit /* We have 'vga=current'. */ movw $VIDEO_CURRENT_MODE,bootsym_phys(boot_vid_mode).Lcmdline_exit: popa ret.Lvga_text_modes: /* rows, mode_number */ .word 25,VIDEO_80x25 .word 50,VIDEO_80x50 .word 43,VIDEO_80x43 .word 28,VIDEO_80x28 .word 30,VIDEO_80x30 .word 34,VIDEO_80x34 .word 60,VIDEO_80x60 .word 0.Lvga_opt: .asciz "vga".Lvga_text80: .asciz "text-80x".Lvga_gfx: .asciz "gfx-".Lvga_mode: .asciz "mode-".Lvga_current: .asciz "current".Lno_rm_opt: .asciz "no-real-mode".Ltboot_opt: .asciz "tboot".Ledid_opt: .asciz "edid".Ledid_force: .asciz "force".Ledid_no: .asciz "no".Ledd_opt: .asciz "edd"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?