Rev 534 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 534 | Rev 881 | ||
---|---|---|---|
Line 23... | Line 23... | ||
23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
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 |
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. |
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | */ |
27 | */ |
28 | - | ||
29 | #include "main.h" |
- | |
30 | 28 | ||
- | 29 | #include "main.h" |
|
- | 30 | #include "printf.h" |
|
31 | ofw_entry ofw; |
31 | #include "ofw.h" |
32 | 32 | ||
33 | phandle ofw_chosen; |
- | |
34 | ihandle ofw_stdout; |
- | |
35 | - | ||
36 | void init(void) |
33 | static void halt(void) |
37 | { |
- | |
38 | ofw_chosen = ofw_find_device("/chosen"); |
- | |
39 | if (ofw_chosen == -1) |
- | |
40 | ofw_call("exit", 0, 0); |
- | |
41 | - | ||
42 | if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
- | |
43 | ofw_stdout = 0; |
- | |
44 | } |
- | |
45 | - | ||
46 | int ofw_call(const char *service, const int nargs, const int nret, ...) |
- | |
47 | { |
- | |
48 | va_list list; |
- | |
49 | ofw_args_t args; |
- | |
50 | int i; |
- | |
51 | - | ||
52 | args.service = service; |
- | |
53 | args.nargs = nargs; |
- | |
54 | args.nret = nret; |
- | |
55 | - | ||
56 | va_start(list, nret); |
- | |
57 | for (i = 0; i < nargs; i++) |
- | |
58 | args.args[i] = va_arg(list, ofw_arg_t); |
- | |
59 | va_end(list); |
- | |
60 | - | ||
61 | for (i = 0; i < nret; i++) |
- | |
62 | args.args[i + nargs] = 0; |
- | |
63 | - | ||
64 | ofw(&args); |
- | |
65 | - | ||
66 | return args.args[nargs]; |
- | |
67 | } |
- | |
68 | - | ||
69 | void ofw_write(const char *str, const int len) |
- | |
70 | { |
34 | { |
71 | if (ofw_stdout == 0) |
- | |
72 | return; |
35 | while (1); |
73 | - | ||
74 | ofw_call("write", 3, 1, ofw_stdout, str, len); |
- | |
75 | } |
36 | } |
76 | 37 | ||
77 | void ofw_puts(const char *str) |
38 | void bootstrap(void) |
78 | { |
39 | { |
79 | int len = 0; |
40 | printf("\nHelenOS PPC Bootloader\nKernel size %d, load address %L\n", KERNEL_SIZE, KERNEL_LOAD_ADDRESS); |
80 | 41 | ||
- | 42 | void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1); |
|
81 | while (str[len] != 0) |
43 | if (addr == NULL) { |
- | 44 | printf("Error: Unable to claim memory"); |
|
82 | len++; |
45 | halt(); |
- | 46 | } |
|
83 | 47 | ||
84 | ofw_write(str, len); |
- | |
85 | } |
- | |
86 | - | ||
87 | phandle ofw_find_device(const char *name) |
- | |
88 | { |
- | |
89 | return ofw_call("finddevice", 1, 1, name); |
- | |
90 | } |
- | |
91 | - | ||
92 | int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen) |
- | |
93 | { |
- | |
94 | return ofw_call("getprop", 4, 1, device, name, buf, buflen); |
- | |
95 | } |
- | |
96 | - | ||
97 | void bootstrap(void) |
- | |
98 | { |
- | |
99 | ofw_puts("\nHelenOS PPC Bootloader\n"); |
- | |
100 | - | ||
101 | while (1); |
48 | halt(); |
102 | } |
49 | } |