Changeset f2ea5d8 in mainline for boot


Ignore:
Timestamp:
2006-11-17T20:21:25Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f18cc64
Parents:
282f2c9c
Message:

sparc64 code to support physical memory that starts on non-zero addresses.
Still needs to be tested on systems with such setup.

Location:
boot/arch/sparc64/loader
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • boot/arch/sparc64/loader/asm.S

    r282f2c9c rf2ea5d8  
    11#
    22# Copyright (C) 2006 Martin Decky
     3# Copyright (C) 2006 Jakub Jermar
    34# All rights reserved.
    45#
  • boot/arch/sparc64/loader/asm.h

    r282f2c9c rf2ea5d8  
    11/*
    22 * Copyright (C) 2006 Martin Decky
     3 * Copyright (C) 2006 Jakub Jermar
    34 * All rights reserved.
    45 *
     
    3031#define BOOT_sparc64_ASM_H_
    3132
    32 #define PAGE_SIZE 8192
    33 #define PAGE_WIDTH 13
     33#include "types.h"
     34#include "main.h"
     35
     36#define PAGE_SIZE       8192
     37#define PAGE_WIDTH      13
    3438
    3539#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
    3640
    3741extern void halt(void);
    38 extern void jump_to_kernel(void *entry, int bsp, void *bootinfo, unsigned int bootinfo_size) __attribute__((noreturn));
     42extern void jump_to_kernel(void *entry, uint64_t cfg, bootinfo_t *bootinfo,
     43        unsigned int bootinfo_size) __attribute__((noreturn));
    3944
    4045#endif
  • boot/arch/sparc64/loader/main.c

    r282f2c9c rf2ea5d8  
    4747        init_components(components);
    4848
     49        if (!ofw_get_physmem_start(&bootinfo.physmem_start)) {
     50                printf("Error: unable to get start of physical memory.\n");
     51                halt();
     52        }
     53
    4954        if (!ofw_memmap(&bootinfo.memmap)) {
    5055                printf("Error: unable to get memory map, halting.\n");
     
    5863       
    5964        printf("\nSystem info\n");
    60         printf(" memory: %dM\n", bootinfo.memmap.total>>20);
     65        printf(" memory: %dM starting at %P\n",
     66                bootinfo.memmap.total >> 20, bootinfo.physmem_start);
    6167
    6268        printf("\nMemory statistics\n");
     
    6672        unsigned int i;
    6773        for (i = 0; i < COMPONENTS; i++)
    68                 printf(" %P: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size);
     74                printf(" %P: %s image (size %d bytes)\n", components[i].start,
     75                        components[i].name, components[i].size);
    6976
    7077        void * base = (void *) KERNEL_VIRTUAL_ADDRESS;
     
    94101        printf("\nChecking for secondary processors...");
    95102        if (!ofw_cpu())
    96                 printf("Error: unable to get cpu properties\n");
     103                printf("Error: unable to get CPU properties\n");
    97104        printf("done.\n");
    98105
    99106        printf("\nBooting the kernel...\n");
    100         jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, 1, &bootinfo, sizeof(bootinfo));
     107        jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS,
     108                bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo, sizeof(bootinfo));
    101109}
  • boot/arch/sparc64/loader/main.h

    r282f2c9c rf2ea5d8  
    3939#define TASKMAP_MAX_RECORDS 32
    4040
     41#define BSP_PROCESSOR   1
     42#define AP_PROCESSOR    0
     43
    4144typedef struct {
    4245        void *addr;
     
    5053
    5154typedef struct {
     55        uintptr_t physmem_start;
    5256        taskmap_t taskmap;
    5357        memmap_t memmap;
     
    5660} bootinfo_t;
    5761
     62extern bootinfo_t bootinfo;
     63
    5864extern void start(void);
    5965extern void bootstrap(void);
  • boot/arch/sparc64/loader/ofwarch.c

    r282f2c9c rf2ea5d8  
    11/*
    22 * Copyright (C) 2005 Martin Decky
     3 * Copyright (C) 2006 Jakub Jermar
    34 * All rights reserved.
    45 *
     
    3839#include <register.h>
    3940#include "main.h"
     41#include "asm.h"
    4042
    4143void write(const char *str, const int len)
     
    8688                                         * Start secondary processor.
    8789                                         */
    88                                         (void) ofw_call("SUNW,start-cpu", 3, 1, NULL, node, KERNEL_VIRTUAL_ADDRESS, 0);
     90                                        (void) ofw_call("SUNW,start-cpu", 3, 1, NULL, node,
     91                                                 KERNEL_VIRTUAL_ADDRESS,
     92                                                 bootinfo.physmem_start | AP_PROCESSOR);
    8993                                }
    9094                        }
     
    9498        return cpus;
    9599}
     100
     101/** Get physical memory starting address.
     102 *
     103 * @param start Pointer to variable where the physical memory starting
     104 *              address will be stored.
     105 *
     106 * @return Non-zero on succes, zero on failure.
     107 */
     108int ofw_get_physmem_start(uintptr_t *start)
     109{
     110        uint32_t memreg[4];
     111
     112        if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0)
     113                return 0;
     114
     115        *start = (((uint64_t) memreg[0]) << 32) | memreg[1];
     116        return 1;
     117}
     118
  • boot/arch/sparc64/loader/ofwarch.h

    r282f2c9c rf2ea5d8  
    3131
    3232#include "main.h"
     33#include "types.h"
    3334
    3435#define OFW_ADDRESS_CELLS       2
     
    3637
    3738extern int ofw_cpu(void);
     39extern int ofw_get_physmem_start(uintptr_t *start);
    3840
    3941#endif
Note: See TracChangeset for help on using the changeset viewer.