efibootx64.c revision 1.2.2.2 1 1.2.2.2 pgoyette /* $NetBSD: efibootx64.c,v 1.2.2.2 2017/03/20 06:57:15 pgoyette Exp $ */
2 1.2.2.2 pgoyette
3 1.2.2.2 pgoyette /*-
4 1.2.2.2 pgoyette * Copyright (c) 2016 Kimihiro Nonaka <nonaka (at) netbsd.org>
5 1.2.2.2 pgoyette * All rights reserved.
6 1.2.2.2 pgoyette *
7 1.2.2.2 pgoyette * Redistribution and use in source and binary forms, with or without
8 1.2.2.2 pgoyette * modification, are permitted provided that the following conditions
9 1.2.2.2 pgoyette * are met:
10 1.2.2.2 pgoyette * 1. Redistributions of source code must retain the above copyright
11 1.2.2.2 pgoyette * notice, this list of conditions and the following disclaimer.
12 1.2.2.2 pgoyette * 2. Redistributions in binary form must reproduce the above copyright
13 1.2.2.2 pgoyette * notice, this list of conditions and the following disclaimer in the
14 1.2.2.2 pgoyette * documentation and/or other materials provided with the distribution.
15 1.2.2.2 pgoyette *
16 1.2.2.2 pgoyette * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17 1.2.2.2 pgoyette * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 1.2.2.2 pgoyette * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.2.2.2 pgoyette * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20 1.2.2.2 pgoyette * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.2.2.2 pgoyette * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 1.2.2.2 pgoyette * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.2.2.2 pgoyette * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.2.2.2 pgoyette * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.2.2.2 pgoyette * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.2.2.2 pgoyette * SUCH DAMAGE.
27 1.2.2.2 pgoyette */
28 1.2.2.2 pgoyette
29 1.2.2.2 pgoyette #include "efiboot.h"
30 1.2.2.2 pgoyette
31 1.2.2.2 pgoyette #include <sys/bootblock.h>
32 1.2.2.2 pgoyette
33 1.2.2.2 pgoyette struct x86_boot_params boot_params;
34 1.2.2.2 pgoyette
35 1.2.2.2 pgoyette void startprog64_start(physaddr_t, physaddr_t, physaddr_t, u_long,
36 1.2.2.2 pgoyette void *, physaddr_t);
37 1.2.2.2 pgoyette extern void (*startprog64)(physaddr_t, physaddr_t, physaddr_t, u_long,
38 1.2.2.2 pgoyette void *, physaddr_t);
39 1.2.2.2 pgoyette extern u_int startprog64_size;
40 1.2.2.2 pgoyette
41 1.2.2.2 pgoyette void
42 1.2.2.2 pgoyette efi_md_init(void)
43 1.2.2.2 pgoyette {
44 1.2.2.2 pgoyette EFI_STATUS status;
45 1.2.2.2 pgoyette EFI_PHYSICAL_ADDRESS addr = EFI_ALLOCATE_MAX_ADDRESS;
46 1.2.2.2 pgoyette u_int sz = EFI_SIZE_TO_PAGES(startprog64_size);
47 1.2.2.2 pgoyette
48 1.2.2.2 pgoyette status = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress,
49 1.2.2.2 pgoyette EfiLoaderData, sz, &addr);
50 1.2.2.2 pgoyette if (EFI_ERROR(status))
51 1.2.2.2 pgoyette Panic(L"%a: AllocatePages() failed: %d page(s): %r",
52 1.2.2.2 pgoyette __func__, sz, status);
53 1.2.2.2 pgoyette startprog64 = (void *)addr;
54 1.2.2.2 pgoyette CopyMem(startprog64, startprog64_start, startprog64_size);
55 1.2.2.2 pgoyette }
56 1.2.2.2 pgoyette
57 1.2.2.2 pgoyette /* ARGSUSED */
58 1.2.2.2 pgoyette void
59 1.2.2.2 pgoyette startprog(physaddr_t entry, uint32_t argc, uint32_t *argv, physaddr_t sp)
60 1.2.2.2 pgoyette {
61 1.2.2.2 pgoyette uint32_t *newsp = (void *)((char *)startprog64 + startprog64_size);
62 1.2.2.2 pgoyette
63 1.2.2.2 pgoyette /* Copy argv to new stack pointer */
64 1.2.2.2 pgoyette if (argc > 0) {
65 1.2.2.2 pgoyette newsp -= argc;
66 1.2.2.2 pgoyette memcpy(newsp, argv, sizeof(*argv) * argc);
67 1.2.2.2 pgoyette }
68 1.2.2.2 pgoyette
69 1.2.2.2 pgoyette (*startprog64)(efi_kernel_start, efi_kernel_start + efi_loadaddr,
70 1.2.2.2 pgoyette (physaddr_t)newsp, efi_kernel_size, startprog64, entry);
71 1.2.2.2 pgoyette }
72 1.2.2.2 pgoyette
73 1.2.2.2 pgoyette /* ARGSUSED */
74 1.2.2.2 pgoyette void
75 1.2.2.2 pgoyette multiboot(physaddr_t entry, physaddr_t header, physaddr_t sp)
76 1.2.2.2 pgoyette {
77 1.2.2.2 pgoyette Panic(L"%a: not implemented", __func__);
78 1.2.2.2 pgoyette }
79