Changeset 6323989 in mainline


Ignore:
Timestamp:
2006-03-14T09:11:07Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2d69ee6
Parents:
eebd172
Message:

ofw code cleanup
get memory map from ofw

Location:
arch/ppc32/loader
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/loader/_link.ld

    reebd172 r6323989  
    1919                *(.sbss);
    2020                *(.bss);                /* uninitialized static variables */   
     21                *(COMMON);              /* global variables */
    2122        }
    2223}
  • arch/ppc32/loader/asm.S

    reebd172 r6323989  
    182182
    183183jump_to_kernel:
     184        mr r10, r4
    184185        mtlr r3
    185186        blr
  • arch/ppc32/loader/asm.h

    reebd172 r6323989  
    3131
    3232void flush_instruction_cache(void);
    33 void jump_to_kernel(void *addr) __attribute__((noreturn));
     33void jump_to_kernel(void *code, void *memmap) __attribute__((noreturn));
    3434
    3535#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
  • arch/ppc32/loader/main.c

    reebd172 r6323989  
    2929#include "main.h"
    3030#include "printf.h"
    31 #include "ofw.h"
    3231#include "asm.h"
    3332
     
    3837#define KERNEL_SIZE ((unsigned int) KERNEL_END - (unsigned int) KERNEL_START)
    3938
     39memmap_t memmap;
     40
    4041void bootstrap(void)
    4142{
     
    4445        void *phys = ofw_translate(&start);
    4546        printf("loaded at %L (physical %L)\n", &start, phys);
     47       
     48        if (!ofw_memmap(&memmap)) {
     49                printf("Unable to get memory map\n");
     50                halt();
     51        }
     52        printf("total memory %d MB\n", memmap.total >> 20);
    4653       
    4754        // FIXME: map just the kernel
     
    6067       
    6168        flush_instruction_cache();
    62         jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS);
     69        jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, ofw_translate(&memmap));
    6370}
  • arch/ppc32/loader/main.h

    reebd172 r6323989  
    3030#define __MAIN_H__
    3131
     32#include "ofw.h"
     33
    3234extern int _binary_____________kernel_kernel_bin_start;
    3335extern int _binary_____________kernel_kernel_bin_end;
     
    3537extern void bootstrap(void);
    3638
     39extern memmap_t memmap;
     40
    3741#endif
  • arch/ppc32/loader/ofw.c

    reebd172 r6323989  
    3030#include "printf.h"
    3131
     32#define MAX_OFW_ARGS    10
     33
     34typedef unsigned int ofw_arg_t;
     35typedef unsigned int ihandle;
     36typedef unsigned int phandle;
     37
     38/** OpenFirmware command structure
     39 *
     40 */
     41typedef struct {
     42        const char *service;          /**< Command name */
     43        unsigned int nargs;           /**< Number of in arguments */
     44        unsigned int nret;            /**< Number of out arguments */
     45        ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
     46} ofw_args_t;
     47
     48typedef void (*ofw_entry)(ofw_args_t *);
     49
     50
    3251ofw_entry ofw;
    3352
     
    3756
    3857
    39 void init(void)
    40 {
    41         ofw_chosen = ofw_find_device("/chosen");
    42         if (ofw_chosen == -1)
    43                 halt();
    44        
    45         if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)     
    46                 ofw_stdout = 0;
    47        
    48         ofw_mmu = ofw_open("/mmu");
    49         if (ofw_mmu == -1) {
    50                 puts("Unable to open /mmu node\n");
    51                 halt();
    52         }
    53 }
    54 
    55 void halt(void)
    56 {
    57         ofw_call("exit", 0, 0);
    58 }
    59 
    60 
    61 int ofw_call(const char *service, const int nargs, const int nret, ...)
     58static int ofw_call(const char *service, const int nargs, const int nret, ...)
    6259{
    6360        va_list list;
     
    8380
    8481
    85 ihandle ofw_open(const char *name)
     82static phandle ofw_find_device(const char *name)
     83{
     84        return ofw_call("finddevice", 1, 1, name);
     85}
     86
     87
     88static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
     89{
     90        return ofw_call("getprop", 4, 1, device, name, buf, buflen);
     91}
     92
     93static ihandle ofw_open(const char *name)
    8694{
    8795        return ofw_call("open", 1, 1, name);
     96}
     97
     98
     99void init(void)
     100{
     101        ofw_chosen = ofw_find_device("/chosen");
     102        if (ofw_chosen == -1)
     103                halt();
     104       
     105        if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)     
     106                ofw_stdout = 0;
     107       
     108        ofw_mmu = ofw_open("/mmu");
     109        if (ofw_mmu == -1) {
     110                puts("Unable to open /mmu node\n");
     111                halt();
     112        }
     113}
     114
     115
     116void halt(void)
     117{
     118        ofw_call("exit", 0, 0);
    88119}
    89120
     
    95126       
    96127        ofw_call("write", 3, 1, ofw_stdout, str, len);
    97 }
    98 
    99 
    100 phandle ofw_find_device(const char *name)
    101 {
    102         return ofw_call("finddevice", 1, 1, name);
    103 }
    104 
    105 
    106 int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
    107 {
    108         return ofw_call("getprop", 4, 1, device, name, buf, buflen);
    109128}
    110129
     
    120139        return ofw_call("call-method", 6, 1, "map", ofw_mmu, mode, size, virt, phys);
    121140}
     141
     142
     143int ofw_memmap(memmap_t *map)
     144{
     145        int i;
     146        int ret;
     147
     148        phandle handle = ofw_find_device("/memory");
     149        if (handle == -1)
     150                return false;
     151       
     152        ret = ofw_get_property(handle, "reg", &map->zones, sizeof(map->zones));
     153        if (ret == -1)
     154                return false;
     155       
     156        map->total = 0;
     157        map->count = 0;
     158        for (i = 0; i < MEMMAP_MAX_RECORDS; i++) {
     159                if (map->zones[i].size == 0)
     160                        break;
     161                map->count++;
     162                map->total += map->zones[i].size;
     163        }
     164}
  • arch/ppc32/loader/ofw.h

    reebd172 r6323989  
    3030#define __OFW_H__
    3131
    32 #define NULL    0
    33 #define MAX_OFW_ARGS    10
     32#define NULL 0
     33#define MEMMAP_MAX_RECORDS 32
     34#define false 0
     35#define true 1
    3436
    3537typedef __builtin_va_list va_list;
     
    3941#define va_end(ap)                      __builtin_va_end(ap)
    4042
    41 typedef unsigned int ofw_arg_t;
    42 typedef unsigned int ihandle;
    43 typedef unsigned int phandle;
     43typedef struct {
     44        void *start;
     45        unsigned int size;
     46} memzone_t;
    4447
    45 /** OpenFirmware command structure
    46  *
    47  */
    4848typedef struct {
    49         const char *service;          /**< Command name */
    50         unsigned int nargs;           /**< Number of in arguments */
    51         unsigned int nret;            /**< Number of out arguments */
    52         ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
    53 } ofw_args_t;
     49        unsigned int total;
     50        unsigned int count;
     51        memzone_t zones[MEMMAP_MAX_RECORDS];
     52} memmap_t;
    5453
    55 typedef void (*ofw_entry)(ofw_args_t *);
    5654
    5755extern void init(void);
    58 void halt(void);
     56extern void halt(void);
    5957
    60 extern phandle ofw_find_device(const char *name);
    61 extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen);
    62 extern int ofw_call(const char *service, const int nargs, const int nret, ...);
    63 
    64 extern ihandle ofw_open(const char *name);
    6558extern void ofw_write(const char *str, const int len);
    6659
    6760extern void *ofw_translate(const void *virt);
    6861extern int ofw_map(const void *phys, const void *virt, const int size, const int mode);
     62extern int ofw_memmap(memmap_t *map);
    6963
    7064#endif
Note: See TracChangeset for help on using the changeset viewer.