mem.s

来自「xen虚拟机源代码安装包」· S 代码 · 共 79 行

S
79
字号
        .code16#define SMAP    0x534d4150#define E820MAX 128get_memory_map:.Lmeme820:        xorl    %ebx, %ebx                      # continuation counter        movw    $bootsym(e820map), %di             # point into the whitelist                                                # so we can have the bios                                                # directly write into it.1:      movl    $0x0000e820, %eax               # e820, upper word zeroed        movl    $SMAP,%edx                      # ascii 'SMAP'        movl    $20,%ecx                        # size of the e820rec        pushw   %ds                             # data record.        popw    %es        int     $0x15        jc      .Lmem88        cmpl    $SMAP,%eax                      # check the return is `SMAP'        jne     .Lmem88        movb    bootsym(e820nr),%al             # up to 128 entries        cmpb    $E820MAX,%al        jae     .Lmem88        incb    bootsym(e820nr)        movw    %di,%ax        addw    $20,%ax        movw    %ax,%di        cmpl    $0,%ebx                         # check to see if        jne     1b                              # %ebx is set to EOF.Lmem88:        movb    $0x88, %ah        int     $0x15        movw    %ax,bootsym(highmem_kb).Lmeme801:        stc                                     # fix to work around buggy        xorw    %cx,%cx                         # BIOSes which don't clear/set        xorw    %dx,%dx                         # carry on pass/error of                                                # e801h memory size call                                                # or merely pass cx,dx though                                                # without changing them.        movw    $0xe801, %ax        int     $0x15        jc      .Lint12        cmpw    $0x0, %cx                       # Kludge to handle BIOSes        jne     1f                              # which report their extended        cmpw    $0x0, %dx                       # memory in AX/BX rather than        jne     1f                              # CX/DX.  The spec I have read        movw    %ax, %cx                        # seems to indicate AX/BX         movw    %bx, %dx                        # are more reasonable anyway...1:      andl    $0xffff,%edx                    # clear sign extend        shll    $6,%edx                         # and go from 64k to 1k chunks        movl    %edx,bootsym(highmem_kb)        # store extended memory size        andl    $0xffff,%ecx                    # clear sign extend        addl    %ecx,bootsym(highmem_kb)        # and add lower memory into.Lint12:        int     $0x12        movw    %ax,bootsym(lowmem_kb)        ret        .globl e820map, e820nr, lowmem_kb, highmem_kbe820map:        .fill   E820MAX*20,1,0e820nr:        .long   0lowmem_kb:        .long   0highmem_kb:        .long   0

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?