Changeset 272c219 in mainline


Ignore:
Timestamp:
2006-03-13T18:42:58Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
eebd172
Parents:
8cbe350
Message:

cleanup and extend OFW code

Location:
arch/ppc32/loader
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/loader/asm.S

    r8cbe350 r272c219  
    3939.global memsetb
    4040.global memcpy
    41 .global halt
    4241.global jump_to_kernel
    4342
     
    147146        b 1b
    148147       
    149 halt:
    150         b halt
    151 
    152148flush_instruction_cache:
    153149
  • arch/ppc32/loader/asm.h

    r8cbe350 r272c219  
    3030#define __ASM_H__
    3131
    32 void halt(void) __attribute__((noreturn));
    3332void jump_to_kernel(void *addr) __attribute__((noreturn));
    3433
  • arch/ppc32/loader/main.c

    r8cbe350 r272c219  
    3939void bootstrap(void)
    4040{
    41         printf("\nHelenOS PPC Bootloader\nLoaded at %L\nKernel size %d bytes, load address %L\n", &start, KERNEL_SIZE, KERNEL_LOAD_ADDRESS);
     41        printf("\nHelenOS PPC Bootloader\n");
     42       
     43        void *loader = ofw_translate(&start);
     44        printf("loaded at %L (physical %L)\n", &start, loader);
     45        printf("kernel load address %L (size %d)\n", KERNEL_LOAD_ADDRESS, KERNEL_SIZE);
    4246       
    4347        void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1);
  • arch/ppc32/loader/ofw.c

    r8cbe350 r272c219  
    2828 
    2929#include "ofw.h"
     30#include "printf.h"
    3031
    3132ofw_entry ofw;
    3233
    3334phandle ofw_chosen;
     35ihandle ofw_mmu;
    3436ihandle ofw_stdout;
    3537
     
    3941        ofw_chosen = ofw_find_device("/chosen");
    4042        if (ofw_chosen == -1)
    41                 ofw_call("exit", 0, 0);
     43                halt();
    4244       
    4345        if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)     
    4446                ofw_stdout = 0;
     47       
     48        ofw_mmu = ofw_open("/mmu");
     49        if (ofw_mmu == -1) {
     50                puts("Unable to open /mmu node\n");
     51                halt();
     52        }
     53}
     54
     55void halt(void)
     56{
     57        ofw_call("exit", 0, 0);
    4558}
    4659
     
    6679        ofw(&args);
    6780       
    68         return args.args[nargs];
     81        if (nret > 0)
     82                return args.args[nargs + nret - 1];
     83        else
     84                return 0;
     85}
     86
     87
     88ihandle ofw_open(const char *name)
     89{
     90        return ofw_call("open", 1, 1, name);
    6991}
    7092
     
    7698       
    7799        ofw_call("write", 3, 1, ofw_stdout, str, len);
    78 }
    79 
    80 
    81 void ofw_puts(const char *str)
    82 {
    83         int len = 0;
    84        
    85         while (str[len] != 0)
    86                 len++;
    87        
    88         ofw_write(str, len);
    89100}
    90101
     
    106117        return (void *) ofw_call("claim", 3, 1, addr, size, align);
    107118}
     119
     120
     121void *ofw_translate(const void *virt)
     122{
     123        return (void *) ofw_call_method(ofw_mmu, "translate", 1, 5, virt);
     124}
  • arch/ppc32/loader/ofw.h

    r8cbe350 r272c219  
    5656
    5757extern void init(void);
    58 extern int ofw_call(const char *service, const int nargs, const int nret, ...);
    59 extern void ofw_write(const char *str, const int len);
    60 extern void ofw_puts(const char *str);
    61 extern void *ofw_claim(const void *addr, const int size, const int align);
     58void halt(void);
     59
    6260extern phandle ofw_find_device(const char *name);
    6361extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen);
     62extern int ofw_call(const char *service, const int nargs, const int nret, ...);
     63#define ofw_call_method(instance, method, nargs, nret, ...) ofw_call("call-method", (nargs + 2), nret, method, instance, ##__VA_ARGS__)
     64
     65extern ihandle ofw_open(const char *name);
     66extern void ofw_write(const char *str, const int len);
     67
     68extern void *ofw_claim(const void *addr, const int size, const int align);
     69extern void *ofw_translate(const void *virt);
    6470
    6571#endif
  • arch/ppc32/loader/printf.c

    r8cbe350 r272c219  
    3333
    3434
     35void puts(const char *str)
     36{
     37        int len = 0;
     38       
     39        while (str[len] != 0)
     40                len++;
     41       
     42        ofw_write(str, len);
     43}
     44
     45
    3546/** Print hexadecimal digits
    3647 *
     
    7485       
    7586        d[sizeof(__native) * 8] = 0;   
    76         ofw_puts(&d[i + 1]);
     87        puts(&d[i + 1]);
    7788}
    7889
     
    157168                                         */
    158169                                        case 's':
    159                                                 ofw_puts(va_arg(ap, char_ptr));
     170                                                puts(va_arg(ap, char_ptr));
    160171                                                goto loop;
    161172                                       
     
    168179                                         */
    169180                                        case 'P':
    170                                                 ofw_puts("0x");
     181                                                puts("0x");
    171182                                        case 'p':
    172183                                                print_fixed_hex(va_arg(ap, __native), sizeof(__native));
     
    174185                                       
    175186                                        case 'Q':
    176                                                 ofw_puts("0x");
     187                                                puts("0x");
    177188                                        case 'q':
    178189                                                print_fixed_hex(va_arg(ap, __u64), INT64);
     
    180191                                       
    181192                                        case 'L':
    182                                                 ofw_puts("0x");
     193                                                puts("0x");
    183194                                        case 'l':
    184195                                                print_fixed_hex(va_arg(ap, __native), INT32);
     
    186197                                       
    187198                                        case 'W':
    188                                                 ofw_puts("0x");
     199                                                puts("0x");
    189200                                        case 'w':
    190201                                                print_fixed_hex(va_arg(ap, __native), INT16);
     
    192203                                       
    193204                                        case 'B':
    194                                                 ofw_puts("0x");
     205                                                puts("0x");
    195206                                        case 'b':
    196207                                                print_fixed_hex(va_arg(ap, __native), INT8);
     
    205216                                       
    206217                                        case 'X':
    207                                                 ofw_puts("0x");
     218                                                puts("0x");
    208219                                        case 'x':
    209220                                                print_number(va_arg(ap, __native), 16);
  • arch/ppc32/loader/printf.h

    r8cbe350 r272c219  
    4747typedef char *char_ptr;
    4848
     49void puts(const char *str);
    4950void printf(const char *fmt, ...);
    5051
Note: See TracChangeset for help on using the changeset viewer.