source: mainline/genarch/src/firmware/ofw/ofw.c@ 39cb79a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 39cb79a was 39cb79a, checked in by Jakub Jermar <jakub@…>, 20 years ago

sparc64 work.
Link kernel with load address 0x4000.
Add fragment of Linux image header to force SILO to always load the kernel at 0x4000.
Adjust ofw.h and ofw.c to work also on sparc64.

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/*
2 * Copyright (C) 2005 Martin Decky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <genarch/firmware/ofw/ofw.h>
30#include <arch/asm.h>
31#include <stdarg.h>
32#include <cpu.h>
33#include <arch/types.h>
34
35ofw_entry ofw;
36
37phandle ofw_chosen;
38ihandle ofw_stdout;
39
40void ofw_init(void)
41{
42 ofw_chosen = ofw_find_device("/chosen");
43 if (ofw_chosen == -1)
44 ofw_done();
45
46 if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0)
47 ofw_stdout = 0;
48}
49
50void ofw_done(void)
51{
52 (void) ofw_call("exit", 0, 0);
53 cpu_halt();
54}
55
56__native ofw_call(const char *service, const int nargs, const int nret, ...)
57{
58 va_list list;
59 ofw_args_t args;
60 int i;
61
62 args.service = service;
63 args.nargs = nargs;
64 args.nret = nret;
65
66 va_start(list, nret);
67 for (i = 0; i < nargs; i++)
68 args.args[i] = va_arg(list, ofw_arg_t);
69 va_end(list);
70
71 for (i = 0; i < nret; i++)
72 args.args[i + nargs] = 0;
73
74 ofw(&args);
75
76 return args.args[nargs];
77}
78
79void ofw_putchar(const char ch)
80{
81 if (ofw_stdout == 0)
82 return;
83
84 (void) ofw_call("write", 3, 1, ofw_stdout, &ch, 1);
85}
86
87phandle ofw_find_device(const char *name)
88{
89 return (phandle) ofw_call("finddevice", 1, 1, name);
90}
91
92int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen)
93{
94 return (int) ofw_call("getprop", 4, 1, device, name, buf, buflen);
95}
96
97void *ofw_claim(const void *addr, const int size, const int align)
98{
99 return (void *) ofw_call("claim", 3, 1, addr, size, align);
100}
101
102void putchar(const char ch)
103{
104 ofw_putchar(ch);
105}
Note: See TracBrowser for help on using the repository browser.