Changeset 5d721f0 in mainline


Ignore:
Timestamp:
2005-07-20T16:54:13Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5d945376
Parents:
b4f9214
Message:

Added e801 method for obtaining memory size, improved e820 method for memory map.

Location:
arch/ia32
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/include/asm.h

    rb4f9214 r5d721f0  
    3434#include <mm/page.h>
    3535#include <synch/spinlock.h>
     36#include <arch/boot/memmap.h>
    3637
    3738extern __u32 interrupt_handler_size;
  • arch/ia32/include/boot/memmap.h

    rb4f9214 r5d721f0  
    3030#define __ia32_MEMMAP_H__
    3131
    32 /* E820h memory range types - other values*/
    33 #define MEMMAP_MEMORY_AVAILABLE 1
    34         /* Not available for OS */
    35 #define MEMMAP_MEMORY_RESERVED  2
    36         /* OS may use it after reading ACPI table */
    37 #define MEMMAP_MEMORY_ACPI      3
    38         /* Unusable, required to be saved and restored across an NVS sleep */
    39 #define MEMMAP_MEMORY_NVS       4
    40         /* Corrupted memory */
    41 #define MEMMAP_MEMORY_UNUSABLE  5
    4232
    43          /* size of one entry */
    44 #define MEMMAP_E820_RECORD_SIZE 20
    45         /* maximum entries */
    46 #define MEMMAP_E820_MAX_RECORDS 32
     33#include <arch/boot/memmapasm.h>
     34#include <arch/types.h>
     35
     36struct e820memmap_ {
     37        __u64 base_address;
     38        __u64 size;
     39        __u32 type;
     40        } __attribute__ ((packed));
     41
     42extern struct e820memmap_ e820table[MEMMAP_E820_MAX_RECORDS];
     43
     44extern __u8 e820counter;
     45
     46extern __u32 e801memorysize; // size of memory in KB
     47
    4748#endif
  • arch/ia32/src/boot/boot.S

    rb4f9214 r5d721f0  
    4040#
    4141kernel_image_start:
     42        call memmap_arch_init
    4243        cli
    43         call memmap_arch_init
    4444        xorw %ax,%ax
    4545        movw %ax,%ds
  • arch/ia32/src/boot/memmap.S

    rb4f9214 r5d721f0  
    2828
    2929
    30 #include <arch/boot/memmap.h>
     30#include <arch/boot/memmapasm.h>
    3131
    3232E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE
     
    3535
    3636.global memmap_arch_init
     37.global e820counter
     38.global e820table
     39.global e801memorysize
    3740
    3841.code16
     
    4043
    4144memmap_arch_init:
    42        
     45
    4346e820begin:
    4447        xorl    %ebx,%ebx       # during first call, ebx must be 0
    45        
     48        movw    %bx,%ds
     49        movw    %bx,%es
    4650        movw    $e820table,%di
    4751        movb    $E820_MAX_RECORDS,(e820counter)
    4852e820loop:       
    49         movl    $E820_SMAP,%edx         # constrol sequence "SMAP"
    50         pushw   %ds
    51         popw    %es             # e820 buffer address
     53        movl    $E820_SMAP,%edx         # control sequence "SMAP"
    5254
    53         movl    $0xe820,%eax            # service
     55        movl    $0x0000e820,%eax        # service
    5456        movl    $E820_RECORD_SIZE,%ecx
    5557        int     $0x15
    56         jc              e820end
    57        
     58        jc      e820err
    5859       
    5960        cmpl    $E820_SMAP,%eax         # verifying BIOS
    60         jne             e820end
     61        jne     e820err
     62
     63        cmpl    $E820_RECORD_SIZE,%ecx
     64        jne     e820err                 # bad record size - bug in bios
    6165       
    6266        movw    %di,%ax         # next record
     
    7175       
    7276e820end:
     77        movb    $E820_MAX_RECORDS,%al
     78        subb    (e820counter),%al
     79        movb    %al,(e820counter) # store # of valid entries in e820counter
     80
     81        jmp     e801begin
     82
     83e820err:
     84        movb    $0,(e820counter)
     85
     86# method e801 - get size of memory
     87
     88e801begin:
     89        xorw    %dx,%dx
     90        xorw    %cx,%cx
     91        xorw    %bx,%bx
     92        movw    $0xe801,%ax
     93        stc
     94        int     $0x15
    7395       
    74         movb    (e820counter),%al       
    75         negb    %al
    76         addb    $32,%al
    77         movb    %al,(e820counter) # store # of valid entries in e820counter
     96        jc      e801end
    7897       
     98                        # fix problem with some BIOSes which use ax:bx rather than cx:dx
     99        testw   %cx,%cx
     100        jnz     e801cxdx
     101        testw   %dx,%dx
     102        jnz     e801cxdx
     103
     104        movw    %ax,%cx
     105        movw    %bx,%dx
     106       
     107e801cxdx:
     108        andl    $0xffff,%edx
     109        shll    $6,%edx
     110        andl    $0xffff,%ecx
     111        addl    %ecx,%edx
     112        addl    $0x0400,%edx  # add lower 1 MB - its not count by e801 method
     113        movl    %edx,(e801memorysize)           
     114e801end:
    79115        ret
    80116
     117        #memory size in 1 kb chunks
     118e801memorysize:
     119        .long   0
    81120
    82121e820counter:
    83         .byte 0
    84                  
     122        .byte 0xff
     123
    85124e820table:
    86         .space  (32*E820_RECORD_SIZE),0 # space for 32 records, each E820_RECORD_SIZE bytes long
     125        .space  (32*E820_RECORD_SIZE),0xff # space for 32 records, each E820_RECORD_SIZE bytes long
  • arch/ia32/src/mm/frame.c

    rb4f9214 r5d721f0  
    3131#include <mm/vm.h>
    3232#include <config.h>
     33#include <arch/boot/memmap.h>
     34
     35#include <print.h>
    3336
    3437/*
     
    3740void frame_arch_init(void)
    3841{
     42        __u8 i;
     43       
    3944        if (config.cpu_active == 1) {
    4045                frame_not_free(0x0);
     
    4247                frame_region_not_free(0xa0000,0xff000);
    4348                frame_region_not_free(0xfec00000,0xffffffff);
     49               
     50                for (i=e820counter;i>0;i--) {
     51                        //printf("E820 base: %Q size: %Q type: %L \n",e820table[i-1].base_address,e820table[i-1].size,e820table[i-1].type);
     52                        if (e820table[i-1].type!=MEMMAP_MEMORY_AVAILABLE) {
     53                                frame_region_not_free(e820table[i-1].base_address,e820table[i-1].size);
     54                                }
     55                        }
    4456        }
    4557}
Note: See TracChangeset for help on using the changeset viewer.