Changes in / [bc7d44c:207e208e] in mainline


Ignore:
Files:
6 deleted
62 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    rbc7d44c r207e208e  
    273273
    274274% OpenFirmware tree support
    275 ! [PLATFORM=ppc32|PLATFORM=sparc64] CONFIG_OFW_TREE (y)
    276 
    277 % OpenFirmware PCI bus support
    278 ! [PLATFORM=sparc64] CONFIG_OFW_PCI (y)
     275! [PLATFORM=sparc64] CONFIG_OFW_TREE (y)
    279276
    280277% Multiboot standard support
  • boot/arch/arm32/loader/asm.h

    rbc7d44c r207e208e  
    4040
    4141
     42/** Copies cnt bytes from dst to src.
     43 *
     44 * @param dst Destination address.
     45 * @param src Source address.
     46 * @param cnt Count of bytes to be copied.
     47 */
     48#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt))
     49
     50
    4251/** Called when the CPU is switched on.
    4352 *
  • boot/arch/arm32/loader/main.c

    rbc7d44c r207e208e  
    4343#include <macros.h>
    4444#include <string.h>
    45 #include <memstr.h>
    4645
    4746#include "mm.h"
  • boot/arch/ia64/loader/asm.h

    rbc7d44c r207e208e  
    3434#include "main.h"
    3535
    36 #define PAGE_WIDTH  14
    37 #define PAGE_SIZE   (1 << PAGE_WIDTH)
     36#define PAGE_WIDTH      14
     37#define PAGE_SIZE       (1 << PAGE_WIDTH)
    3838
    39 #define BALLOC_MAX_SIZE  (128 * 1024)
     39#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
    4040
    4141extern void halt(void);
     42/*extern void jump_to_kernel(void *entry, uint64_t cfg, bootinfo_t *bootinfo,
     43        unsigned int bootinfo_size) __attribute__((noreturn));*/
     44
    4245extern void jump_to_kernel(void *) __attribute__((noreturn));
    4346
  • boot/arch/ia64/loader/main.h

    rbc7d44c r207e208e  
    3434
    3535
    36 #define CONFIG_INIT_TASKS  32
     36#define CONFIG_INIT_TASKS       32
     37
     38
    3739
    3840extern void start(void);
  • boot/arch/mips32/loader/asm.h

    rbc7d44c r207e208e  
    3333#define PAGE_WIDTH  14
    3434
     35#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
     36
    3537void jump_to_kernel(void *entry, void *bootinfo) __attribute__((noreturn));
    3638
  • boot/arch/mips32/loader/main.c

    rbc7d44c r207e208e  
    2727 */
    2828
    29 #include "main.h"
     29#include "main.h" 
    3030#include <printf.h>
    3131#include <align.h>
    3232#include <macros.h>
    3333#include <string.h>
    34 #include <memstr.h>
    3534#include "msim.h"
    3635#include "asm.h"
  • boot/arch/ppc32/loader/Makefile

    rbc7d44c r207e208e  
    6262SOURCES = \
    6363        main.c \
     64        ofwarch.c \
    6465        _components.c \
     66        ../../../genarch/ofw.c \
    6567        ../../../generic/printf.c \
    6668        ../../../generic/string.c \
    67         ../../../genarch/balloc.c \
    68         ../../../genarch/ofw.c \
    69         ../../../genarch/ofw_tree.c \
    70         ofwarch.c \
    7169        asm.S \
    7270        boot.S
     
    7573        $(KERNELDIR)/kernel.bin \
    7674        $(USPACEDIR)/srv/ns/ns \
     75        $(USPACEDIR)/srv/loader/loader \
    7776        $(USPACEDIR)/app/init/init \
    78         $(USPACEDIR)/srv/loader/loader \
    7977        $(USPACEDIR)/srv/devmap/devmap \
    8078        $(USPACEDIR)/srv/bd/rd/rd \
     
    10199        $(USPACEDIR)/app/tester/tester \
    102100        $(USPACEDIR)/app/trace/trace \
    103         $(USPACEDIR)/app/bdsh/bdsh \
    104         $(USPACEDIR)/app/klog/klog
     101        $(USPACEDIR)/app/klog/klog \
     102        $(USPACEDIR)/app/bdsh/bdsh
    105103
    106104OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
  • boot/arch/ppc32/loader/_link.ld.in

    rbc7d44c r207e208e  
    1919[[COMPONENTS]]
    2020        }
    21        
    22         /DISCARD/ : {
    23                 *(.comment);
    24                 *(.note*);
    25         }
    2621}
  • boot/arch/ppc32/loader/asm.S

    rbc7d44c r207e208e  
    2929#include "asm.h"
    3030#include "regname.h"
    31 #include "ofwarch.h"
    3231
    3332.macro SMC_COHERENCY addr
     
    4645
    4746.macro TLB_FLUSH reg
    48         li \reg, 0
    49         sync
    50        
    51         .rept 64
    52                 tlbie \reg
    53                 addi \reg, \reg, 0x1000
    54         .endr
    55        
    56         eieio
    57         tlbsync
    58         sync
     47        tlbie \reg
     48        addi \reg, \reg, 0x1000
    5949.endm
    6050
     
    6454.global memcpy
    6555.global jump_to_kernel
    66 .global balloc_base
    6756
    6857halt:
     
    7362        addi r6, r3, -4
    7463        addi r4, r4, -4
    75         beq 2f
     64        beq     2f
    7665       
    7766        andi. r0, r6, 3
     
    8069       
    8170        1:
    82                 lwz r7, 4(r4)
    83                 lwzu r8, 8(r4)
    84                 stw r7, 4(r6)
    85                 stwu r8, 8(r6)
    86                 bdnz 1b
    87                
    88                 andi. r5, r5, 7
     71       
     72        lwz r7, 4(r4)
     73        lwzu r8, 8(r4)
     74        stw r7, 4(r6)
     75        stwu r8, 8(r6)
     76        bdnz 1b
     77       
     78        andi. r5, r5, 7
    8979       
    9080        2:
    91                 cmplwi 0, r5, 4
    92                 blt 3f
    93                
    94                 lwzu r0, 4(r4)
    95                 addi r5, r5, -4
    96                 stwu r0, 4(r6)
     81       
     82        cmplwi 0, r5, 4
     83        blt 3f
     84       
     85        lwzu r0, 4(r4)
     86        addi r5, r5, -4
     87        stwu r0, 4(r6)
    9788       
    9889        3:
    99                 cmpwi 0, r5, 0
    100                 beqlr
    101                 mtctr r5
    102                 addi r4, r4, 3
    103                 addi r6, r6, 3
     90       
     91        cmpwi 0, r5, 0
     92        beqlr
     93        mtctr r5
     94        addi r4, r4, 3
     95        addi r6, r6, 3
    10496       
    10597        4:
    106                 lbzu r0, 1(r4)
    107                 stbu r0, 1(r6)
    108                 bdnz 4b
    109                 blr
     98       
     99        lbzu r0, 1(r4)
     100        stbu r0, 1(r6)
     101        bdnz 4b
     102        blr
    110103       
    111104        5:
    112                 subfic r0, r0, 4
    113                 mtctr r0
     105       
     106        subfic r0, r0, 4
     107        mtctr r0
    114108       
    115109        6:
    116                 lbz r7, 4(r4)
    117                 addi r4, r4, 1
    118                 stb r7, 4(r6)
    119                 addi r6, r6, 1
    120                 bdnz 6b
    121                 subf r5, r0, r5
    122                 rlwinm. r7, r5, 32-3, 3, 31
    123                 beq 2b
    124                 mtctr r7
    125                 b 1b
     110       
     111        lbz r7, 4(r4)
     112        addi r4, r4, 1
     113        stb r7, 4(r6)
     114        addi r6, r6, 1
     115        bdnz 6b
     116        subf r5, r0, r5
     117        rlwinm. r7, r5, 32-3, 3, 31
     118        beq 2b
     119        mtctr r7
     120        b 1b
     121
    126122
    127123jump_to_kernel:
     
    132128        # r6 = bytes to copy
    133129        # r7 = real_mode (pa)
     130        # r8 = framebuffer (pa)
     131        # r9 = scanline
    134132       
    135133        # disable interrupts
     
    155153        rfi
    156154
    157 .align PAGE_WIDTH
    158 balloc_base:
    159         .fill BALLOC_MAX_SIZE
    160 
    161155.section REALMODE, "ax"
    162 
    163156.align PAGE_WIDTH
    164157.global real_mode
     158
    165159real_mode:
    166160       
    167161        # copy kernel to proper location
    168162        #
    169         # r3 = bootinfo (pa)
    170         # r4 = bootinfo_size
    171163        # r5 = trans (pa)
    172164        # r6 = bytes to copy
     165        # r8 = framebuffer (pa)
     166        # r9 = scanline
    173167       
    174168        li r31, PAGE_SIZE >> 2
     
    349343        # flush TLB
    350344       
    351         TLB_FLUSH r31
     345        li r31, 0
     346        sync
     347       
     348        TLB_FLUSH r31
     349        TLB_FLUSH r31
     350        TLB_FLUSH r31
     351        TLB_FLUSH r31
     352        TLB_FLUSH r31
     353        TLB_FLUSH r31
     354        TLB_FLUSH r31
     355        TLB_FLUSH r31
     356       
     357        TLB_FLUSH r31
     358        TLB_FLUSH r31
     359        TLB_FLUSH r31
     360        TLB_FLUSH r31
     361        TLB_FLUSH r31
     362        TLB_FLUSH r31
     363        TLB_FLUSH r31
     364        TLB_FLUSH r31
     365       
     366        TLB_FLUSH r31
     367        TLB_FLUSH r31
     368        TLB_FLUSH r31
     369        TLB_FLUSH r31
     370        TLB_FLUSH r31
     371        TLB_FLUSH r31
     372        TLB_FLUSH r31
     373        TLB_FLUSH r31
     374       
     375        TLB_FLUSH r31
     376        TLB_FLUSH r31
     377        TLB_FLUSH r31
     378        TLB_FLUSH r31
     379        TLB_FLUSH r31
     380        TLB_FLUSH r31
     381        TLB_FLUSH r31
     382        TLB_FLUSH r31
     383       
     384        TLB_FLUSH r31
     385        TLB_FLUSH r31
     386        TLB_FLUSH r31
     387        TLB_FLUSH r31
     388        TLB_FLUSH r31
     389        TLB_FLUSH r31
     390        TLB_FLUSH r31
     391        TLB_FLUSH r31
     392       
     393        TLB_FLUSH r31
     394        TLB_FLUSH r31
     395        TLB_FLUSH r31
     396        TLB_FLUSH r31
     397        TLB_FLUSH r31
     398        TLB_FLUSH r31
     399        TLB_FLUSH r31
     400        TLB_FLUSH r31
     401       
     402        TLB_FLUSH r31
     403        TLB_FLUSH r31
     404        TLB_FLUSH r31
     405        TLB_FLUSH r31
     406        TLB_FLUSH r31
     407        TLB_FLUSH r31
     408        TLB_FLUSH r31
     409        TLB_FLUSH r31
     410       
     411        TLB_FLUSH r31
     412        TLB_FLUSH r31
     413        TLB_FLUSH r31
     414        TLB_FLUSH r31
     415        TLB_FLUSH r31
     416        TLB_FLUSH r31
     417        TLB_FLUSH r31
     418        TLB_FLUSH r31
     419       
     420        eieio
     421        tlbsync
     422        sync
    352423       
    353424        # start the kernel
    354425        #
    355         # pc = PA2KA(BOOT_OFFSET)
     426        # pc = KERNEL_START_ADDR
    356427        # r3 = bootinfo (pa)
    357         # sprg0 = BOOT_OFFSET
     428        # sprg0 = KA2PA(KERNEL_START_ADDR)
    358429        # sprg3 = physical memory size
    359430        # sp = 0 (pa)
    360431       
    361         lis r31, PA2KA(BOOT_OFFSET)@ha
    362         addi r31, r31, PA2KA(BOOT_OFFSET)@l
     432        lis r31, KERNEL_START_ADDR@ha
     433        addi r31, r31, KERNEL_START_ADDR@l
     434       
    363435        mtspr srr0, r31
    364436       
    365         lis r31, BOOT_OFFSET@ha
    366         addi r31, r31, BOOT_OFFSET@l
     437        subis r31, r31, 0x8000
    367438        mtsprg0 r31
    368439       
     
    383454.global trans
    384455trans:
    385         .rept TRANS_SIZE
    386         .int 0
    387         .endr
     456        .space (TRANS_SIZE * TRANS_ITEM_SIZE)
  • boot/arch/ppc32/loader/asm.h

    rbc7d44c r207e208e  
    3030#define BOOT_ppc32_ASM_H_
    3131
    32 #define PAGE_WIDTH  12
    33 #define PAGE_SIZE   (1 << PAGE_WIDTH)
     32#define PAGE_SIZE 4096
     33#define PAGE_WIDTH 12
    3434
    35 #define TRANS_SIZE   1024
    36 #define BOOT_OFFSET  0x8000
     35#define TRANS_SIZE 1024
     36#define TRANS_ITEM_SIZE 4
    3737
    38 #define BALLOC_MAX_SIZE  (128 * 1024)
     38#define KERNEL_START_ADDR 0x80008000
    3939
    4040#ifndef __ASM__
    4141
    42 #include "types.h"
    43 #include "main.h"
    44 #include "ofwarch.h"
     42#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
    4543
    46 #define PA2KA(x)  (((uintptr_t) (x)) + 0x80000000)
    47 
    48 extern uint8_t balloc_base[BALLOC_MAX_SIZE];
    49 extern uintptr_t trans[TRANS_SIZE];
     44extern void *trans[TRANS_SIZE];
    5045
    5146extern void halt();
    52 extern void jump_to_kernel(void *bootinfo, unsigned int bootinfo_size,
    53     uintptr_t trans[], unsigned int kernel_size, void *real_mode) __attribute__((noreturn));
     47extern void jump_to_kernel(void *bootinfo, unsigned int bootinfo_size, void *trans, unsigned int kernel_size, void *real_mode, void *fb, unsigned int scanline) __attribute__((noreturn));
    5448extern void real_mode();
    55 
    56 #else
    57 
    58 #define PA2KA(x)  ((x) + 0x80000000)
    5949
    6050#endif
  • boot/arch/ppc32/loader/main.c

    rbc7d44c r207e208e  
    2727 */
    2828
     29#include "main.h"
    2930#include <printf.h>
     31#include "asm.h"
     32#include "_components.h"
    3033#include <ofw.h>
    3134#include <align.h>
    3235#include <macros.h>
    3336#include <string.h>
    34 #include "main.h"
    35 #include "asm.h"
    36 #include "_components.h"
    3737
    38 static bootinfo_t bootinfo;
    39 static component_t components[COMPONENTS];
    40 static char *release = STRING(RELEASE);
     38#define HEAP_GAP 1024000
     39
     40bootinfo_t bootinfo;
     41
     42
     43static void check_align(const void *addr, const char *desc)
     44{
     45        if ((unsigned int) addr % PAGE_SIZE != 0) {
     46                printf("Error: %s not on page boundary, halting.\n", desc);
     47                halt();
     48        }
     49}
     50
     51
     52static void fix_overlap(void *va, void **pa, const char *desc, unsigned int *top)
     53{
     54        if ((unsigned int) *pa + PAGE_SIZE < *top) {
     55                printf("Warning: %s overlaps kernel physical area\n", desc);
     56               
     57                void *new_va = (void *) (ALIGN_UP((unsigned int) KERNEL_END + HEAP_GAP, PAGE_SIZE) + *top);
     58                void *new_pa = (void *) (HEAP_GAP + *top);
     59                *top += PAGE_SIZE;
     60               
     61                if (ofw_map(new_pa, new_va, PAGE_SIZE, 0) != 0) {
     62                        printf("Error: Unable to map page aligned memory at %L (physical %L), halting.\n", new_va, new_pa);
     63                        halt();
     64                }
     65               
     66                if ((unsigned int) new_pa + PAGE_SIZE < KERNEL_SIZE) {
     67                        printf("Error: %s cannot be relocated, halting.\n", desc);
     68                        halt();
     69                }
     70               
     71                printf("Relocating %L -> %L (physical %L -> %L)\n", va, new_va, *pa, new_pa);
     72                *pa = new_pa;
     73                memcpy(new_va, va, PAGE_SIZE);
     74        }
     75}
     76
     77char *release = STRING(RELEASE);
    4178
    4279#ifdef REVISION
    43         static char *revision = ", revision " STRING(REVISION);
     80        char *revision = ", revision " STRING(REVISION);
    4481#else
    45         static char *revision = "";
     82        char *revision = "";
    4683#endif
    4784
    4885#ifdef TIMESTAMP
    49         static char *timestamp = "\nBuilt on " STRING(TIMESTAMP);
     86        char *timestamp = "\nBuilt on " STRING(TIMESTAMP);
    5087#else
    51         static char *timestamp = "";
     88        char *timestamp = "";
    5289#endif
    5390
     
    5592static void version_print(void)
    5693{
    57         printf("HelenOS PPC32 Bootloader\nRelease %s%s%s\n"
    58             "Copyright (c) 2006 HelenOS project\n\n",
    59             release, revision, timestamp);
    60 }
    61 
    62 static void check_align(const void *addr, const char *desc)
    63 {
    64         if ((uintptr_t) addr % PAGE_SIZE != 0) {
    65                 printf("Error: %s not on page boundary, halting.\n", desc);
    66                 halt();
    67         }
    68 }
    69 
    70 static void check_overlap(const void *pa, const char *desc, const uintptr_t top)
    71 {
    72         if ((uintptr_t) pa + PAGE_SIZE < top) {
    73                 printf("Error: %s overlaps destination physical area\n", desc);
    74                 halt();
    75         }
     94        printf("HelenOS PPC32 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n\n", release, revision, timestamp);
    7695}
    7796
     
    7998{
    8099        version_print();
     100       
     101        component_t components[COMPONENTS];
    81102        init_components(components);
     103               
     104        unsigned int i;
     105        for (i = 0; i < COMPONENTS; i++)
     106                check_align(components[i].start, components[i].name);
     107       
     108        check_align(&real_mode, "bootstrap trampoline");
     109        check_align(&trans, "translation table");
    82110       
    83111        if (!ofw_memmap(&bootinfo.memmap)) {
     
    91119        }
    92120       
    93         check_align(&real_mode, "bootstrap trampoline");
    94         check_align(trans, "translation table");
    95         check_align(balloc_base, "boot allocations");
     121        if (!ofw_screen(&bootinfo.screen))
     122                printf("Warning: Unable to get screen properties.\n");
    96123       
    97         unsigned int i;
    98         for (i = 0; i < COMPONENTS; i++)
    99                 check_align(components[i].start, components[i].name);
     124        if (!ofw_macio(&bootinfo.macio))
     125                printf("Warning: Unable to get macio properties.\n");
    100126       
     127        printf("Device statistics\n");
     128       
     129        if (bootinfo.screen.addr)
     130                printf(" screen at %L, resolution %dx%d, %d bpp (scanline %d bytes)\n", bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.bpp, bootinfo.screen.scanline);
     131       
     132        if (bootinfo.macio.addr)
     133                printf(" macio at %L (size %d bytes)\n", bootinfo.macio.addr, bootinfo.macio.size);
     134       
     135        void *real_mode_pa = ofw_translate(&real_mode);
     136        void *trans_pa = ofw_translate(&trans);
    101137        void *bootinfo_pa = ofw_translate(&bootinfo);
    102         void *real_mode_pa = ofw_translate(&real_mode);
    103         void *trans_pa = ofw_translate(trans);
    104         void *balloc_base_pa = ofw_translate(balloc_base);
    105138       
    106         printf("Memory statistics (total %d MB)\n", bootinfo.memmap.total >> 20);
     139        printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20);
    107140        printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa);
    108141        printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa);
    109         printf(" %L: translation table (physical %L)\n", trans, trans_pa);
    110         printf(" %L: boot allocations (physical %L)\n", balloc_base, balloc_base_pa);
     142        printf(" %L: translation table (physical %L)\n", &trans, trans_pa);
    111143        for (i = 0; i < COMPONENTS; i++)
    112144                printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size);
    113145       
    114         uintptr_t top = 0;
     146        unsigned int top = 0;
    115147        for (i = 0; i < COMPONENTS; i++)
    116148                top += ALIGN_UP(components[i].size, PAGE_SIZE);
    117         top += ALIGN_UP(BALLOC_MAX_SIZE, PAGE_SIZE);
    118        
    119         if (top >= TRANS_SIZE * PAGE_SIZE) {
    120                 printf("Error: boot image is too large\n");
    121                 halt();
    122         }
    123        
    124         check_overlap(bootinfo_pa, "boot info", top);
    125         check_overlap(real_mode_pa, "bootstrap trampoline", top);
    126         check_overlap(trans_pa, "translation table", top);
    127149       
    128150        unsigned int pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
     
    130152        for (i = 0; i < pages; i++) {
    131153                void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH));
    132                 check_overlap(pa, "kernel", top);
    133                 trans[i] = (uintptr_t) pa;
     154                fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top);
     155                trans[i] = pa;
    134156        }
    135157       
    136158        bootinfo.taskmap.count = 0;
    137159        for (i = 1; i < COMPONENTS; i++) {
    138                 if (bootinfo.taskmap.count == TASKMAP_MAX_RECORDS) {
    139                         printf("\nSkipping superfluous components.\n");
    140                         break;
    141                 }
    142                
    143160                unsigned int component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH;
    144161                unsigned int j;
     
    146163                for (j = 0; j < component_pages; j++) {
    147164                        void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH));
    148                         check_overlap(pa, components[i].name, top);
    149                         trans[pages + j] = (uintptr_t) pa;
     165                        fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top);
     166                        trans[pages + j] = pa;
    150167                        if (j == 0) {
    151                                
    152                                 bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) PA2KA(pages << PAGE_WIDTH);
     168                                bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH);
    153169                                bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size;
    154170                                strncpy(bootinfo.taskmap.tasks[bootinfo.taskmap.count].name,
    155171                                    components[i].name, BOOTINFO_TASK_NAME_BUFLEN);
    156                                
     172
    157173                                bootinfo.taskmap.count++;
    158174                        }
     
    162178        }
    163179       
    164         uintptr_t balloc_kernel_base = PA2KA(pages << PAGE_WIDTH);
    165         unsigned int balloc_pages = ALIGN_UP(BALLOC_MAX_SIZE, PAGE_SIZE) >> PAGE_WIDTH;
    166         for (i = 0; i < balloc_pages; i++) {
    167                 void *pa = ofw_translate(balloc_base + (i << PAGE_WIDTH));
    168                 check_overlap(pa, "boot allocations", top);
    169                 trans[pages + i] = (uintptr_t) pa;
    170         }
    171        
    172         pages += balloc_pages;
    173        
    174         balloc_init(&bootinfo.ballocs, (uintptr_t) balloc_base, balloc_kernel_base);
    175         printf("\nCanonizing OpenFirmware device tree...");
    176         bootinfo.ofw_root = ofw_tree_build();
    177         printf("done.\n");
     180        fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top);
     181        fix_overlap(&trans, &trans_pa, "translation table", &top);
     182        fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top);
    178183       
    179184        ofw_setup_palette();
    180185       
    181186        printf("\nBooting the kernel...\n");
    182         jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, real_mode_pa);
     187        jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, real_mode_pa, (void *) bootinfo.screen.addr, bootinfo.screen.scanline);
    183188}
  • boot/arch/ppc32/loader/main.h

    rbc7d44c r207e208e  
    3030#define BOOT_ppc32_MAIN_H_
    3131
    32 #include <ofw.h>
    33 #include <ofw_tree.h>
    34 #include <balloc.h>
    35 #include <types.h>
     32#include "ofw.h"
    3633
    37 #define TASKMAP_MAX_RECORDS  32
     34#define TASKMAP_MAX_RECORDS 32
    3835
    3936/** Size of buffer for storing task name in task_t. */
    40 #define BOOTINFO_TASK_NAME_BUFLEN  32
     37#define BOOTINFO_TASK_NAME_BUFLEN 32
    4138
     39/** Struct holding information about single loaded task. */
    4240typedef struct {
     41        /** Address where the task was placed. */
    4342        void *addr;
    44         uint32_t size;
     43        /** Size of the task's binary. */
     44        unsigned int size;
     45        /** Task name. */
    4546        char name[BOOTINFO_TASK_NAME_BUFLEN];
    4647} task_t;
    4748
    4849typedef struct {
    49         uint32_t count;
     50        unsigned int count;
    5051        task_t tasks[TASKMAP_MAX_RECORDS];
    5152} taskmap_t;
     
    5455        memmap_t memmap;
    5556        taskmap_t taskmap;
    56         ballocs_t ballocs;
    57         ofw_tree_node_t *ofw_root;
     57        screen_t screen;
     58        macio_t macio;
    5859} bootinfo_t;
    5960
     
    6162extern void bootstrap(void);
    6263
     64extern memmap_t memmap;
     65
    6366#endif
  • boot/arch/ppc32/loader/ofwarch.c

    rbc7d44c r207e208e  
    3131#include <printf.h>
    3232
    33 typedef int (*ofw_entry_t)(ofw_args_t *args);
     33typedef int (* ofw_entry_t)(ofw_args_t *args);
    3434
    3535int ofw(ofw_args_t *args)
     
    4949}
    5050
     51int ofw_macio(macio_t *macio)
     52{
     53        char device_name[BUF_SIZE];
     54       
     55        if ((ofw_get_property(ofw_aliases, "macio", device_name, sizeof(device_name)) <= 0)
     56            && (ofw_get_property(ofw_aliases, "mac-io", device_name, sizeof(device_name)) <= 0))
     57                return false;
     58       
     59        phandle device = ofw_find_device(device_name);
     60        if (device == -1)
     61                return false;
     62       
     63        pci_reg_t pci_reg;
     64        if (ofw_get_property(device, "assigned-addresses", &pci_reg, sizeof(pci_reg)) <= 0)
     65                return false;
     66       
     67        macio->addr = (void *) pci_reg.addr.addr_lo;
     68        macio->size = pci_reg.size_lo;
     69
     70        return true;
     71}
     72
    5173int ofw_translate_failed(ofw_arg_t flag)
    5274{
    53         /* PearPC returns buggy flag */
    5475        return 0;
    5576}
  • boot/arch/ppc32/loader/ofwarch.h

    rbc7d44c r207e208e  
    3030#define BOOT_ppc32_OFWARCH_H_
    3131
    32 #define OFW_ADDRESS_CELLS  1
    33 #define OFW_SIZE_CELLS     1
     32#define OFW_ADDRESS_CELLS       1
     33#define OFW_SIZE_CELLS          1
    3434
    3535#endif
  • boot/arch/ppc32/loader/regname.h

    rbc7d44c r207e208e  
    3131
    3232/* Condition Register Bit Fields */
    33 #define cr0  0
    34 #define cr1  1
    35 #define cr2  2
    36 #define cr3  3
    37 #define cr4  4
    38 #define cr5  5
    39 #define cr6  6
    40 #define cr7  7
     33#define cr0     0
     34#define cr1     1
     35#define cr2     2
     36#define cr3     3
     37#define cr4     4
     38#define cr5     5
     39#define cr6     6
     40#define cr7     7
    4141
    4242/* General Purpose Registers (GPRs) */
    43 #define r0   0
    44 #define r1   1
    45 #define r2   2
    46 #define r3   3
    47 #define r4   4
    48 #define r5   5
    49 #define r6   6
    50 #define r7   7
    51 #define r8   8
    52 #define r9   9
    53 #define r10  10
    54 #define r11  11
    55 #define r12  12
    56 #define r13  13
    57 #define r14  14
    58 #define r15  15
    59 #define r16  16
    60 #define r17  17
    61 #define r18  18
    62 #define r19  19
    63 #define r20  20
    64 #define r21  21
    65 #define r22  22
    66 #define r23  23
    67 #define r24  24
    68 #define r25  25
    69 #define r26  26
    70 #define r27  27
    71 #define r28  28
    72 #define r29  29
    73 #define r30  30
    74 #define r31  31
     43#define r0      0
     44#define r1      1
     45#define r2      2
     46#define r3      3
     47#define r4      4
     48#define r5      5
     49#define r6      6
     50#define r7      7
     51#define r8      8
     52#define r9      9
     53#define r10     10
     54#define r11     11
     55#define r12     12
     56#define r13     13
     57#define r14     14
     58#define r15     15
     59#define r16     16
     60#define r17     17
     61#define r18     18
     62#define r19     19
     63#define r20     20
     64#define r21     21
     65#define r22     22
     66#define r23     23
     67#define r24     24
     68#define r25     25
     69#define r26     26
     70#define r27     27
     71#define r28     28
     72#define r29     29
     73#define r30     30
     74#define r31     31
    7575
    7676/* GPR Aliases */
    77 #define sp  1
     77#define sp      1
    7878
    7979/* Floating Point Registers (FPRs) */
    80 #define fr0   0
    81 #define fr1   1
    82 #define fr2   2
    83 #define fr3   3
    84 #define fr4   4
    85 #define fr5   5
    86 #define fr6   6
    87 #define fr7   7
    88 #define fr8   8
    89 #define fr9   9
    90 #define fr10  10
    91 #define fr11  11
    92 #define fr12  12
    93 #define fr13  13
    94 #define fr14  14
    95 #define fr15  15
    96 #define fr16  16
    97 #define fr17  17
    98 #define fr18  18
    99 #define fr19  19
    100 #define fr20  20
    101 #define fr21  21
    102 #define fr22  22
    103 #define fr23  23
    104 #define fr24  24
    105 #define fr25  25
    106 #define fr26  26
    107 #define fr27  27
    108 #define fr28  28
    109 #define fr29  29
    110 #define fr30  30
    111 #define fr31  31
    112 
    113 #define vr0   0
    114 #define vr1   1
    115 #define vr2   2
    116 #define vr3   3
    117 #define vr4   4
    118 #define vr5   5
    119 #define vr6   6
    120 #define vr7   7
    121 #define vr8   8
    122 #define vr9   9
    123 #define vr10  10
    124 #define vr11  11
    125 #define vr12  12
    126 #define vr13  13
    127 #define vr14  14
    128 #define vr15  15
    129 #define vr16  16
    130 #define vr17  17
    131 #define vr18  18
    132 #define vr19  19
    133 #define vr20  20
    134 #define vr21  21
    135 #define vr22  22
    136 #define vr23  23
    137 #define vr24  24
    138 #define vr25  25
    139 #define vr26  26
    140 #define vr27  27
    141 #define vr28  28
    142 #define vr29  29
    143 #define vr30  30
    144 #define vr31  31
    145 
    146 #define evr0   0
    147 #define evr1   1
    148 #define evr2   2
    149 #define evr3   3
    150 #define evr4   4
    151 #define evr5   5
    152 #define evr6   6
    153 #define evr7   7
    154 #define evr8   8
    155 #define evr9   9
    156 #define evr10  10
    157 #define evr11  11
    158 #define evr12  12
    159 #define evr13  13
    160 #define evr14  14
    161 #define evr15  15
    162 #define evr16  16
    163 #define evr17  17
    164 #define evr18  18
    165 #define evr19  19
    166 #define evr20  20
    167 #define evr21  21
    168 #define evr22  22
    169 #define evr23  23
    170 #define evr24  24
    171 #define evr25  25
    172 #define evr26  26
    173 #define evr27  27
    174 #define evr28  28
    175 #define evr29  29
    176 #define evr30  30
    177 #define evr31  31
     80#define fr0             0
     81#define fr1             1
     82#define fr2             2
     83#define fr3             3
     84#define fr4             4
     85#define fr5             5
     86#define fr6             6
     87#define fr7             7
     88#define fr8             8
     89#define fr9             9
     90#define fr10    10
     91#define fr11    11
     92#define fr12    12
     93#define fr13    13
     94#define fr14    14
     95#define fr15    15
     96#define fr16    16
     97#define fr17    17
     98#define fr18    18
     99#define fr19    19
     100#define fr20    20
     101#define fr21    21
     102#define fr22    22
     103#define fr23    23
     104#define fr24    24
     105#define fr25    25
     106#define fr26    26
     107#define fr27    27
     108#define fr28    28
     109#define fr29    29
     110#define fr30    30
     111#define fr31    31
     112
     113#define vr0             0
     114#define vr1             1
     115#define vr2             2
     116#define vr3             3
     117#define vr4             4
     118#define vr5             5
     119#define vr6             6
     120#define vr7             7
     121#define vr8             8
     122#define vr9             9
     123#define vr10    10
     124#define vr11    11
     125#define vr12    12
     126#define vr13    13
     127#define vr14    14
     128#define vr15    15
     129#define vr16    16
     130#define vr17    17
     131#define vr18    18
     132#define vr19    19
     133#define vr20    20
     134#define vr21    21
     135#define vr22    22
     136#define vr23    23
     137#define vr24    24
     138#define vr25    25
     139#define vr26    26
     140#define vr27    27
     141#define vr28    28
     142#define vr29    29
     143#define vr30    30
     144#define vr31    31
     145
     146#define evr0    0
     147#define evr1    1
     148#define evr2    2
     149#define evr3    3
     150#define evr4    4
     151#define evr5    5
     152#define evr6    6
     153#define evr7    7
     154#define evr8    8
     155#define evr9    9
     156#define evr10   10
     157#define evr11   11
     158#define evr12   12
     159#define evr13   13
     160#define evr14   14
     161#define evr15   15
     162#define evr16   16
     163#define evr17   17
     164#define evr18   18
     165#define evr19   19
     166#define evr20   20
     167#define evr21   21
     168#define evr22   22
     169#define evr23   23
     170#define evr24   24
     171#define evr25   25
     172#define evr26   26
     173#define evr27   27
     174#define evr28   28
     175#define evr29   29
     176#define evr30   30
     177#define evr31   31
    178178
    179179/* Special Purpose Registers (SPRs) */
    180 #define xer      1
    181 #define lr       8
    182 #define ctr      9
    183 #define dec      22
    184 #define sdr1     25
    185 #define srr0     26
    186 #define srr1     27
    187 #define sprg0    272
    188 #define sprg1    273
    189 #define sprg2    274
    190 #define sprg3    275
    191 #define prv      287
    192 #define ibat0u   528
    193 #define ibat0l   529
    194 #define ibat1u   530
    195 #define ibat1l   531
    196 #define ibat2u   532
    197 #define ibat2l   533
    198 #define ibat3u   534
    199 #define ibat3l   535
    200 #define dbat0u   536
    201 #define dbat0l   537
    202 #define dbat1u   538
    203 #define dbat1l   539
    204 #define dbat2u   540
    205 #define dbat2l   541
    206 #define dbat3u   542
    207 #define dbat3l   543
    208 #define tlbmiss  980
    209 #define ptehi    981
    210 #define ptelo    982
    211 #define hid0     1008
     180#define xer             1
     181#define lr              8
     182#define ctr             9
     183#define dec             22
     184#define sdr1    25
     185#define srr0    26
     186#define srr1    27
     187#define sprg0   272
     188#define sprg1   273
     189#define sprg2   274
     190#define sprg3   275
     191#define prv             287
     192#define ibat0u  528
     193#define ibat0l  529
     194#define ibat1u  530
     195#define ibat1l  531
     196#define ibat2u  532
     197#define ibat2l  533
     198#define ibat3u  534
     199#define ibat3l  535
     200#define dbat0u  536
     201#define dbat0l  537
     202#define dbat1u  538
     203#define dbat1l  539
     204#define dbat2u  540
     205#define dbat2l  541
     206#define dbat3u  542
     207#define dbat3l  543
     208#define hid0    1008
    212209
    213210/* MSR bits */
    214 #define msr_dr  (1 << 4)
    215 #define msr_ir  (1 << 5)
    216 #define msr_pr  (1 << 14)
    217 #define msr_ee  (1 << 15)
     211#define msr_dr  (1 << 4)
     212#define msr_ir  (1 << 5)
     213#define msr_pr  (1 << 14)
     214#define msr_ee  (1 << 15)
    218215
    219216/* HID0 bits */
    220 #define hid0_sten  (1 << 24)
    221 #define hid0_ice   (1 << 15)
    222 #define hid0_dce   (1 << 14)
    223 #define hid0_icfi  (1 << 11)
    224 #define hid0_dci   (1 << 10)
     217#define hid0_sten       (1 << 24)
     218#define hid0_ice        (1 << 15)
     219#define hid0_dce        (1 << 14)
     220#define hid0_icfi       (1 << 11)
     221#define hid0_dci        (1 << 10)
    225222
    226223#endif
  • boot/arch/sparc64/loader/asm.S

    rbc7d44c r207e208e  
    3131#include <register.h>
    3232
    33 .register %g2, #scratch
    34 .register %g3, #scratch
     33.register       %g2, #scratch
     34.register       %g3, #scratch
    3535
    3636.text
     
    4343        ba %xcc, halt
    4444        nop
     45       
     46memcpy:
     47        mov     %o0, %o3                ! save dst
     48        add     %o1, 7, %g1
     49        and     %g1, -8, %g1
     50        cmp     %o1, %g1
     51        be,pn   %xcc, 3f
     52        add     %o0, 7, %g1
     53        mov     0, %g3
     540:
     55        brz,pn  %o2, 2f
     56        mov     0, %g2
     571:
     58        ldub    [%g3 + %o1], %g1
     59        add     %g2, 1, %g2
     60        cmp     %o2, %g2
     61        stb     %g1, [%g3 + %o0]
     62        bne,pt  %xcc, 1b
     63        mov     %g2, %g3
     642:
     65        jmp     %o7 + 8                 ! exit point
     66        mov     %o3, %o0
     673:
     68        and     %g1, -8, %g1
     69        cmp     %o0, %g1
     70        bne,pt  %xcc, 0b
     71        mov     0, %g3
     72        srlx    %o2, 3, %g4
     73        brz,pn  %g4, 5f
     74        mov     0, %g5
     754:
     76        sllx    %g3, 3, %g2
     77        add     %g5, 1, %g3
     78        ldx     [%o1 + %g2], %g1
     79        mov     %g3, %g5
     80        cmp     %g4, %g3
     81        bne,pt  %xcc, 4b
     82        stx     %g1, [%o0 + %g2]
     835:
     84        and     %o2, 7, %o2
     85        brz,pn  %o2, 2b
     86        sllx    %g4, 3, %g1
     87        mov     0, %g2
     88        add     %g1, %o0, %o0
     89        add     %g1, %o1, %g4
     90        mov     0, %g3
     916:
     92        ldub    [%g2 + %g4], %g1
     93        stb     %g1, [%g2 + %o0]
     94        add     %g3, 1, %g2
     95        cmp     %o2, %g2
     96        bne,pt  %xcc, 6b
     97        mov     %g2, %g3
    4598
    46 memcpy:
    47         mov %o0, %o3      ! save dst
    48         add %o1, 7, %g1
    49         and %g1, -8, %g1
    50         cmp %o1, %g1
    51         be,pn %xcc, 3f
    52         add %o0, 7, %g1
    53         mov 0, %g3
    54        
    55         0:
    56                 brz,pn %o2, 2f
    57                 mov 0, %g2
    58        
    59         1:
    60                 ldub [%g3 + %o1], %g1
    61                 add %g2, 1, %g2
    62                 cmp %o2, %g2
    63                 stb %g1, [%g3 + %o0]
    64                 bne,pt %xcc, 1b
    65                 mov %g2, %g3
    66        
    67         2:
    68                 jmp %o7 + 8   ! exit point
    69                 mov %o3, %o0
    70        
    71         3:
    72                 and %g1, -8, %g1
    73                 cmp %o0, %g1
    74                 bne,pt %xcc, 0b
    75                 mov 0, %g3
    76                 srlx %o2, 3, %g4
    77                 brz,pn %g4, 5f
    78                 mov 0, %g5
    79        
    80         4:
    81                 sllx %g3, 3, %g2
    82                 add %g5, 1, %g3
    83                 ldx [%o1 + %g2], %g1
    84                 mov %g3, %g5
    85                 cmp %g4, %g3
    86                 bne,pt %xcc, 4b
    87                 stx %g1, [%o0 + %g2]
    88        
    89         5:
    90                 and %o2, 7, %o2
    91                 brz,pn %o2, 2b
    92                 sllx %g4, 3, %g1
    93                 mov 0, %g2
    94                 add %g1, %o0, %o0
    95                 add %g1, %o1, %g4
    96                 mov 0, %g3
    97        
    98         6:
    99                 ldub [%g2 + %g4], %g1
    100                 stb %g1, [%g2 + %o0]
    101                 add %g3, 1, %g2
    102                 cmp %o2, %g2
    103                 bne,pt %xcc, 6b
    104                 mov %g2, %g3
    105        
    106         jmp %o7 + 8   ! exit point
    107         mov %o3, %o0
     99        jmp     %o7 + 8                 ! exit point
     100        mov     %o3, %o0
    108101
    109102jump_to_kernel:
     
    114107         * 3. Flush instruction pipeline.
    115108         */
    116        
     109
    117110        /*
    118111         * US3 processors have a write-invalidate cache, so explicitly
    119112         * invalidating it is not required. Whether to invalidate I-cache
    120          * or not is decided according to the value of the 5th argument
    121          * (subarchitecture).
     113         * or not is decided according to the value of the global
     114         * "subarchitecture" variable (set in the bootstrap).
    122115         */
    123         cmp %i4, 3
     116        set subarchitecture, %g2
     117        ldub [%g2], %g2
     118        cmp %g2, 3
    124119        be %xcc, 1f
    125120        nop
    126        
    127         0:
    128                 call icache_flush
    129                 nop
    130        
    131         1:
    132                 membar #StoreStore
     1210:
     122        call icache_flush
     123        nop
     1241:
     125        membar #StoreStore
    133126       
    134127        /*
    135128         * Flush the instruction pipeline.
    136129         */
    137         flush %i7
    138        
     130        flush   %i7
     131
    139132        mov %o0, %l1
    140133        mov %o1, %o0
    141134        mov %o2, %o1
    142135        mov %o3, %o2
    143         jmp %l1       ! jump to kernel
     136        jmp %l1                         ! jump to kernel
    144137        nop
    145138
    146 #define ICACHE_SIZE       8192
    147 #define ICACHE_LINE_SIZE  32
    148 #define ICACHE_SET_BIT    (1 << 13)
    149 #define ASI_ICACHE_TAG    0x67
     139#define ICACHE_SIZE             8192
     140#define ICACHE_LINE_SIZE        32
     141#define ICACHE_SET_BIT          (1 << 13)
     142#define ASI_ICACHE_TAG          0x67
    150143
    151144# Flush I-cache
    152145icache_flush:
    153         set ((ICACHE_SIZE - ICACHE_LINE_SIZE) | ICACHE_SET_BIT), %g1
    154         stxa %g0, [%g1] ASI_ICACHE_TAG
    155        
    156         0:
    157                 membar #Sync
    158                 subcc %g1, ICACHE_LINE_SIZE, %g1
    159                 bnz,pt %xcc, 0b
    160        
    161         stxa %g0, [%g1] ASI_ICACHE_TAG
    162         membar #Sync
     146        set     ((ICACHE_SIZE - ICACHE_LINE_SIZE) | ICACHE_SET_BIT), %g1
     147        stxa    %g0, [%g1] ASI_ICACHE_TAG
     1480:      membar  #Sync
     149        subcc   %g1, ICACHE_LINE_SIZE, %g1
     150        bnz,pt  %xcc, 0b
     151        stxa    %g0, [%g1] ASI_ICACHE_TAG
     152        membar  #Sync
    163153        retl
    164154        ! SF Erratum #51
    165155        nop
    166 
    167156.global ofw
    168157ofw:
     
    170159        set ofw_cif, %l0
    171160        ldx [%l0], %l0
    172        
     161
    173162        rdpr  %pstate, %l1
    174163        and  %l1, ~PSTATE_AM_BIT, %l2
    175164        wrpr  %l2, 0, %pstate
    176        
     165   
    177166        jmpl %l0, %o7
    178167        mov %i0, %o0
    179        
     168
    180169        wrpr %l1, 0, %pstate
    181        
     170
    182171        ret
    183172        restore %o0, 0, %o0
  • boot/arch/sparc64/loader/asm.h

    rbc7d44c r207e208e  
    3434#include "main.h"
    3535
    36 #define PAGE_WIDTH  14
    37 #define PAGE_SIZE   (1 << PAGE_WIDTH)
     36#define PAGE_WIDTH      14
     37#define PAGE_SIZE       (1 << PAGE_WIDTH)
    3838
    39 #define BALLOC_MAX_SIZE  (128 * 1024)
     39#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
    4040
    4141extern void halt(void);
    4242extern void jump_to_kernel(void *entry, uint64_t cfg, bootinfo_t *bootinfo,
    43     unsigned int bootinfo_size, uint8_t subarchitecture) __attribute__((noreturn));
     43        unsigned int bootinfo_size) __attribute__((noreturn));
    4444
    4545#endif
  • boot/arch/sparc64/loader/boot.S

    rbc7d44c r207e208e  
    3131#include <register.h>
    3232
    33 #define INITIAL_STACK_SIZE  8192
     33#define INITIAL_STACK_SIZE      8192
    3434
    35 #define NWINDOWS  8
     35#define NWINDOWS                8
    3636
    3737.register %g2, #scratch
     
    5757        .half 0
    5858        .half 0
    59 
    6059.global silo_ramdisk_image
    6160silo_ramdisk_image:
    6261        .word 0
    63 
    6462.global silo_ramdisk_size
    6563silo_ramdisk_size:
     
    6765
    6866.align 8
    69 1:
     671:     
    7068        /*
    7169         * Disable interrupts and disable address masking.
     
    7371        wrpr %g0, PSTATE_PRIV_BIT, %pstate
    7472       
    75         wrpr %g0, NWINDOWS - 2, %cansave   ! set maximum saveable windows
    76         wrpr %g0, 0, %canrestore           ! get rid of windows we will never need again
    77         wrpr %g0, 0, %otherwin             ! make sure the window state is consistent
    78         wrpr %g0, NWINDOWS - 1, %cleanwin  ! prevent needless clean_window traps for kernel
    79        
     73        wrpr %g0, NWINDOWS - 2, %cansave        ! set maximum saveable windows
     74        wrpr %g0, 0, %canrestore                ! get rid of windows we will never need again
     75        wrpr %g0, 0, %otherwin                  ! make sure the window state is consistent
     76        wrpr %g0, NWINDOWS - 1, %cleanwin       ! prevent needless clean_window traps for kernel
     77
    8078        set initial_stack_top, %sp
    8179        add %sp, -STACK_BIAS, %sp
    82        
     80
    8381        set ofw_cif, %l0
    84        
    85         call ofw_init   ! initialize OpenFirmware
     82 
     83        call ofw_init           ! initialize OpenFirmware
    8684        stx %o4, [%l0]
    8785       
     
    9290initial_stack:
    9391        .space INITIAL_STACK_SIZE
    94 
    9592initial_stack_top:
    9693        .space STACK_WINDOW_SAVE_AREA_SIZE
  • boot/arch/sparc64/loader/main.c

    rbc7d44c r207e208e  
    11/*
    22 * Copyright (c) 2005 Martin Decky
    3  * Copyright (c) 2006 Jakub Jermar
     3 * Copyright (c) 2006 Jakub Jermar 
    44 * All rights reserved.
    55 *
     
    2828 */
    2929
    30 #include "main.h"
     30#include "main.h" 
    3131#include <printf.h>
    3232#include "asm.h"
     
    3939#include <macros.h>
    4040#include <string.h>
    41 #include <memstr.h>
    42 
    43 static bootinfo_t bootinfo;
    44 static component_t components[COMPONENTS];
    45 static char *release = STRING(RELEASE);
     41
     42bootinfo_t bootinfo;
     43
     44component_t components[COMPONENTS];
     45
     46char *release = STRING(RELEASE);
    4647
    4748#ifdef REVISION
    48         static char *revision = ", revision " STRING(REVISION);
     49        char *revision = ", revision " STRING(REVISION);
    4950#else
    50         static char *revision = "";
     51        char *revision = "";
    5152#endif
    5253
    5354#ifdef TIMESTAMP
    54         static char *timestamp = "\nBuilt on " STRING(TIMESTAMP);
     55        char *timestamp = "\nBuilt on " STRING(TIMESTAMP);
    5556#else
    56         static char *timestamp = "";
     57        char *timestamp = "";
    5758#endif
    5859
    5960/** UltraSPARC subarchitecture - 1 for US, 3 for US3 */
    60 static uint8_t subarchitecture;
     61uint8_t subarchitecture;
    6162
    6263/**
     
    6465 * MID_SHIFT bits to the right
    6566 */
    66 static uint16_t mid_mask;
     67uint16_t mid_mask;
    6768
    6869/** Print version information. */
     
    7576
    7677/* the lowest ID (read from the VER register) of some US3 CPU model */
    77 #define FIRST_US3_CPU  0x14
     78#define FIRST_US3_CPU   0x14
    7879
    7980/* the greatest ID (read from the VER register) of some US3 CPU model */
    80 #define LAST_US3_CPU   0x19
     81#define LAST_US3_CPU    0x19
    8182
    8283/* UltraSPARC IIIi processor implementation code */
    83 #define US_IIIi_CODE   0x15
     84#define US_IIIi_CODE    0x15
    8485
    8586/**
     
    9091{
    9192        uint64_t v;
    92         asm volatile (
    93                 "rdpr %%ver, %0\n"
    94                 : "=r" (v)
    95         );
     93        asm volatile ("rdpr %%ver, %0\n" : "=r" (v));
    9694       
    9795        v = (v << 16) >> 48;
     
    105103                subarchitecture = SUBARCH_US;
    106104                mid_mask = (1 << 5) - 1;
    107         } else
     105        } else {
    108106                printf("\nThis CPU is not supported by HelenOS.");
     107        }
    109108}
    110109
     
    114113        void *balloc_base;
    115114        unsigned int top = 0;
    116         unsigned int i;
    117         unsigned int j;
    118        
     115        int i, j;
     116
    119117        version_print();
    120118       
    121119        detect_subarchitecture();
    122120        init_components(components);
    123        
     121
    124122        if (!ofw_get_physmem_start(&bootinfo.physmem_start)) {
    125123                printf("Error: unable to get start of physical memory.\n");
    126124                halt();
    127125        }
    128        
     126
    129127        if (!ofw_memmap(&bootinfo.memmap)) {
    130128                printf("Error: unable to get memory map, halting.\n");
    131129                halt();
    132130        }
    133        
     131
    134132        if (bootinfo.memmap.total == 0) {
    135133                printf("Error: no memory detected, halting.\n");
    136134                halt();
    137135        }
    138        
     136
    139137        /*
    140138         * SILO for some reason adds 0x400000 and subtracts
     
    145143                silo_ramdisk_image += bootinfo.physmem_start;
    146144                silo_ramdisk_image -= 0x400000;
    147                
    148                 /* Install 1:1 mapping for the RAM disk. */
    149                 if (ofw_map((void *) ((uintptr_t) silo_ramdisk_image),
    150                     (void *) ((uintptr_t) silo_ramdisk_image),
     145                /* Install 1:1 mapping for the ramdisk. */
     146                if (ofw_map((void *)((uintptr_t) silo_ramdisk_image),
     147                    (void *)((uintptr_t) silo_ramdisk_image),
    151148                    silo_ramdisk_size, -1) != 0) {
    152                         printf("Failed to map RAM disk.\n");
     149                        printf("Failed to map ramdisk.\n");
    153150                        halt();
    154151                }
    155152        }
    156153       
    157         printf("\nMemory statistics (total %d MB, starting at %P)\n",
     154        printf("\nSystem info\n");
     155        printf(" memory: %dM starting at %P\n",
    158156            bootinfo.memmap.total >> 20, bootinfo.physmem_start);
    159         printf(" %P: kernel entry point\n", KERNEL_VIRTUAL_ADDRESS);
     157
     158        printf("\nMemory statistics\n");
     159        printf(" kernel entry point at %P\n", KERNEL_VIRTUAL_ADDRESS);
    160160        printf(" %P: boot info structure\n", &bootinfo);
    161161       
     
    176176                                break;
    177177                        }
    178                        
    179178                        bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr =
    180179                            base + top;
     
    188187                top += components[i].size;
    189188        }
    190        
    191         /* Do not consider RAM disk */
    192         j = bootinfo.taskmap.count - 1;
    193        
     189
     190        j = bootinfo.taskmap.count - 1; /* do not consider ramdisk */
     191
    194192        if (silo_ramdisk_image) {
    195                 /* Treat the RAM disk as the last bootinfo task. */
     193                /* Treat the ramdisk as the last bootinfo task. */
    196194                if (bootinfo.taskmap.count == TASKMAP_MAX_RECORDS) {
    197                         printf("Skipping RAM disk.\n");
     195                        printf("Skipping ramdisk.\n");
    198196                        goto skip_ramdisk;
    199197                }
    200                
    201198                top = ALIGN_UP(top, PAGE_SIZE);
    202199                bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr =
     
    205202                    silo_ramdisk_size;
    206203                bootinfo.taskmap.count++;
    207                 printf("\nCopying RAM disk...");
    208                
     204                printf("\nCopying ramdisk...");
    209205                /*
    210206                 * Claim and map the whole ramdisk as it may exceed the area
     
    214210                (void) ofw_map(bootinfo.physmem_start + base + top, base + top,
    215211                    silo_ramdisk_size, -1);
    216                 memmove(base + top, (void *) ((uintptr_t) silo_ramdisk_image),
     212                memmove(base + top, (void *)((uintptr_t)silo_ramdisk_image),
    217213                    silo_ramdisk_size);
    218                
    219214                printf("done.\n");
    220215                top += silo_ramdisk_size;
    221216        }
    222217skip_ramdisk:
    223        
     218
    224219        /*
    225220         * Now we can proceed to copy the components. We do it in reverse order
     
    227222         * with base.
    228223         */
    229         printf("\nCopying tasks...");
     224        printf("\nCopying bootinfo tasks\n");
    230225        for (i = COMPONENTS - 1; i > 0; i--, j--) {
    231                 printf("%s ", components[i].name);
    232                
     226                printf(" %s...", components[i].name);
     227
    233228                /*
    234229                 * At this point, we claim the physical memory that we are
     
    245240                    bootinfo.taskmap.tasks[j].addr,
    246241                    ALIGN_UP(components[i].size, PAGE_SIZE));
    247                
    248                 memcpy((void *) bootinfo.taskmap.tasks[j].addr,
     242                   
     243                memcpy((void *)bootinfo.taskmap.tasks[j].addr,
    249244                    components[i].start, components[i].size);
    250                
    251         }
    252         printf(".\n");
    253        
     245                printf("done.\n");
     246        }
     247
    254248        printf("\nCopying kernel...");
    255249        (void) ofw_claim_phys(bootinfo.physmem_start + base,
     
    257251        memcpy(base, components[0].start, components[0].size);
    258252        printf("done.\n");
    259        
     253
    260254        /*
    261255         * Claim and map the physical memory for the boot allocator.
     
    267261        (void) ofw_map(bootinfo.physmem_start + balloc_base, balloc_base,
    268262            BALLOC_MAX_SIZE, -1);
    269         balloc_init(&bootinfo.ballocs, (uintptr_t) balloc_base,
    270             (uintptr_t) balloc_base);
    271        
     263        balloc_init(&bootinfo.ballocs, (uintptr_t)balloc_base);
     264
    272265        printf("\nCanonizing OpenFirmware device tree...");
    273266        bootinfo.ofw_root = ofw_tree_build();
    274267        printf("done.\n");
    275        
     268
    276269#ifdef CONFIG_AP
    277270        printf("\nChecking for secondary processors...");
    278         if (!ofw_cpu(mid_mask, bootinfo.physmem_start))
     271        if (!ofw_cpu())
    279272                printf("Error: unable to get CPU properties\n");
    280273        printf("done.\n");
    281274#endif
    282        
     275
    283276        ofw_setup_palette();
    284        
     277
    285278        printf("\nBooting the kernel...\n");
    286279        jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS,
    287280            bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo,
    288             sizeof(bootinfo), subarchitecture);
     281            sizeof(bootinfo));
    289282}
  • boot/arch/sparc64/loader/main.h

    rbc7d44c r207e208e  
    3535#include <types.h>
    3636
    37 #define KERNEL_VIRTUAL_ADDRESS  0x400000
     37#define KERNEL_VIRTUAL_ADDRESS 0x400000
    3838
    39 #define TASKMAP_MAX_RECORDS  32
     39#define TASKMAP_MAX_RECORDS 32
    4040
    4141/** Size of buffer for storing task name in task_t. */
    42 #define BOOTINFO_TASK_NAME_BUFLEN  32
     42#define BOOTINFO_TASK_NAME_BUFLEN 32
    4343
    44 #define BSP_PROCESSOR  1
    45 #define AP_PROCESSOR   0
     44#define BSP_PROCESSOR   1
     45#define AP_PROCESSOR    0
    4646
    47 #define SUBARCH_US   1
    48 #define SUBARCH_US3  3
     47#define SUBARCH_US      1
     48#define SUBARCH_US3     3
    4949
    5050typedef struct {
     
    7070extern uint32_t silo_ramdisk_size;
    7171
     72extern bootinfo_t bootinfo;
     73
    7274extern void start(void);
    7375extern void bootstrap(void);
  • boot/arch/sparc64/loader/ofwarch.c

    rbc7d44c r207e208e  
    3030/**
    3131 * @file
    32  * @brief Architecture dependent parts of OpenFirmware interface.
     32 * @brief       Architecture dependent parts of OpenFirmware interface.
    3333 */
    3434
     
    4040#include "main.h"
    4141#include "asm.h"
     42
     43/* these tho variables will be set by the detect_subarchitecture function */
     44extern uint8_t subarchitecture;
     45extern uint16_t mid_mask;
    4246
    4347void write(const char *str, const int len)
     
    6165 * except for the current CPU.
    6266 *
    63  * @param child         The first child of the OFW tree node whose children
    64  *                      represent CPUs to be woken up.
    65  * @param current_mid   MID of the current CPU, the current CPU will
    66  *                      (of course) not be woken up.
    67  * @param physmem_start Starting address of the physical memory.
    68  *
    69  * @return Number of CPUs which have the same parent node as
    70  *         "child".
    71  *
     67 * @param child         The first child of the OFW tree node whose children
     68 *                      represent CPUs to be woken up.
     69 * @param current_mid   MID of the current CPU, the current CPU will
     70 *                      (of course) not be woken up.
     71 * @return              Number of CPUs which have the same parent node as
     72 *                      "child".
    7273 */
    73 static int wake_cpus_in_node(phandle child, uint64_t current_mid,
    74     uintptr_t physmem_start)
     74static int wake_cpus_in_node(phandle child, uint64_t current_mid)
    7575{
    7676        int cpus;
     77        char type_name[BUF_SIZE];
    7778       
    78         for (cpus = 0; (child != 0) && (child != -1);
     79        for (cpus = 0; child != 0 && child != -1;
    7980            child = ofw_get_peer_node(child), cpus++) {
    80                 char type_name[BUF_SIZE];
    81                
    8281                if (ofw_get_property(child, "device_type", type_name,
    8382                    sizeof(type_name)) > 0) {
     
    8988                                 * "cpuid" for US-IV
    9089                                 */
    91                                 if ((ofw_get_property(child, "upa-portid", &mid, sizeof(mid)) <= 0)
    92                                     && (ofw_get_property(child, "portid", &mid, sizeof(mid)) <= 0)
    93                                     && (ofw_get_property(child, "cpuid", &mid, sizeof(mid)) <= 0))
     90                                if (ofw_get_property(
     91                                    child, "upa-portid",
     92                                    &mid, sizeof(mid)) <= 0
     93                                    && ofw_get_property(child, "portid",
     94                                    &mid, sizeof(mid)) <= 0
     95                                    && ofw_get_property(child, "cpuid",
     96                                    &mid, sizeof(mid)) <= 0)
    9497                                        continue;
    95                                
     98                                       
    9699                                if (current_mid != mid) {
    97100                                        /*
     
    100103                                        (void) ofw_call("SUNW,start-cpu", 3, 1,
    101104                                            NULL, child, KERNEL_VIRTUAL_ADDRESS,
    102                                             physmem_start | AP_PROCESSOR);
     105                                            bootinfo.physmem_start |
     106                                            AP_PROCESSOR);
    103107                                }
    104108                        }
    105109                }
    106110        }
    107        
     111
    108112        return cpus;
    109113}
     
    112116 * Finds out the current CPU's MID and wakes up all AP processors.
    113117 */
    114 int ofw_cpu(uint16_t mid_mask, uintptr_t physmem_start)
     118int ofw_cpu(void)
    115119{
    116         /* Get the current CPU MID */
     120        int cpus;
     121        phandle node;
     122        phandle subnode;
     123        phandle cpus_parent;
     124        phandle cmp;
     125        char name[BUF_SIZE];
     126
     127        /* get the current CPU MID */
    117128        uint64_t current_mid;
    118129       
    119         asm volatile (
    120                 "ldxa [%1] %2, %0\n"
    121                 : "=r" (current_mid)
    122                 : "r" (0), "i" (ASI_ICBUS_CONFIG)
    123         );
     130        asm volatile ("ldxa [%1] %2, %0\n"
     131            : "=r" (current_mid)
     132            : "r" (0), "i" (ASI_ICBUS_CONFIG));
     133        current_mid >>= ICBUS_CONFIG_MID_SHIFT;
     134
     135        current_mid &= mid_mask;
     136
     137        /* wake up CPUs */
    124138       
    125         current_mid >>= ICBUS_CONFIG_MID_SHIFT;
    126         current_mid &= mid_mask;
    127        
    128         /* Wake up the CPUs */
    129        
    130         phandle cpus_parent = ofw_find_device("/ssm@0,0");
    131         if ((cpus_parent == 0) || (cpus_parent == -1))
     139        cpus_parent = ofw_find_device("/ssm@0,0");
     140        if (cpus_parent == 0 || cpus_parent == -1) {
    132141                cpus_parent = ofw_find_device("/");
    133        
    134         phandle node = ofw_get_child_node(cpus_parent);
    135         int cpus = wake_cpus_in_node(node, current_mid, physmem_start);
    136         while ((node != 0) && (node != -1)) {
    137                 char name[BUF_SIZE];
    138                
     142        }
     143
     144        node = ofw_get_child_node(cpus_parent);
     145        cpus = wake_cpus_in_node(node, current_mid);
     146        while (node != 0 && node != -1) {
    139147                if (ofw_get_property(node, "name", name,
    140                     sizeof(name)) > 0) {
     148                        sizeof(name)) > 0) {
    141149                        if (strcmp(name, "cmp") == 0) {
    142                                 phandle subnode = ofw_get_child_node(node);
     150                                subnode = ofw_get_child_node(node);
    143151                                cpus += wake_cpus_in_node(subnode,
    144                                         current_mid, physmem_start);
     152                                        current_mid);
    145153                        }
    146154                }
     
    149157       
    150158        return cpus;
     159       
    151160}
    152161
    153162/** Get physical memory starting address.
    154163 *
    155  * @param start Pointer to variable where the physical memory starting
    156  *              address will be stored.
     164 * @param start         Pointer to variable where the physical memory starting
     165 *                      address will be stored.
    157166 *
    158  * @return Non-zero on succes, zero on failure.
    159  *
     167 * @return              Non-zero on succes, zero on failure.
    160168 */
    161169int ofw_get_physmem_start(uintptr_t *start)
    162170{
    163171        uint32_t memreg[4];
     172
    164173        if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0)
    165174                return 0;
    166        
     175
    167176        *start = (((uint64_t) memreg[0]) << 32) | memreg[1];
    168177        return 1;
    169178}
     179
  • boot/arch/sparc64/loader/ofwarch.h

    rbc7d44c r207e208e  
    3333#include "types.h"
    3434
    35 #define OFW_ADDRESS_CELLS  2
    36 #define OFW_SIZE_CELLS     2
     35#define OFW_ADDRESS_CELLS       2
     36#define OFW_SIZE_CELLS          2
    3737
    38 extern int ofw_cpu(uint16_t mid_mask, uintptr_t physmem_start);
    39 extern int ofw_get_physmem_start(uintptr_t *start);
     38extern int ofw_cpu(void);
     39extern int ofw_get_physmem_start(uintptr_t *start); 
    4040
    4141#endif
  • boot/arch/sparc64/loader/register.h

    rbc7d44c r207e208e  
    3030#define BOOT_sparc64_REGISTER_H_
    3131
    32 #define PSTATE_IE_BIT    2
    33 #define PSTATE_PRIV_BIT  4
    34 #define PSTATE_AM_BIT    8
     32#define PSTATE_IE_BIT   2
     33#define PSTATE_PRIV_BIT 4
     34#define PSTATE_AM_BIT   8
    3535
    36 #define ASI_ICBUS_CONFIG        0x4a
    37 #define ICBUS_CONFIG_MID_SHIFT  17
     36#define ASI_ICBUS_CONFIG                0x4a
     37#define ICBUS_CONFIG_MID_SHIFT          17
    3838
    3939#endif
  • boot/arch/sparc64/loader/stack.h

    rbc7d44c r207e208e  
    3030#define BOOT_sparc64_STACK_H_
    3131
    32 #define STACK_ALIGNMENT              16
    33 #define STACK_BIAS                   2047
    34 #define STACK_WINDOW_SAVE_AREA_SIZE  (16 * 8)
     32#define STACK_ALIGNMENT                 16
     33#define STACK_BIAS                      2047
     34#define STACK_WINDOW_SAVE_AREA_SIZE     (16*8)
    3535
    3636#endif
  • boot/genarch/balloc.c

    rbc7d44c r207e208e  
    2828
    2929#include <balloc.h>
    30 #include <asm.h>
    3130#include <types.h>
    3231#include <align.h>
    3332
    3433static ballocs_t *ballocs;
    35 static uintptr_t phys_base;
    3634
    37 void balloc_init(ballocs_t *ball, uintptr_t base, uintptr_t kernel_base)
     35void balloc_init(ballocs_t *b, uintptr_t base)
    3836{
    39         ballocs = ball;
    40         phys_base = base;
    41         ballocs->base = kernel_base;
     37        ballocs = b;
     38        ballocs->base = base;
    4239        ballocs->size = 0;
    4340}
     
    4542void *balloc(size_t size, size_t alignment)
    4643{
     44        uintptr_t addr;
     45
    4746        /* Enforce minimal alignment. */
    4847        alignment = ALIGN_UP(alignment, 4);
    4948       
    50         uintptr_t addr = phys_base + ALIGN_UP(ballocs->size, alignment);
    51        
     49        addr = ballocs->base + ALIGN_UP(ballocs->size, alignment);
     50
    5251        if (ALIGN_UP(ballocs->size, alignment) + size > BALLOC_MAX_SIZE)
    5352                return NULL;
    54        
     53               
    5554        ballocs->size = ALIGN_UP(ballocs->size, alignment) + size;
    5655       
    5756        return (void *) addr;
    5857}
    59 
    60 void *balloc_rebase(void *ptr)
    61 {
    62         return (void *) ((uintptr_t) ptr - phys_base + ballocs->base);
    63 }
  • boot/genarch/balloc.h

    rbc7d44c r207e208e  
    3232#include <types.h>
    3333
     34#define BALLOC_MAX_SIZE         (128 * 1024)
     35
    3436typedef struct {
    3537        uintptr_t base;
     
    3739} ballocs_t;
    3840
    39 extern void balloc_init(ballocs_t *ball, uintptr_t base, uintptr_t kernel_base);
     41extern void balloc_init(ballocs_t *b, uintptr_t base);
    4042extern void *balloc(size_t size, size_t alignment);
    41 extern void *balloc_rebase(void *ptr);
    4243
    4344#endif
  • boot/genarch/ofw.c

    rbc7d44c r207e208e  
    3333#include <types.h>
    3434
    35 #define RED(i)    (((i) >> 5) & ((1 << 3) - 1))
    36 #define GREEN(i)  (((i) >> 3) & ((1 << 2) - 1))
    37 #define BLUE(i)   ((i) & ((1 << 3) - 1))
    38 #define CLIP(i)   ((i) <= 255 ? (i) : 255)
    39 
    4035uintptr_t ofw_cif;
    4136
     
    9085/** Perform a call to OpenFirmware client interface.
    9186 *
    92  * @param service String identifying the service requested.
    93  * @param nargs   Number of input arguments.
    94  * @param nret    Number of output arguments. This includes the return
    95  *                value.
    96  * @param rets    Buffer for output arguments or NULL. The buffer must
    97  *                accommodate nret - 1 items.
    98  *
    99  * @return Return value returned by the client interface.
    100  *
     87 * @param service       String identifying the service requested.
     88 * @param nargs         Number of input arguments.
     89 * @param nret          Number of output arguments. This includes the return
     90 *                      value.
     91 * @param rets          Buffer for output arguments or NULL. The buffer must
     92 *                      accommodate nret - 1 items.
     93 *
     94 * @return              Return value returned by the client interface.
    10195 */
    10296unsigned long
     
    227221}
    228222
    229 void *ofw_claim_virt(const void *virt, const unsigned int len)
     223void *ofw_claim_virt(const void *virt, const int len)
    230224{
    231225        ofw_arg_t retaddr;
     
    240234}
    241235
    242 static void *ofw_claim_phys_internal(const void *phys, const unsigned int len, const unsigned int alignment)
    243 {
    244         /*
    245          * Note that the return value check will help
    246          * us to discover conflicts between OpenFirmware
    247          * allocations and our use of physical memory.
    248          * It is better to detect collisions here
    249          * than to cope with weird errors later.
    250          *
    251          * So this is really not to make the loader
    252          * more generic; it is here for debugging
    253          * purposes.
    254          */
    255        
     236void *ofw_claim_phys(const void *phys, const int len)
     237{
     238        ofw_arg_t retaddr[2];
     239        int shift;
     240
    256241        if (sizeof(unative_t) == 8) {
    257                 ofw_arg_t retaddr[2];
    258                 int shift = 32;
    259                
     242                shift = 32;
    260243                if (ofw_call("call-method", 6, 3, retaddr, "claim",
    261                     ofw_memory_prop, alignment, len, ((uintptr_t) phys) >> shift,
     244                    ofw_memory_prop, 0, len, ((uintptr_t) phys) >> shift,
    262245                    ((uintptr_t) phys) & ((uint32_t) -1)) != 0) {
     246                        /*
     247                         * Note that this will help us to discover
     248                         * conflicts between OpenFirmware allocations
     249                         * and our use of physical memory.
     250                         * It is better to detect collisions here
     251                         * than to cope with weird errors later.
     252                         *
     253                         * So this is really not to make the loader
     254                         * more generic; it is here for debugging
     255                         * purposes.
     256                         */
    263257                        puts("Error: memory method claim() failed, halting.\n");
    264258                        halt();
    265259                }
    266                
    267                 return (void *) ((retaddr[0] << shift) | retaddr[1]);
    268260        } else {
    269                 ofw_arg_t retaddr[1];
    270                
    271                 if (ofw_call("call-method", 5, 2, retaddr, "claim",
    272                     ofw_memory_prop, alignment, len, (uintptr_t) phys) != 0) {
    273                         puts("Error: memory method claim() failed, halting.\n");
    274                         halt();
    275                 }
    276                
    277                 return (void *) retaddr[0];
    278         }
    279 }
    280 
    281 void *ofw_claim_phys(const void *phys, const unsigned int len)
    282 {
    283         return ofw_claim_phys_internal(phys, len, 0);
    284 }
    285 
    286 void *ofw_claim_phys_any(const unsigned int len, const unsigned int alignment)
    287 {
    288         return ofw_claim_phys_internal(NULL, len, alignment);
    289 }
    290 
    291 int ofw_map(const void *phys, const void *virt, const unsigned int size, const int mode)
     261                shift = 0;
     262                /*
     263                 * FIXME: the number of arguments is probably different...
     264                 */
     265                puts("Error: 32-bit ofw_claim_phys not implemented.\n");
     266                halt();
     267        }
     268
     269        return (void *) ((retaddr[0] << shift) | retaddr[1]);
     270}
     271
     272int ofw_map(const void *phys, const void *virt, const int size, const int mode)
    292273{
    293274        uintptr_t phys_hi, phys_lo;
     
    333314
    334315                /*
    335                  * This is a hot fix of the issue which occurs on machines
    336                  * where there are holes in the physical memory (such as
    337                  * SunBlade 1500). Should we detect a hole in the physical
    338                  * memory, we will ignore any memory detected behind
    339                  * the hole and pretend the hole does not exist.
     316                 * This is a hot fix of the issue which occurs on machines
     317                 * where there are holes in the physical memory (such as
     318                 * SunBlade 1500). Should we detect a hole in the physical
     319                 * memory, we will ignore any memory detected behind
     320                 * the hole and pretend the hole does not exist.
    340321                 */
    341322                if ((map->count > 0) && (map->zones[map->count - 1].start +
     
    354335}
    355336
     337int ofw_screen(screen_t *screen)
     338{
     339        char device_name[BUF_SIZE];
     340        uint32_t virtaddr;
     341       
     342        if (ofw_get_property(ofw_aliases, "screen", device_name,
     343            sizeof(device_name)) <= 0)
     344                return false;
     345       
     346        phandle device = ofw_find_device(device_name);
     347        if (device == -1)
     348                return false;
     349       
     350        if (ofw_get_property(device, "address", &virtaddr,
     351            sizeof(virtaddr)) <= 0)
     352                return false;
     353
     354        screen->addr = (void *) ((uintptr_t) virtaddr);
     355
     356        if (ofw_get_property(device, "width", &screen->width,
     357            sizeof(screen->width)) <= 0)
     358                return false;
     359       
     360        if (ofw_get_property(device, "height", &screen->height,
     361            sizeof(screen->height)) <= 0)
     362                return false;
     363       
     364        if (ofw_get_property(device, "depth", &screen->bpp,
     365            sizeof(screen->bpp)) <= 0)
     366                return false;
     367       
     368        if (ofw_get_property(device, "linebytes", &screen->scanline,
     369            sizeof(screen->scanline)) <= 0)
     370                return false;
     371       
     372        return true;
     373}
     374
     375#define RED(i)    (((i) >> 5) & ((1 << 3) - 1))
     376#define GREEN(i)  (((i) >> 3) & ((1 << 2) - 1))
     377#define BLUE(i)   ((i) & ((1 << 3) - 1))
     378#define CLIP(i)   ((i) <= 255 ? (i) : 255)
     379
     380
    356381/**
    357382 * Sets up the palette for the 8-bit color depth configuration so that the
     
    367392        char device_name[BUF_SIZE];
    368393       
    369         /* Resolve alias */
     394        /* resolve alias */
    370395        if (ofw_get_property(ofw_aliases, "screen", device_name,
    371396            sizeof(device_name)) <= 0)
    372397                return false;
    373398       
    374         /* For depth greater than 8 it makes no sense to set up the palette */
     399        /* for depth greater than 8 it makes no sense to set up the palette */
    375400        uint32_t depth;
    376401        phandle device = ofw_find_device(device_name);
     
    382407                return false;
    383408       
    384         /* Required in order to be able to make a method call */
     409        /* required in order to be able to make a method call */
    385410        ihandle screen = ofw_open(device_name);
    386411        if (screen == -1)
    387412                return false;
    388413       
    389         /* Setup the palette so that the (inverted) 3:2:3 scheme is usable */
     414        /* setup the palette so that the (inverted) 3:2:3 scheme is usable */
    390415        unsigned int i;
    391416        for (i = 0; i < 256; i++)
  • boot/genarch/ofw.h

    rbc7d44c r207e208e  
    3333#include <stdarg.h>
    3434
    35 #define BUF_SIZE  1024
     35#define BUF_SIZE                1024
    3636
    37 #define MEMMAP_MAX_RECORDS  32
     37#define MEMMAP_MAX_RECORDS      32
    3838
    39 #define MAX_OFW_ARGS  12
     39#define MAX_OFW_ARGS            12
    4040
    4141typedef unative_t ofw_arg_t;
     
    4747 */
    4848typedef struct {
    49         ofw_arg_t service;             /**< Command name. */
    50         ofw_arg_t nargs;               /**< Number of in arguments. */
    51         ofw_arg_t nret;                /**< Number of out arguments. */
    52         ofw_arg_t args[MAX_OFW_ARGS];  /**< List of arguments. */
     49        ofw_arg_t service;              /**< Command name. */
     50        ofw_arg_t nargs;                /**< Number of in arguments. */
     51        ofw_arg_t nret;                 /**< Number of out arguments. */
     52        ofw_arg_t args[MAX_OFW_ARGS];   /**< List of arguments. */
    5353} ofw_args_t;
    5454
     
    6363        memzone_t zones[MEMMAP_MAX_RECORDS];
    6464} memmap_t;
     65
     66typedef struct {
     67        void *addr;
     68        uint32_t width;
     69        uint32_t height;
     70        uint32_t bpp;
     71        uint32_t scanline;
     72} screen_t;
     73
     74typedef struct {
     75        void *addr;
     76        uint32_t size;
     77} macio_t;
    6578
    6679typedef struct {
     
    105118extern void *ofw_translate(const void *virt);
    106119extern int ofw_translate_failed(ofw_arg_t flag);
    107 extern void *ofw_claim_virt(const void *virt, const unsigned int len);
    108 extern void *ofw_claim_phys(const void *virt, const unsigned int len);
    109 extern void *ofw_claim_phys_any(const unsigned int len, const unsigned int alignment);
    110 extern int ofw_map(const void *phys, const void *virt, const unsigned int size, const int mode);
     120extern void *ofw_claim_virt(const void *virt, const int len);
     121extern void *ofw_claim_phys(const void *virt, const int len);
     122extern int ofw_map(const void *phys, const void *virt, const int size, const int mode);
    111123extern int ofw_memmap(memmap_t *map);
     124extern int ofw_screen(screen_t *screen);
     125extern int ofw_macio(macio_t *macio);
    112126extern int ofw_setup_palette(void);
    113127extern void ofw_quiesce(void);
  • boot/genarch/ofw_tree.c

    rbc7d44c r207e208e  
    2929#include <ofw_tree.h>
    3030#include <ofw.h>
    31 #include <ofwarch.h>
    3231#include <types.h>
    3332#include <string.h>
    3433#include <balloc.h>
    3534#include <asm.h>
    36 #include <memstr.h>
    37 
    38 #define MAX_PATH_LEN  256
     35
     36#define MAX_PATH_LEN    256
    3937
    4038static ofw_tree_node_t *ofw_tree_node_alloc(void)
     
    5149static void *ofw_tree_space_alloc(size_t size)
    5250{
     51        char *addr;
     52
    5353        /*
    5454         * What we do here is a nasty hack :-)
     
    6161         * behind the requested memory.
    6262         */
    63         char *addr = balloc(size + 1, size);
     63        addr = balloc(size + 1, size);
    6464        if (addr)
    6565                addr[size] = '\0';
    66        
    6766        return addr;
    6867}
     
    7675 * order to prevent stack from overflowing.
    7776 *
    78  * @param current_node Pointer to uninitialized ofw_tree_node structure that
    79  *                     will become the memory represenation of 'current'.
    80  * @param parent_node  Parent ofw_tree_node structure or NULL in case of root
    81  *                     node.
    82  * @param current      OpenFirmware phandle to the current device tree node.
    83  *
     77 * @param current_node  Pointer to uninitialized ofw_tree_node structure that
     78 *                      will become the memory represenation of 'current'.
     79 * @param parent_node   Parent ofw_tree_node structure or NULL in case of root
     80 *                      node.
     81 * @param current       OpenFirmware phandle to the current device tree node.
    8482 */
    8583static void ofw_tree_node_process(ofw_tree_node_t *current_node,
    8684    ofw_tree_node_t *parent_node, phandle current)
    8785{
     86        static char path[MAX_PATH_LEN + 1];
     87        static char name[OFW_TREE_PROPERTY_MAX_NAMELEN];
     88        static char name2[OFW_TREE_PROPERTY_MAX_NAMELEN];
     89        phandle peer;
     90        phandle child;
     91        size_t len;
     92        int i;
     93
    8894        while (current_node) {
    8995                /*
    9096                 * Initialize node.
    9197                 */
    92                 current_node->parent = (ofw_tree_node_t *) balloc_rebase(parent_node);
     98                current_node->parent = parent_node;
    9399                current_node->peer = NULL;
    94100                current_node->child = NULL;
     
    97103                current_node->property = NULL;
    98104                current_node->device = NULL;
    99                
     105       
    100106                /*
    101107                 * Get the disambigued name.
    102108                 */
    103                 static char path[MAX_PATH_LEN + 1];
    104                 size_t len = ofw_package_to_path(current, path, MAX_PATH_LEN);
     109                len = ofw_package_to_path(current, path, MAX_PATH_LEN);
    105110                if (len == -1)
    106111                        return;
    107                
     112       
    108113                path[len] = '\0';
    109                
    110                 /* Find last slash */
    111                 int i;
    112                 for (i = len - 1; (i >= 0) && (path[i] != '/'); i--);
    113                
    114                 /* Do not include the slash */
    115                 i++;
     114                for (i = len - 1; i >= 0 && path[i] != '/'; i--)
     115                        ;
     116                i++;    /* do not include '/' */
     117       
    116118                len -= i;
    117                
    118                 /* Add space for trailing '\0' */
    119                 char *da_name = ofw_tree_space_alloc(len + 1);
    120                 if (!da_name)
    121                         return;
    122                
    123                 memcpy(da_name, &path[i], len);
    124                 da_name[len] = '\0';
    125                 current_node->da_name = (char *) balloc_rebase(da_name);
    126                
     119
     120                /* add space for trailing '\0' */
     121                current_node->da_name = ofw_tree_space_alloc(len + 1);
     122                if (!current_node->da_name)
     123                        return;
     124       
     125                memcpy(current_node->da_name, &path[i], len);
     126                current_node->da_name[len] = '\0';
     127       
    127128                /*
    128129                 * Recursively process the potential child node.
    129130                 */
    130                 phandle child = ofw_get_child_node(current);
    131                 if ((child != 0) && (child != -1)) {
    132                         ofw_tree_node_t *child_node = ofw_tree_node_alloc();
     131                child = ofw_get_child_node(current);
     132                if (child != 0 && child != -1) {
     133                        ofw_tree_node_t *child_node;
     134               
     135                        child_node = ofw_tree_node_alloc();
    133136                        if (child_node) {
    134137                                ofw_tree_node_process(child_node, current_node,
    135138                                    child);
    136                                 current_node->child =
    137                                     (ofw_tree_node_t *) balloc_rebase(child_node);
     139                                current_node->child = child_node;
    138140                        }
    139141                }
    140                
     142       
    141143                /*
    142144                 * Count properties.
    143145                 */
    144                 static char name[OFW_TREE_PROPERTY_MAX_NAMELEN];
    145                 static char name2[OFW_TREE_PROPERTY_MAX_NAMELEN];
    146146                name[0] = '\0';
    147147                while (ofw_next_property(current, name, name2) == 1) {
     
    149149                        memcpy(name, name2, OFW_TREE_PROPERTY_MAX_NAMELEN);
    150150                }
    151                
     151
    152152                if (!current_node->properties)
    153153                        return;
    154                
     154       
    155155                /*
    156156                 * Copy properties.
    157157                 */
    158                 ofw_tree_property_t *property =
     158                current_node->property =
    159159                    ofw_tree_properties_alloc(current_node->properties);
    160                 if (!property)
     160                if (!current_node->property)
    161161                        return;
    162162               
    163163                name[0] = '\0';
    164164                for (i = 0; ofw_next_property(current, name, name2) == 1; i++) {
     165                        size_t size;
     166               
    165167                        if (i == current_node->properties)
    166168                                break;
     169               
     170                        memcpy(name, name2, OFW_TREE_PROPERTY_MAX_NAMELEN);
     171                        memcpy(current_node->property[i].name, name,
     172                            OFW_TREE_PROPERTY_MAX_NAMELEN);
     173                        current_node->property[i].name[
     174                            OFW_TREE_PROPERTY_MAX_NAMELEN] = '\0';
     175
     176                        size = ofw_get_proplen(current, name);
     177                        current_node->property[i].size = size;
     178                        if (size) {
     179                                void *buf;
    167180                       
    168                         memcpy(name, name2, OFW_TREE_PROPERTY_MAX_NAMELEN);
    169                         memcpy(property[i].name, name, OFW_TREE_PROPERTY_MAX_NAMELEN);
    170                         property[i].name[OFW_TREE_PROPERTY_MAX_NAMELEN] = '\0';
    171                        
    172                         size_t size = ofw_get_proplen(current, name);
    173                         property[i].size = size;
    174                        
    175                         if (size) {
    176                                 void *buf = ofw_tree_space_alloc(size);
    177                                 if (buf) {
     181                                buf = ofw_tree_space_alloc(size);
     182                                if (current_node->property[i].value = buf) {
    178183                                        /*
    179184                                         * Copy property value to memory node.
    180185                                         */
    181                                         (void) ofw_get_property(current, name, buf, size);
    182                                         property[i].value = balloc_rebase(buf);
     186                                        (void) ofw_get_property(current, name,
     187                                            buf, size);
    183188                                }
    184                         } else
    185                                 property[i].value = NULL;
    186                 }
    187                
     189                        } else {
     190                                current_node->property[i].value = NULL;
     191                        }
     192                }
     193
    188194                /* Just in case we ran out of memory. */
    189195                current_node->properties = i;
    190                 current_node->property = (ofw_tree_property_t *) balloc_rebase(property);
    191                
    192                
     196
    193197                /*
    194198                 * Iteratively process the next peer node.
     
    198202                 * risk of overflowing the stack is too real.
    199203                 */
    200                 phandle peer = ofw_get_peer_node(current);
    201                 if ((peer != 0) && (peer != -1)) {
    202                         ofw_tree_node_t *peer_node = ofw_tree_node_alloc();
    203                         if (peer_node) {
    204                                 current_node->peer = (ofw_tree_node_t *) balloc_rebase(peer_node);
     204                peer = ofw_get_peer_node(current);
     205                if (peer != 0 && peer != -1) {
     206                        ofw_tree_node_t *peer_node;
     207               
     208                        peer_node = ofw_tree_node_alloc();
     209                        if (peer_node) {
     210                                current_node->peer = peer_node;
    205211                                current_node = peer_node;
    206212                                current = peer;
     
    211217                        }
    212218                }
    213                
    214219                /*
    215220                 * No more peers on this level.
     
    221226/** Construct memory representation of OpenFirmware device tree.
    222227 *
    223  * @return NULL on failure or kernel pointer to the root node.
    224  *
     228 * @return              NULL on failure or pointer to the root node.
    225229 */
    226230ofw_tree_node_t *ofw_tree_build(void)
    227231{
    228         ofw_tree_node_t *root = ofw_tree_node_alloc();
     232        ofw_tree_node_t *root;
     233        phandle ssm_node;
     234        ofw_tree_node_t *ssm;
     235       
     236        root = ofw_tree_node_alloc();
    229237        if (root)
    230238                ofw_tree_node_process(root, NULL, ofw_root);
    231        
     239
    232240        /*
    233241         * The firmware client interface does not automatically include the
     
    235243         * solution is to explicitly stick "ssm" to the OFW tree.
    236244         */
    237         phandle ssm_node = ofw_find_device("/ssm@0,0");
     245        ssm_node = ofw_find_device("/ssm@0,0");
    238246        if (ssm_node != -1) {
    239                 ofw_tree_node_t *ssm = ofw_tree_node_alloc();
     247                ssm = ofw_tree_node_alloc();
    240248                if (ssm) {
    241249                        ofw_tree_node_process(ssm, root,
    242250                            ofw_find_device("/ssm@0,0"));
    243251                        ssm->peer = root->child;
    244                         root->child = (ofw_tree_node_t *) balloc_rebase(ssm);
     252                        root->child = ssm;
    245253                }
    246254        }
    247255       
    248         return (ofw_tree_node_t *) balloc_rebase(root);
    249 }
     256        return root;
     257}
  • boot/genarch/ofw_tree.h

    rbc7d44c r207e208e  
    3333#include <ofw.h>
    3434
    35 #define OFW_TREE_PROPERTY_MAX_NAMELEN  32
     35#define OFW_TREE_PROPERTY_MAX_NAMELEN   32
     36
     37typedef struct ofw_tree_node ofw_tree_node_t;
     38typedef struct ofw_tree_property ofw_tree_property_t;
     39
     40/** Memory representation of OpenFirmware device tree node. */
     41struct ofw_tree_node {
     42        ofw_tree_node_t *parent;
     43        ofw_tree_node_t *peer;
     44        ofw_tree_node_t *child;
     45
     46        uint32_t node_handle;                   /**< Old OpenFirmware node handle. */
     47
     48        char *da_name;                          /**< Disambigued name. */
     49
     50        unsigned properties;                    /**< Number of properties. */
     51        ofw_tree_property_t *property;
     52       
     53        void *device;                           /**< Member used solely by the kernel. */
     54};
    3655
    3756/** Memory representation of OpenFirmware device tree node property. */
    38 typedef struct {
     57struct ofw_tree_property {
    3958        char name[OFW_TREE_PROPERTY_MAX_NAMELEN];
    4059        size_t size;
    4160        void *value;
    42 } ofw_tree_property_t;
    43 
    44 /** Memory representation of OpenFirmware device tree node. */
    45 typedef struct ofw_tree_node {
    46         struct ofw_tree_node *parent;
    47         struct ofw_tree_node *peer;
    48         struct ofw_tree_node *child;
    49        
    50         uint32_t node_handle;           /**< Old OpenFirmware node handle. */
    51        
    52         char *da_name;                  /**< Disambigued name. */
    53        
    54         unsigned int properties;        /**< Number of properties. */
    55         ofw_tree_property_t *property;
    56        
    57         void *device;                   /**< Member used solely by the kernel. */
    58 } ofw_tree_node_t;
     61};
    5962
    6063extern ofw_tree_node_t *ofw_tree_build(void);
  • boot/generic/printf.c

    rbc7d44c r207e208e  
    2727 */
    2828
    29 /** @addtogroup generic
     29/** @addtogroup generic 
    3030 * @{
    3131 */
  • boot/generic/printf.h

    rbc7d44c r207e208e  
    2727 */
    2828
    29 /** @addtogroup generic
     29/** @addtogroup generic 
    3030 * @{
    3131 */
  • boot/generic/stdarg.h

    rbc7d44c r207e208e  
    3838typedef __builtin_va_list va_list;
    3939
    40 #define va_start(ap, last)   __builtin_va_start(ap, last)
    41 #define va_arg(ap, type)     __builtin_va_arg(ap, type)
    42 #define va_end(ap)           __builtin_va_end(ap)
     40#define va_start(ap, last)              __builtin_va_start(ap, last)
     41#define va_arg(ap, type)                __builtin_va_arg(ap, type)
     42#define va_end(ap)                      __builtin_va_end(ap)
    4343
    4444#endif
  • kernel/arch/ia64/src/drivers/ski.c

    rbc7d44c r207e208e  
    129129       
    130130        outdev_initialize("skiout", &skiout, &skiout_ops);
    131         stdout_wire(&skiout);
     131        stdout = &skiout;
    132132       
    133133        sysinfo_set_item_val("fb", NULL, false);
  • kernel/arch/ppc32/include/asm/regname.h

    rbc7d44c r207e208e  
    2727 */
    2828
    29 /** @addtogroup ppc32
     29/** @addtogroup ppc32   
    3030 * @{
    3131 */
     
    3737
    3838/* Condition Register Bit Fields */
    39 #define cr0  0
    40 #define cr1  1
    41 #define cr2  2
    42 #define cr3  3
    43 #define cr4  4
    44 #define cr5  5
    45 #define cr6  6
    46 #define cr7  7
     39#define cr0     0
     40#define cr1     1
     41#define cr2     2
     42#define cr3     3
     43#define cr4     4
     44#define cr5     5
     45#define cr6     6
     46#define cr7     7
    4747
    4848/* General Purpose Registers (GPRs) */
    49 #define r0   0
    50 #define r1   1
    51 #define r2   2
    52 #define r3   3
    53 #define r4   4
    54 #define r5   5
    55 #define r6   6
    56 #define r7   7
    57 #define r8   8
    58 #define r9   9
    59 #define r10  10
    60 #define r11  11
    61 #define r12  12
    62 #define r13  13
    63 #define r14  14
    64 #define r15  15
    65 #define r16  16
    66 #define r17  17
    67 #define r18  18
    68 #define r19  19
    69 #define r20  20
    70 #define r21  21
    71 #define r22  22
    72 #define r23  23
    73 #define r24  24
    74 #define r25  25
    75 #define r26  26
    76 #define r27  27
    77 #define r28  28
    78 #define r29  29
    79 #define r30  30
    80 #define r31  31
     49#define r0      0
     50#define r1      1
     51#define r2      2
     52#define r3      3
     53#define r4      4
     54#define r5      5
     55#define r6      6
     56#define r7      7
     57#define r8      8
     58#define r9      9
     59#define r10     10
     60#define r11     11
     61#define r12     12
     62#define r13     13
     63#define r14     14
     64#define r15     15
     65#define r16     16
     66#define r17     17
     67#define r18     18
     68#define r19     19
     69#define r20     20
     70#define r21     21
     71#define r22     22
     72#define r23     23
     73#define r24     24
     74#define r25     25
     75#define r26     26
     76#define r27     27
     77#define r28     28
     78#define r29     29
     79#define r30     30
     80#define r31     31
    8181
    8282/* GPR Aliases */
    83 #define sp  1
     83#define sp      1
    8484
    8585/* Floating Point Registers (FPRs) */
    86 #define fr0   0
    87 #define fr1   1
    88 #define fr2   2
    89 #define fr3   3
    90 #define fr4   4
    91 #define fr5   5
    92 #define fr6   6
    93 #define fr7   7
    94 #define fr8   8
    95 #define fr9   9
    96 #define fr10  10
    97 #define fr11  11
    98 #define fr12  12
    99 #define fr13  13
    100 #define fr14  14
    101 #define fr15  15
    102 #define fr16  16
    103 #define fr17  17
    104 #define fr18  18
    105 #define fr19  19
    106 #define fr20  20
    107 #define fr21  21
    108 #define fr22  22
    109 #define fr23  23
    110 #define fr24  24
    111 #define fr25  25
    112 #define fr26  26
    113 #define fr27  27
    114 #define fr28  28
    115 #define fr29  29
    116 #define fr30  30
    117 #define fr31  31
    118 
    119 #define vr0   0
    120 #define vr1   1
    121 #define vr2   2
    122 #define vr3   3
    123 #define vr4   4
    124 #define vr5   5
    125 #define vr6   6
    126 #define vr7   7
    127 #define vr8   8
    128 #define vr9   9
    129 #define vr10  10
    130 #define vr11  11
    131 #define vr12  12
    132 #define vr13  13
    133 #define vr14  14
    134 #define vr15  15
    135 #define vr16  16
    136 #define vr17  17
    137 #define vr18  18
    138 #define vr19  19
    139 #define vr20  20
    140 #define vr21  21
    141 #define vr22  22
    142 #define vr23  23
    143 #define vr24  24
    144 #define vr25  25
    145 #define vr26  26
    146 #define vr27  27
    147 #define vr28  28
    148 #define vr29  29
    149 #define vr30  30
    150 #define vr31  31
    151 
    152 #define evr0   0
    153 #define evr1   1
    154 #define evr2   2
    155 #define evr3   3
    156 #define evr4   4
    157 #define evr5   5
    158 #define evr6   6
    159 #define evr7   7
    160 #define evr8   8
    161 #define evr9   9
    162 #define evr10  10
    163 #define evr11  11
    164 #define evr12  12
    165 #define evr13  13
    166 #define evr14  14
    167 #define evr15  15
    168 #define evr16  16
    169 #define evr17  17
    170 #define evr18  18
    171 #define evr19  19
    172 #define evr20  20
    173 #define evr21  21
    174 #define evr22  22
    175 #define evr23  23
    176 #define evr24  24
    177 #define evr25  25
    178 #define evr26  26
    179 #define evr27  27
    180 #define evr28  28
    181 #define evr29  29
    182 #define evr30  30
    183 #define evr31  31
     86#define fr0             0
     87#define fr1             1
     88#define fr2             2
     89#define fr3             3
     90#define fr4             4
     91#define fr5             5
     92#define fr6             6
     93#define fr7             7
     94#define fr8             8
     95#define fr9             9
     96#define fr10    10
     97#define fr11    11
     98#define fr12    12
     99#define fr13    13
     100#define fr14    14
     101#define fr15    15
     102#define fr16    16
     103#define fr17    17
     104#define fr18    18
     105#define fr19    19
     106#define fr20    20
     107#define fr21    21
     108#define fr22    22
     109#define fr23    23
     110#define fr24    24
     111#define fr25    25
     112#define fr26    26
     113#define fr27    27
     114#define fr28    28
     115#define fr29    29
     116#define fr30    30
     117#define fr31    31
     118
     119#define vr0             0
     120#define vr1             1
     121#define vr2             2
     122#define vr3             3
     123#define vr4             4
     124#define vr5             5
     125#define vr6             6
     126#define vr7             7
     127#define vr8             8
     128#define vr9             9
     129#define vr10    10
     130#define vr11    11
     131#define vr12    12
     132#define vr13    13
     133#define vr14    14
     134#define vr15    15
     135#define vr16    16
     136#define vr17    17
     137#define vr18    18
     138#define vr19    19
     139#define vr20    20
     140#define vr21    21
     141#define vr22    22
     142#define vr23    23
     143#define vr24    24
     144#define vr25    25
     145#define vr26    26
     146#define vr27    27
     147#define vr28    28
     148#define vr29    29
     149#define vr30    30
     150#define vr31    31
     151
     152#define evr0    0
     153#define evr1    1
     154#define evr2    2
     155#define evr3    3
     156#define evr4    4
     157#define evr5    5
     158#define evr6    6
     159#define evr7    7
     160#define evr8    8
     161#define evr9    9
     162#define evr10   10
     163#define evr11   11
     164#define evr12   12
     165#define evr13   13
     166#define evr14   14
     167#define evr15   15
     168#define evr16   16
     169#define evr17   17
     170#define evr18   18
     171#define evr19   19
     172#define evr20   20
     173#define evr21   21
     174#define evr22   22
     175#define evr23   23
     176#define evr24   24
     177#define evr25   25
     178#define evr26   26
     179#define evr27   27
     180#define evr28   28
     181#define evr29   29
     182#define evr30   30
     183#define evr31   31
    184184
    185185/* Special Purpose Registers (SPRs) */
    186 #define xer      1
    187 #define lr       8
    188 #define ctr      9
    189 #define dec      22
    190 #define sdr1     25
    191 #define srr0     26
    192 #define srr1     27
    193 #define sprg0    272
    194 #define sprg1    273
    195 #define sprg2    274
    196 #define sprg3    275
    197 #define prv      287
    198 #define ibat0u   528
    199 #define ibat0l   529
    200 #define ibat1u   530
    201 #define ibat1l   531
    202 #define ibat2u   532
    203 #define ibat2l   533
    204 #define ibat3u   534
    205 #define ibat3l   535
    206 #define dbat0u   536
    207 #define dbat0l   537
    208 #define dbat1u   538
    209 #define dbat1l   539
    210 #define dbat2u   540
    211 #define dbat2l   541
    212 #define dbat3u   542
    213 #define dbat3l   543
    214 #define tlbmiss  980
    215 #define ptehi    981
    216 #define ptelo    982
    217 #define hid0     1008
     186#define xer             1
     187#define lr              8
     188#define ctr             9
     189#define dec             22
     190#define sdr1    25
     191#define srr0    26
     192#define srr1    27
     193#define sprg0   272
     194#define sprg1   273
     195#define sprg2   274
     196#define sprg3   275
     197#define prv             287
     198#define ibat0u  528
     199#define ibat0l  529
     200#define ibat1u  530
     201#define ibat1l  531
     202#define ibat2u  532
     203#define ibat2l  533
     204#define ibat3u  534
     205#define ibat3l  535
     206#define dbat0u  536
     207#define dbat0l  537
     208#define dbat1u  538
     209#define dbat1l  539
     210#define dbat2u  540
     211#define dbat2l  541
     212#define dbat3u  542
     213#define dbat3l  543
     214#define tlbmiss 980
     215#define ptehi   981
     216#define ptelo   982
     217#define hid0    1008
    218218
    219219/* MSR bits */
    220 #define msr_dr  (1 << 4)
    221 #define msr_ir  (1 << 5)
    222 #define msr_pr  (1 << 14)
    223 #define msr_ee  (1 << 15)
     220#define msr_dr  (1 << 4)
     221#define msr_ir  (1 << 5)
     222#define msr_pr  (1 << 14)
     223#define msr_ee  (1 << 15)
    224224
    225225/* HID0 bits */
    226 #define hid0_sten  (1 << 24)
    227 #define hid0_ice   (1 << 15)
    228 #define hid0_dce   (1 << 14)
    229 #define hid0_icfi  (1 << 11)
    230 #define hid0_dci   (1 << 10)
     226#define hid0_sten       (1 << 24)
     227#define hid0_ice        (1 << 15)
     228#define hid0_dce        (1 << 14)
     229#define hid0_icfi       (1 << 11)
     230#define hid0_dci        (1 << 10)
    231231
    232232#endif
  • kernel/arch/ppc32/include/boot/boot.h

    rbc7d44c r207e208e  
    4141#define TEMP_STACK_SIZE  0x1000
    4242
    43 #define TASKMAP_MAX_RECORDS        32
    44 #define MEMMAP_MAX_RECORDS         32
    45 #define BOOTINFO_TASK_NAME_BUFLEN  32
     43#define TASKMAP_MAX_RECORDS  32
     44#define MEMMAP_MAX_RECORDS   32
    4645
    4746#ifndef __ASM__
    4847
     48#define BOOTINFO_TASK_NAME_BUFLEN 32
     49
    4950#include <arch/types.h>
    50 #include <config.h>
    51 #include <genarch/ofw/ofw_tree.h>
    5251
    5352typedef struct {
     
    7473
    7574typedef struct {
     75        uintptr_t addr;
     76        unsigned int width;
     77        unsigned int height;
     78        unsigned int bpp;
     79        unsigned int scanline;
     80} screen_t;
     81
     82typedef struct {
     83        uintptr_t addr;
     84        unsigned int size;
     85} macio_t;
     86
     87typedef struct {
    7688        memmap_t memmap;
    7789        taskmap_t taskmap;
    78         ballocs_t ballocs;
    79         ofw_tree_node_t *ofw_root;
     90        screen_t screen;
     91        macio_t macio;
    8092} bootinfo_t;
    8193
  • kernel/arch/ppc32/src/mm/tlb.c

    rbc7d44c r207e208e  
    4545static unsigned int seed = 10;
    4646static unsigned int seed_real __attribute__ ((section("K_UNMAPPED_DATA_START"))) = 42;
     47
     48
     49#define TLB_FLUSH \
     50        "tlbie %0\n" \
     51        "addi %0, %0, 0x1000\n"
    4752
    4853
     
    446451                "sync\n"
    447452               
    448                 ".rept 64\n"
    449                 "tlbie %0\n"
    450                 "addi %0, %0, 0x1000\n"
    451                 ".endr\n"
     453                TLB_FLUSH
     454                TLB_FLUSH
     455                TLB_FLUSH
     456                TLB_FLUSH
     457                TLB_FLUSH
     458                TLB_FLUSH
     459                TLB_FLUSH
     460                TLB_FLUSH
     461               
     462                TLB_FLUSH
     463                TLB_FLUSH
     464                TLB_FLUSH
     465                TLB_FLUSH
     466                TLB_FLUSH
     467                TLB_FLUSH
     468                TLB_FLUSH
     469                TLB_FLUSH
     470               
     471                TLB_FLUSH
     472                TLB_FLUSH
     473                TLB_FLUSH
     474                TLB_FLUSH
     475                TLB_FLUSH
     476                TLB_FLUSH
     477                TLB_FLUSH
     478                TLB_FLUSH
     479               
     480                TLB_FLUSH
     481                TLB_FLUSH
     482                TLB_FLUSH
     483                TLB_FLUSH
     484                TLB_FLUSH
     485                TLB_FLUSH
     486                TLB_FLUSH
     487                TLB_FLUSH
     488               
     489                TLB_FLUSH
     490                TLB_FLUSH
     491                TLB_FLUSH
     492                TLB_FLUSH
     493                TLB_FLUSH
     494                TLB_FLUSH
     495                TLB_FLUSH
     496                TLB_FLUSH
     497               
     498                TLB_FLUSH
     499                TLB_FLUSH
     500                TLB_FLUSH
     501                TLB_FLUSH
     502                TLB_FLUSH
     503                TLB_FLUSH
     504                TLB_FLUSH
     505                TLB_FLUSH
     506               
     507                TLB_FLUSH
     508                TLB_FLUSH
     509                TLB_FLUSH
     510                TLB_FLUSH
     511                TLB_FLUSH
     512                TLB_FLUSH
     513                TLB_FLUSH
     514                TLB_FLUSH
     515               
     516                TLB_FLUSH
     517                TLB_FLUSH
     518                TLB_FLUSH
     519                TLB_FLUSH
     520                TLB_FLUSH
     521                TLB_FLUSH
     522                TLB_FLUSH
     523                TLB_FLUSH
    452524               
    453525                "eieio\n"
  • kernel/arch/ppc32/src/ppc32.c

    rbc7d44c r207e208e  
    4141#include <genarch/fb/fb.h>
    4242#include <genarch/fb/visuals.h>
    43 #include <genarch/ofw/ofw_tree.h>
    44 #include <genarch/ofw/pci.h>
    4543#include <userspace.h>
    4644#include <proc/uarg.h>
     
    5149#include <macros.h>
    5250#include <string.h>
    53 #include <print.h>
    5451
    5552#define IRQ_COUNT  64
     
    6663       
    6764        for (i = 0; i < min3(bootinfo.taskmap.count, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); i++) {
    68                 init.tasks[i].addr = bootinfo.taskmap.tasks[i].addr;
     65                init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr);
    6966                init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
    7067                str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN,
    7168                    bootinfo.taskmap.tasks[i].name);
    7269        }
    73        
    74         /* Copy boot allocations info. */
    75         ballocs.base = bootinfo.ballocs.base;
    76         ballocs.size = bootinfo.ballocs.size;
    77        
    78         ofw_tree_init(bootinfo.ofw_root);
    7970}
    8071
     
    8374        /* Initialize dispatch table */
    8475        interrupt_init();
    85        
     76
    8677        /* Start decrementer */
    8778        start_decrementer();
    8879}
    8980
    90 static bool display_register(ofw_tree_node_t *node, void *arg)
    91 {
    92         uintptr_t fb_addr = 0;
    93         uint32_t fb_width = 0;
    94         uint32_t fb_height = 0;
    95         uint32_t fb_scanline = 0;
    96         unsigned int visual = VISUAL_UNKNOWN;
    97        
    98         ofw_tree_property_t *prop = ofw_tree_getprop(node, "address");
    99         if ((prop) && (prop->value))
    100                 fb_addr = *((uintptr_t *) prop->value);
    101        
    102         prop = ofw_tree_getprop(node, "width");
    103         if ((prop) && (prop->value))
    104                 fb_width = *((uint32_t *) prop->value);
    105        
    106         prop = ofw_tree_getprop(node, "height");
    107         if ((prop) && (prop->value))
    108                 fb_height = *((uint32_t *) prop->value);
    109        
    110         prop = ofw_tree_getprop(node, "depth");
    111         if ((prop) && (prop->value)) {
    112                 uint32_t fb_bpp = *((uint32_t *) prop->value);
    113                 switch (fb_bpp) {
    114                 case 8:
    115                         visual = VISUAL_INDIRECT_8;
    116                         break;
    117                 case 16:
    118                         visual = VISUAL_RGB_5_5_5_BE;
    119                         break;
    120                 case 24:
    121                         visual = VISUAL_BGR_8_8_8;
    122                         break;
    123                 case 32:
    124                         visual = VISUAL_RGB_0_8_8_8;
    125                         break;
    126                 default:
    127                         visual = VISUAL_UNKNOWN;
     81void arch_post_mm_init(void)
     82{
     83        if (config.cpu_active == 1) {
     84
     85#ifdef CONFIG_FB
     86                /* Initialize framebuffer */
     87                if (bootinfo.screen.addr) {
     88                        unsigned int visual;
     89                       
     90                        switch (bootinfo.screen.bpp) {
     91                        case 8:
     92                                visual = VISUAL_INDIRECT_8;
     93                                break;
     94                        case 16:
     95                                visual = VISUAL_RGB_5_5_5_BE;
     96                                break;
     97                        case 24:
     98                                visual = VISUAL_BGR_8_8_8;
     99                                break;
     100                        case 32:
     101                                visual = VISUAL_RGB_0_8_8_8;
     102                                break;
     103                        default:
     104                                panic("Unsupported bits per pixel.");
     105                        }
     106                        fb_properties_t prop = {
     107                                .addr = bootinfo.screen.addr,
     108                                .offset = 0,
     109                                .x = bootinfo.screen.width,
     110                                .y = bootinfo.screen.height,
     111                                .scan = bootinfo.screen.scanline,
     112                                .visual = visual,
     113                        };
     114                        fb_init(&prop);
    128115                }
    129         }
    130        
    131         prop = ofw_tree_getprop(node, "linebytes");
    132         if ((prop) && (prop->value))
    133                 fb_scanline = *((uint32_t *) prop->value);
    134        
    135         if ((fb_addr) && (fb_width > 0) && (fb_height > 0)
    136             && (fb_scanline > 0) && (visual != VISUAL_UNKNOWN)) {
    137                 fb_properties_t fb_prop = {
    138                         .addr = fb_addr,
    139                         .offset = 0,
    140                         .x = fb_width,
    141                         .y = fb_height,
    142                         .scan = fb_scanline,
    143                         .visual = visual,
    144                 };
    145                 fb_init(&fb_prop);
    146         }
    147        
    148         /* Consider only a single device for now */
    149         return false;
    150 }
    151 
    152 void arch_post_mm_init(void)
    153 {
    154         if (config.cpu_active == 1) {
    155 #ifdef CONFIG_FB
    156                 ofw_tree_walk_by_device_type("display", display_register, NULL);
    157116#endif
    158117               
     
    173132}
    174133
    175 static bool macio_register(ofw_tree_node_t *node, void *arg)
    176 {
    177         ofw_pci_reg_t *assigned_address = NULL;
    178        
    179         ofw_tree_property_t *prop = ofw_tree_getprop(node, "assigned-addresses");
    180         if ((prop) && (prop->value))
    181                 assigned_address = ((ofw_pci_reg_t *) prop->value);
    182        
    183         if (assigned_address) {
     134void arch_post_smp_init(void)
     135{
     136        if (bootinfo.macio.addr) {
    184137                /* Initialize PIC */
    185138                cir_t cir;
    186139                void *cir_arg;
    187                 pic_init(assigned_address[0].addr, PAGE_SIZE, &cir, &cir_arg);
    188                
     140                pic_init(bootinfo.macio.addr, PAGE_SIZE, &cir, &cir_arg);
     141
    189142#ifdef CONFIG_MAC_KBD
    190                 uintptr_t pa = assigned_address[0].addr + 0x16000;
     143                uintptr_t pa = bootinfo.macio.addr + 0x16000;
    191144                uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE);
    192145                size_t offset = pa - aligned_addr;
    193146                size_t size = 2 * PAGE_SIZE;
    194                
     147                       
    195148                cuda_t *cuda = (cuda_t *)
    196149                    (hw_map(aligned_addr, offset + size) + offset);
    197                
     150                       
    198151                /* Initialize I/O controller */
    199152                cuda_instance_t *cuda_instance =
     
    210163#endif
    211164        }
    212        
    213         /* Consider only a single device for now */
    214         return false;
    215 }
    216 
    217 void arch_post_smp_init(void)
    218 {
    219         ofw_tree_walk_by_device_type("mac-io", macio_register, NULL);
    220165}
    221166
  • kernel/arch/sparc64/include/drivers/fhc.h

    rbc7d44c r207e208e  
    2727 */
    2828
    29 /** @addtogroup sparc64
     29/** @addtogroup sparc64 
    3030 * @{
    3131 */
  • kernel/arch/sparc64/src/drivers/fhc.c

    rbc7d44c r207e208e  
    4646#include <arch/types.h>
    4747#include <genarch/ofw/ofw_tree.h>
    48 #include <genarch/ofw/fhc.h>
    4948#include <sysinfo/sysinfo.h>
    5049
  • kernel/arch/sparc64/src/drivers/kbd.c

    rbc7d44c r207e208e  
    3535#include <arch/drivers/kbd.h>
    3636#include <genarch/ofw/ofw_tree.h>
    37 #include <genarch/ofw/fhc.h>
    38 #include <genarch/ofw/ebus.h>
     37
     38#ifdef CONFIG_SUN_KBD
     39#include <genarch/kbrd/kbrd.h>
     40#endif
     41#ifdef CONFIG_Z8530
     42#include <genarch/drivers/z8530/z8530.h>
     43#endif
     44#ifdef CONFIG_NS16550
     45#include <genarch/drivers/ns16550/ns16550.h>
     46#endif
     47
    3948#include <console/console.h>
    4049#include <ddi/irq.h>
     
    4756
    4857#ifdef CONFIG_SUN_KBD
    49 #include <genarch/kbrd/kbrd.h>
    50 #endif
    51 
    52 #ifdef CONFIG_Z8530
    53 #include <genarch/drivers/z8530/z8530.h>
    54 #endif
    55 
    56 #ifdef CONFIG_NS16550
    57 #include <genarch/drivers/ns16550/ns16550.h>
    58 #endif
    59 
    60 #ifdef CONFIG_SUN_KBD
    6158
    6259#ifdef CONFIG_Z8530
  • kernel/arch/sparc64/src/drivers/pci.c

    rbc7d44c r207e208e  
    3737#include <arch/drivers/pci.h>
    3838#include <genarch/ofw/ofw_tree.h>
    39 #include <genarch/ofw/upa.h>
    4039#include <arch/trap/interrupt.h>
    4140#include <mm/page.h>
  • kernel/arch/sparc64/src/drivers/scr.c

    rbc7d44c r207e208e  
    3535#include <arch/drivers/scr.h>
    3636#include <genarch/ofw/ofw_tree.h>
    37 #include <genarch/ofw/pci.h>
    38 #include <genarch/ofw/sbus.h>
    39 #include <genarch/ofw/upa.h>
    4037#include <genarch/fb/fb.h>
    4138#include <genarch/fb/visuals.h>
  • kernel/arch/sparc64/src/drivers/sgcn.c

    rbc7d44c r207e208e  
    380380        sysinfo_set_item_val("fb.kind", NULL, 4);
    381381
    382         outdev_initialize("sgcnout", &sgcnout, &sgcnout_ops);
    383         stdout_wire(&sgcnout);
     382        outdev_initialize("sgcnout", &sgcnout, &sgcnout_ops);   
     383        stdout = &sgcnout;
    384384}
    385385
  • kernel/genarch/Makefile.inc

    rbc7d44c r207e208e  
    130130ifeq ($(CONFIG_OFW_TREE),y)
    131131        GENARCH_SOURCES += \
    132                 genarch/src/ofw/ofw_tree.c
    133 endif
    134 
    135 ifeq ($(CONFIG_OFW_PCI),y)
    136         GENARCH_SOURCES += \
     132                genarch/src/ofw/ofw_tree.c \
    137133                genarch/src/ofw/ebus.c \
    138134                genarch/src/ofw/fhc.c \
    139135                genarch/src/ofw/pci.c  \
    140136                genarch/src/ofw/sbus.c \
    141                 genarch/src/ofw/upa.c
     137                genarch/src/ofw/upa.c 
    142138endif
    143139
  • kernel/genarch/include/fb/fb.h

    rbc7d44c r207e208e  
    6868
    6969void fb_redraw(void);
    70 bool fb_init(fb_properties_t *props);
     70void fb_init(fb_properties_t *props);
    7171
    7272#endif
  • kernel/genarch/include/fb/visuals.h

    rbc7d44c r207e208e  
    3737
    3838typedef enum {
    39         VISUAL_UNKNOWN = 0,
    4039        VISUAL_INDIRECT_8,
    4140        VISUAL_RGB_5_5_5_LE,
  • kernel/genarch/include/ofw/ofw_tree.h

    rbc7d44c r207e208e  
    3131
    3232#include <arch/types.h>
     33#include <ddi/irq.h>
    3334#include <typedefs.h>
    3435
    35 #define OFW_TREE_PROPERTY_MAX_NAMELEN  32
    36 
    37 /** Memory representation of OpenFirmware device tree node property. */
    38 typedef struct {
    39         char name[OFW_TREE_PROPERTY_MAX_NAMELEN];
    40         size_t size;
    41         void *value;
    42 } ofw_tree_property_t;
     36#define OFW_TREE_PROPERTY_MAX_NAMELEN   32
     37
     38typedef struct ofw_tree_node ofw_tree_node_t;
     39typedef struct ofw_tree_property ofw_tree_property_t;
    4340
    4441/** Memory representation of OpenFirmware device tree node. */
    45 typedef struct ofw_tree_node {
    46         struct ofw_tree_node *parent;
    47         struct ofw_tree_node *peer;
    48         struct ofw_tree_node *child;
    49        
    50         uint32_t node_handle;           /**< Old OpenFirmware node handle. */
    51        
    52         char *da_name;                  /**< Disambigued name. */
    53        
    54         unsigned int properties;        /**< Number of properties. */
     42struct ofw_tree_node {
     43        ofw_tree_node_t *parent;
     44        ofw_tree_node_t *peer;
     45        ofw_tree_node_t *child;
     46
     47        uint32_t node_handle;           /**< Old OpenFirmware node handle. */
     48
     49        char *da_name;                  /**< Disambigued name. */
     50
     51        unsigned properties;            /**< Number of properties. */
    5552        ofw_tree_property_t *property;
    5653       
     
    6057         */
    6158        void *device;
    62 } ofw_tree_node_t;
    63 
    64 /* Walker for visiting OpenFirmware device tree nodes. */
    65 typedef bool (* ofw_tree_walker_t)(ofw_tree_node_t *, void *);
     59};
     60
     61/** Memory representation of OpenFirmware device tree node property. */
     62struct ofw_tree_property {
     63        char name[OFW_TREE_PROPERTY_MAX_NAMELEN];
     64        size_t size;
     65        void *value;
     66};
     67
     68/*
     69 * Definition of 'reg' and 'ranges' properties for various buses.
     70 */
     71 
     72struct ofw_fhc_reg {
     73        uint64_t addr;
     74        uint32_t size;
     75} __attribute__ ((packed));
     76typedef struct ofw_fhc_reg ofw_fhc_reg_t;
     77                       
     78struct ofw_fhc_range {
     79        uint64_t child_base;
     80        uint64_t parent_base;
     81        uint32_t size;
     82} __attribute__ ((packed));
     83typedef struct ofw_fhc_range ofw_fhc_range_t;
     84
     85struct ofw_central_reg {
     86        uint64_t addr;
     87        uint32_t size;
     88} __attribute__ ((packed));
     89typedef struct ofw_central_reg ofw_central_reg_t;
     90
     91struct ofw_central_range {
     92        uint64_t child_base;
     93        uint64_t parent_base;
     94        uint32_t size;
     95} __attribute__ ((packed));
     96typedef struct ofw_central_range ofw_central_range_t;
     97
     98struct ofw_ebus_reg {
     99        uint32_t space;
     100        uint32_t addr;
     101        uint32_t size;
     102} __attribute__ ((packed));
     103typedef struct ofw_ebus_reg ofw_ebus_reg_t;
     104
     105struct ofw_ebus_range {
     106        uint32_t child_space;
     107        uint32_t child_base;
     108        uint32_t parent_space;
     109        uint64_t parent_base;   /* group phys.mid and phys.lo together */
     110        uint32_t size;
     111} __attribute__ ((packed));
     112typedef struct ofw_ebus_range ofw_ebus_range_t;
     113
     114struct ofw_ebus_intr_map {
     115        uint32_t space;
     116        uint32_t addr;
     117        uint32_t intr;
     118        uint32_t controller_handle;
     119        uint32_t controller_ino;
     120} __attribute__ ((packed));
     121typedef struct ofw_ebus_intr_map ofw_ebus_intr_map_t;
     122
     123struct ofw_ebus_intr_mask {
     124        uint32_t space_mask;
     125        uint32_t addr_mask;
     126        uint32_t intr_mask;
     127} __attribute__ ((packed));
     128typedef struct ofw_ebus_intr_mask ofw_ebus_intr_mask_t;
     129
     130struct ofw_pci_reg {
     131        uint32_t space;         /* needs to be masked to obtain pure space id */
     132        uint64_t addr;          /* group phys.mid and phys.lo together */
     133        uint64_t size;
     134} __attribute__ ((packed));
     135typedef struct ofw_pci_reg ofw_pci_reg_t;
     136
     137struct ofw_pci_range {
     138        uint32_t space;
     139        uint64_t child_base;    /* group phys.mid and phys.lo together */
     140        uint64_t parent_base;
     141        uint64_t size;
     142} __attribute__ ((packed));
     143typedef struct ofw_pci_range ofw_pci_range_t;
     144
     145struct ofw_sbus_reg {
     146        uint64_t addr;
     147        uint32_t size;
     148} __attribute__ ((packed));
     149typedef struct ofw_sbus_reg ofw_sbus_reg_t;
     150
     151struct ofw_sbus_range {
     152        uint64_t child_base;
     153        uint64_t parent_base;
     154        uint32_t size;
     155} __attribute__ ((packed));
     156typedef struct ofw_sbus_range ofw_sbus_range_t;
     157
     158struct ofw_upa_reg {
     159        uint64_t addr;
     160        uint64_t size;
     161} __attribute__ ((packed));
     162typedef struct ofw_upa_reg ofw_upa_reg_t;
    66163
    67164extern void ofw_tree_init(ofw_tree_node_t *);
    68165extern void ofw_tree_print(void);
    69 
    70166extern const char *ofw_tree_node_name(const ofw_tree_node_t *);
    71167extern ofw_tree_node_t *ofw_tree_lookup(const char *);
    72168extern ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *,
    73169    const char *);
    74 extern void ofw_tree_walk_by_device_type(const char *, ofw_tree_walker_t,
    75     void *);
    76 
    77170extern ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *, const char *);
    78171extern ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *,
    79172    const char *);
    80 
    81173extern ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *,
    82174    const char *);
    83 extern ofw_tree_node_t *ofw_tree_find_peer_by_name(ofw_tree_node_t *,
    84     const char *);
     175extern ofw_tree_node_t *ofw_tree_find_peer_by_name(ofw_tree_node_t *node,
     176    const char *name);
    85177extern ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *,
    86178    uint32_t);
    87179
     180extern bool ofw_fhc_apply_ranges(ofw_tree_node_t *, ofw_fhc_reg_t *,
     181    uintptr_t *);
     182extern bool ofw_central_apply_ranges(ofw_tree_node_t *, ofw_central_reg_t *,
     183    uintptr_t *);
     184extern bool ofw_ebus_apply_ranges(ofw_tree_node_t *, ofw_ebus_reg_t *,
     185    uintptr_t *);
     186extern bool ofw_pci_apply_ranges(ofw_tree_node_t *, ofw_pci_reg_t *,
     187    uintptr_t *);
     188extern bool ofw_sbus_apply_ranges(ofw_tree_node_t *, ofw_sbus_reg_t *,
     189    uintptr_t *);
     190extern bool ofw_upa_apply_ranges(ofw_tree_node_t *, ofw_upa_reg_t *,
     191    uintptr_t *);
     192
     193extern bool ofw_pci_reg_absolutize(ofw_tree_node_t *, ofw_pci_reg_t *,
     194    ofw_pci_reg_t *);
     195
     196extern bool ofw_fhc_map_interrupt(ofw_tree_node_t *, ofw_fhc_reg_t *,
     197    uint32_t, int *, cir_t *, void **);
     198extern bool ofw_ebus_map_interrupt(ofw_tree_node_t *, ofw_ebus_reg_t *,
     199    uint32_t, int *, cir_t *, void **);
     200extern bool ofw_pci_map_interrupt(ofw_tree_node_t *, ofw_pci_reg_t *,
     201    int, int *, cir_t *, void **);
     202
    88203#endif
  • kernel/genarch/src/drivers/dsrln/dsrlnout.c

    rbc7d44c r207e208e  
    6666       
    6767        outdev_initialize("dsrlnout", &dsrlnout_console, &dsrlnout_ops);
    68         stdout_wire(&dsrlnout_console);
     68        stdout = &dsrlnout_console;
    6969       
    7070        sysinfo_set_item_val("fb", NULL, true);
  • kernel/genarch/src/drivers/ega/ega.c

    rbc7d44c r207e208e  
    567567       
    568568        outdev_initialize("ega", &ega_console, &ega_ops);
    569         stdout_wire(&ega_console);
     569        stdout = &ega_console;
    570570       
    571571        sysinfo_set_item_val("fb", NULL, true);
  • kernel/genarch/src/fb/fb.c

    rbc7d44c r207e208e  
    458458 *
    459459 */
    460 bool fb_init(fb_properties_t *props)
    461 {
    462         ASSERT(props);
    463         ASSERT(props->x > 0);
    464         ASSERT(props->y > 0);
    465         ASSERT(props->scan > 0);
    466        
     460void fb_init(fb_properties_t *props)
     461{
    467462        switch (props->visual) {
    468463        case VISUAL_INDIRECT_8:
     
    511506                break;
    512507        default:
    513                 LOG("Unsupported visual.");
    514                 return false;
     508                panic("Unsupported visual.");
    515509        }
    516510       
     
    542536        size_t glyphsize = FONT_GLYPHS * glyphbytes;
    543537       
     538        backbuf = (uint16_t *) malloc(bbsize, 0);
     539        if (!backbuf)
     540                panic("Unable to allocate backbuffer.");
     541       
     542        glyphs = (uint8_t *) malloc(glyphsize, 0);
     543        if (!glyphs)
     544                panic("Unable to allocate glyphs.");
     545       
     546        bgscan = malloc(bgscanbytes, 0);
     547        if (!bgscan)
     548                panic("Unable to allocate background pixel.");
     549       
     550        memsetw(backbuf, cols * rows, 0);
     551       
     552        glyphs_render();
     553       
    544554        fb_addr = (uint8_t *) hw_map((uintptr_t) props->addr, fbsize);
    545         if (!fb_addr) {
    546                 LOG("Unable to map framebuffer.");
    547                 return false;
    548         }
    549        
    550         backbuf = (uint16_t *) malloc(bbsize, 0);
    551         if (!backbuf) {
    552                 LOG("Unable to allocate backbuffer.");
    553                 return false;
    554         }
    555        
    556         glyphs = (uint8_t *) malloc(glyphsize, 0);
    557         if (!glyphs) {
    558                 free(backbuf);
    559                 LOG("Unable to allocate glyphs.");
    560                 return false;
    561         }
    562        
    563         bgscan = malloc(bgscanbytes, 0);
    564         if (!bgscan) {
    565                 free(glyphs);
    566                 free(backbuf);
    567                 LOG("Unable to allocate background pixel.");
    568                 return false;
    569         }
    570        
    571         memsetw(backbuf, cols * rows, 0);
    572         glyphs_render();
    573555       
    574556        sysinfo_set_item_val("fb", NULL, true);
     
    583565       
    584566        outdev_initialize("fb", &fb_console, &fb_ops);
    585         stdout_wire(&fb_console);
    586        
    587         return true;
     567        stdout = &fb_console;
    588568}
    589569
  • kernel/genarch/src/ofw/ebus.c

    rbc7d44c r207e208e  
    3737
    3838#include <genarch/ofw/ofw_tree.h>
    39 #include <genarch/ofw/ebus.h>
    40 #include <genarch/ofw/pci.h>
    4139#include <arch/memstr.h>
     40#include <arch/trap/interrupt.h>
    4241#include <string.h>
    4342#include <panic.h>
  • kernel/genarch/src/ofw/fhc.c

    rbc7d44c r207e208e  
    3737
    3838#include <genarch/ofw/ofw_tree.h>
    39 #include <genarch/ofw/fhc.h>
    4039#include <arch/drivers/fhc.h>
    4140#include <arch/memstr.h>
  • kernel/genarch/src/ofw/ofw_tree.c

    rbc7d44c r207e208e  
    3232/**
    3333 * @file
    34  * @brief OpenFirmware device tree navigation.
     34 * @brief       OpenFirmware device tree navigation.
    3535 *
    3636 */
     
    4040#include <mm/slab.h>
    4141#include <string.h>
     42#include <print.h>
    4243#include <panic.h>
    43 #include <print.h>
    44 
    45 #define PATH_MAX_LEN  256
    46 #define NAME_BUF_LEN  50
     44
     45#define PATH_MAX_LEN    80
     46#define NAME_BUF_LEN    50
    4747
    4848static ofw_tree_node_t *ofw_root;
     
    5555/** Get OpenFirmware node property.
    5656 *
    57  * @param node Node in which to lookup the property.
    58  * @param name Name of the property.
    59  *
    60  * @return Pointer to the property structure or NULL if no such
    61  *         property.
    62  *
    63  */
    64 ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node,
    65     const char *name)
     57 * @param node          Node in which to lookup the property.
     58 * @param name          Name of the property.
     59 *
     60 * @return              Pointer to the property structure or NULL if no such
     61 *                      property.
     62 */
     63ofw_tree_property_t *
     64ofw_tree_getprop(const ofw_tree_node_t *node, const char *name)
    6665{
    6766        unsigned int i;
     
    7170                        return &node->property[i];
    7271        }
    73        
     72
    7473        return NULL;
    7574}
     
    7776/** Return value of the 'name' property.
    7877 *
    79  * @param node Node of interest.
    80  *
    81  * @return Value of the 'name' property belonging to the node
    82  *         or NULL if the property is invalid.
    83  *
     78 * @param node          Node of interest.
     79 *
     80 * @return              Value of the 'name' property belonging to the node.
    8481 */
    8582const char *ofw_tree_node_name(const ofw_tree_node_t *node)
    8683{
    87         ofw_tree_property_t *prop = ofw_tree_getprop(node, "name");
    88         if ((!prop) || (prop->size < 2))
    89                 return NULL;
     84        ofw_tree_property_t *prop;
     85       
     86        prop = ofw_tree_getprop(node, "name");
     87        if (!prop)
     88                panic("Node without name property.");
     89               
     90        if (prop->size < 2)
     91                panic("Invalid name property.");
    9092       
    9193        return prop->value;
     
    9496/** Lookup child of given name.
    9597 *
    96  * @param node Node whose child is being looked up.
    97  * @param name Name of the child being looked up.
    98  *
    99  * @return NULL if there is no such child or pointer to the
    100  *         matching child node.
    101  *
    102  */
    103 ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node,
    104     const char *name)
     98 * @param node          Node whose child is being looked up.
     99 * @param name          Name of the child being looked up.
     100 *
     101 * @return              NULL if there is no such child or pointer to the
     102 *                      matching child node.
     103 */
     104ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name)
    105105{
    106106        ofw_tree_node_t *cur;
     
    125125                        return cur;
    126126        }
    127        
     127               
    128128        return NULL;
    129129}
     
    131131/** Lookup first child of given device type.
    132132 *
    133  * @param node  Node whose child is being looked up.
    134  * @param dtype Device type of the child being looked up.
    135  *
    136  * @return NULL if there is no such child or pointer to the
    137  *         matching child node.
    138  *
    139  */
    140 ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node,
    141     const char *dtype)
    142 {
    143         ofw_tree_node_t *cur;
     133 * @param node          Node whose child is being looked up.
     134 * @param name          Device type of the child being looked up.
     135 *
     136 * @return              NULL if there is no such child or pointer to the
     137 *                      matching child node.
     138 */
     139ofw_tree_node_t *
     140ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name)
     141{
     142        ofw_tree_node_t *cur;
     143        ofw_tree_property_t *prop;
    144144       
    145145        for (cur = node->child; cur; cur = cur->peer) {
    146                 ofw_tree_property_t *prop =
    147                     ofw_tree_getprop(cur, "device_type");
    148                
    149                 if ((!prop) || (!prop->value))
     146                prop = ofw_tree_getprop(cur, "device_type");
     147                if (!prop || !prop->value)
    150148                        continue;
    151                
    152                 if (str_cmp(prop->value, dtype) == 0)
    153                         return cur;
    154         }
    155        
     149                if (str_cmp(prop->value, name) == 0)
     150                        return cur;
     151        }
     152                       
    156153        return NULL;
    157154}
     
    162159 * are looked up iteratively to avoid stack overflow.
    163160 *
    164  * @param root   Root of the searched subtree.
    165  * @param handle OpenFirmware handle.
    166  *
    167  * @return NULL if there is no such node or pointer to the matching
    168  *         node.
    169  *
    170  */
    171 ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root,
    172     uint32_t handle)
    173 {
    174         ofw_tree_node_t *cur;
    175        
    176         for (cur = root; cur; cur = cur->peer) {
     161 * @param root          Root of the searched subtree.
     162 * @param handle        OpenFirmware handle.
     163 *
     164 * @return              NULL if there is no such node or pointer to the matching
     165 *                      node.
     166 */
     167ofw_tree_node_t *
     168ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle)
     169{
     170        ofw_tree_node_t *cur;
     171
     172        for (cur = root; cur; cur = cur->peer) {               
    177173                if (cur->node_handle == handle)
    178174                        return cur;
    179                
     175
    180176                if (cur->child) {
    181                         ofw_tree_node_t *node
    182                             = ofw_tree_find_node_by_handle(cur->child, handle);
     177                        ofw_tree_node_t *node;
     178                       
     179                        node = ofw_tree_find_node_by_handle(cur->child, handle);
    183180                        if (node)
    184181                                return node;
     
    186183        }
    187184       
    188         return NULL;
     185        return NULL;   
    189186}
    190187
    191188/** Lookup first peer of given device type.
    192189 *
    193  * @param node  Node whose peer is being looked up.
    194  * @param dtype Device type of the child being looked up.
    195  *
    196  * @return NULL if there is no such child or pointer to the
    197  *         matching child node.
    198  *
    199  */
    200 ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node,
    201     const char *dtype)
    202 {
    203         ofw_tree_node_t *cur;
     190 * @param node          Node whose peer is being looked up.
     191 * @param name          Device type of the child being looked up.
     192 *
     193 * @return              NULL if there is no such child or pointer to the
     194 *                      matching child node.
     195 */
     196ofw_tree_node_t *
     197ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name)
     198{
     199        ofw_tree_node_t *cur;
     200        ofw_tree_property_t *prop;
    204201       
    205202        for (cur = node->peer; cur; cur = cur->peer) {
    206                 ofw_tree_property_t *prop =
    207                     ofw_tree_getprop(cur, "device_type");
    208                
    209                 if ((!prop) || (!prop->value))
     203                prop = ofw_tree_getprop(cur, "device_type");
     204                if (!prop || !prop->value)
    210205                        continue;
    211                
    212                 if (str_cmp(prop->value, dtype) == 0)
    213                         return cur;
    214         }
    215        
    216         return NULL;
    217 }
     206                if (str_cmp(prop->value, name) == 0)
     207                        return cur;
     208        }
     209                       
     210        return NULL;
     211}
     212
    218213
    219214/** Lookup first peer of given name.
    220215 *
    221  * @param node Node whose peer is being looked up.
    222  * @param name Name of the child being looked up.
    223  *
    224  * @return NULL if there is no such peer or pointer to the matching
    225  *         peer node.
    226  *
    227  */
    228 ofw_tree_node_t *ofw_tree_find_peer_by_name(ofw_tree_node_t *node,
    229     const char *name)
    230 {
    231         ofw_tree_node_t *cur;
     216 * @param node          Node whose peer is being looked up.
     217 * @param name          Name of the child being looked up.
     218 *
     219 * @return              NULL if there is no such peer or pointer to the matching
     220 *                      peer node.
     221 */
     222ofw_tree_node_t *
     223ofw_tree_find_peer_by_name(ofw_tree_node_t *node, const char *name)
     224{
     225        ofw_tree_node_t *cur;
     226        ofw_tree_property_t *prop;
    232227       
    233228        for (cur = node->peer; cur; cur = cur->peer) {
    234                 ofw_tree_property_t *prop
    235                     = ofw_tree_getprop(cur, "name");
    236                
    237                 if ((!prop) || (!prop->value))
     229                prop = ofw_tree_getprop(cur, "name");
     230                if (!prop || !prop->value)
    238231                        continue;
    239                
    240232                if (str_cmp(prop->value, name) == 0)
    241233                        return cur;
    242234        }
    243        
     235                       
    244236        return NULL;
    245237}
     
    247239/** Lookup OpenFirmware node by its path.
    248240 *
    249  * @param path Path to the node.
    250  *
    251  * @return NULL if there is no such node or pointer to the leaf
    252  *         node.
    253  *
     241 * @param path          Path to the node.
     242 *
     243 * @return              NULL if there is no such node or pointer to the leaf
     244 *                      node.
    254245 */
    255246ofw_tree_node_t *ofw_tree_lookup(const char *path)
    256247{
    257         if (path[0] != '/')
    258                 return NULL;
    259        
     248        char buf[NAME_BUF_LEN + 1];
    260249        ofw_tree_node_t *node = ofw_root;
    261250        size_t i;
    262251        size_t j;
     252       
     253        if (path[0] != '/')
     254                return NULL;
    263255       
    264256        for (i = 1; (i < str_size(path)) && (node); i = j + 1) {
     
    269261                        continue;
    270262               
    271                 char buf[NAME_BUF_LEN + 1];
    272263                memcpy(buf, &path[i], j - i);
    273264                buf[j - i] = 0;
     
    278269}
    279270
    280 /** Walk the OpenFirmware device subtree rooted in a node.
     271/** Print OpenFirmware device subtree rooted in a node.
    281272 *
    282273 * Child nodes are processed recursively and peer nodes are processed
    283274 * iteratively in order to avoid stack overflow.
    284275 *
    285  * @param node   Root of the subtree.
    286  * @param dtype  Device type to look for.
    287  * @param walker Routine to be invoked on found device.
    288  * @param arg    User argument to the walker.
    289  *
    290  * @return True if the walk should continue.
    291  *
    292  */
    293 static bool ofw_tree_walk_by_device_type_internal(ofw_tree_node_t *node,
    294     const char *dtype, ofw_tree_walker_t walker, void *arg)
    295 {
    296         ofw_tree_node_t *cur;
    297        
     276 * @param node          Root of the subtree.
     277 * @param path          Current path, NULL for the very root of the entire tree.
     278 */
     279static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path)
     280{
     281        char *p;
     282        const ofw_tree_node_t *cur;
     283
     284        p = (char *) malloc(PATH_MAX_LEN, 0);
     285
    298286        for (cur = node; cur; cur = cur->peer) {
    299                 ofw_tree_property_t *prop =
    300                     ofw_tree_getprop(cur, "device_type");
    301                
    302                 if ((prop) && (prop->value) && (str_cmp(prop->value, dtype) == 0)) {
    303                         bool ret = walker(cur, arg);
    304                         if (!ret)
    305                                 return false;
    306                 }
    307                
    308                 if (cur->child) {
    309                         bool ret =
    310                             ofw_tree_walk_by_device_type_internal(cur->child, dtype, walker, arg);
    311                         if (!ret)
    312                                 return false;
    313                 }
    314         }
    315        
    316         return true;
    317 }
    318 
    319 /** Walk the OpenFirmware device tree and find devices by type.
    320  *
    321  * Walk the whole OpenFirmware device tree and if any node has
    322  * the property "device_type" equal to dtype, run a walker on it.
    323  * If the walker returns false, the walk does not continue.
    324  *
    325  * @param dtype  Device type to look for.
    326  * @param walker Routine to be invoked on found device.
    327  * @param arg    User argument to the walker.
    328  *
    329  */
    330 void ofw_tree_walk_by_device_type(const char *dtype, ofw_tree_walker_t walker,
    331     void *arg)
    332 {
    333         (void) ofw_tree_walk_by_device_type_internal(ofw_root, dtype, walker, arg);
    334 }
    335 
    336 /** Print OpenFirmware device subtree rooted in a node.
    337  *
    338  * Child nodes are processed recursively and peer nodes are processed
    339  * iteratively in order to avoid stack overflow.
    340  *
    341  * @param node Root of the subtree.
    342  * @param path Current path, NULL for the very root of the entire tree.
    343  *
    344  */
    345 static void ofw_tree_node_print(ofw_tree_node_t *node, const char *path)
    346 {
    347         char *cur_path = (char *) malloc(PATH_MAX_LEN, 0);
    348         ofw_tree_node_t *cur;
    349        
    350         for (cur = node; cur; cur = cur->peer) {
    351                 if ((cur->parent) && (path)) {
    352                         snprintf(cur_path, PATH_MAX_LEN, "%s/%s", path, cur->da_name);
    353                         printf("%s\n", cur_path);
     287                if (cur->parent) {
     288                        snprintf(p, PATH_MAX_LEN, "%s/%s", path, cur->da_name);
     289                        printf("%s\n", p);
    354290                } else {
    355                         snprintf(cur_path, PATH_MAX_LEN, "%s", cur->da_name);
     291                        snprintf(p, PATH_MAX_LEN, "%s", cur->da_name);
    356292                        printf("/\n");
    357293                }
    358                
     294
    359295                if (cur->child)
    360                         ofw_tree_node_print(cur->child, cur_path);
    361         }
    362        
    363         free(cur_path);
     296                        ofw_tree_node_print(cur->child, p);
     297        }
     298
     299        free(p);
    364300}
    365301
  • kernel/genarch/src/ofw/pci.c

    rbc7d44c r207e208e  
    3737
    3838#include <genarch/ofw/ofw_tree.h>
    39 #include <genarch/ofw/pci.h>
    4039#include <arch/drivers/pci.h>
    4140#include <arch/trap/interrupt.h>
  • kernel/genarch/src/ofw/sbus.c

    rbc7d44c r207e208e  
    3737
    3838#include <genarch/ofw/ofw_tree.h>
    39 #include <genarch/ofw/sbus.h>
    4039#include <macros.h>
    4140
  • kernel/genarch/src/ofw/upa.c

    rbc7d44c r207e208e  
    3737
    3838#include <genarch/ofw/ofw_tree.h>
    39 #include <genarch/ofw/upa.h>
    4039#include <arch/memstr.h>
    4140#include <func.h>
  • kernel/generic/include/console/chardev.h

    rbc7d44c r207e208e  
    3636#define KERN_CHARDEV_H_
    3737
    38 #include <adt/list.h>
    3938#include <arch/types.h>
    4039#include <synch/waitq.h>
     
    7675} outdev_operations_t;
    7776
    78 /** Character output device. */
     77/** Character input device. */
    7978typedef struct outdev {
    8079        char *name;
     
    8281        /** Protects everything below. */
    8382        SPINLOCK_DECLARE(lock);
    84        
    85         /** Fields suitable for multiplexing. */
    86         link_t link;
    87         link_t list;
    8883       
    8984        /** Implementation of outdev operations. */
  • kernel/generic/include/console/console.h

    rbc7d44c r207e208e  
    4444
    4545extern indev_t *stdin_wire(void);
    46 extern void stdout_wire(outdev_t *outdev);
    4746extern void console_init(void);
    4847
  • kernel/generic/src/console/chardev.c

    rbc7d44c r207e208e  
    3333 */
    3434
    35 #include <adt/list.h>
    3635#include <console/chardev.h>
    3736#include <synch/waitq.h>
     
    135134        outdev->name = name;
    136135        spinlock_initialize(&outdev->lock, "outdev");
    137         link_initialize(&outdev->link);
    138         list_initialize(&outdev->list);
    139136        outdev->op = op;
    140137}
  • kernel/generic/src/console/console.c

    rbc7d44c r207e208e  
    7676static parea_t klog_parea;
    7777
    78 static indev_t stdin_sink;
    79 static outdev_t stdout_source;
    80 
    8178static indev_operations_t stdin_ops = {
    8279        .poll = NULL
    8380};
    8481
    85 static void stdout_write(outdev_t *dev, wchar_t ch, bool silent);
    86 
    87 static outdev_operations_t stdout_ops = {
    88         .write = stdout_write
    89 };
    90 
    9182/** Silence output */
    9283bool silent = false;
     
    9990{
    10091        if (stdin == NULL) {
    101                 indev_initialize("stdin", &stdin_sink, &stdin_ops);
    102                 stdin = &stdin_sink;
     92                stdin = malloc(sizeof(indev_t), FRAME_ATOMIC);
     93                if (stdin != NULL)
     94                        indev_initialize("stdin", stdin, &stdin_ops);
    10395        }
    10496       
    10597        return stdin;
    106 }
    107 
    108 void stdout_wire(outdev_t *outdev)
    109 {
    110         if (stdout == NULL) {
    111                 outdev_initialize("stdout", &stdout_source, &stdout_ops);
    112                 stdout = &stdout_source;
    113         }
    114        
    115         list_append(&outdev->link, &stdout->list);
    116 }
    117 
    118 static void stdout_write(outdev_t *dev, wchar_t ch, bool silent)
    119 {
    120         link_t *cur;
    121        
    122         for (cur = dev->list.next; cur != &dev->list; cur = cur->next) {
    123                 outdev_t *sink = list_get_instance(cur, outdev_t, link);
    124                 sink->op->write(sink, ch, silent);
    125         }
    12698}
    12799
Note: See TracChangeset for help on using the changeset viewer.