1 
2 #ifndef _ARM_PROTO_H
3 #define _ARM_PROTO_H
4 
5 #include <machine/vm.h>
6 
7 #define K_STACK_SIZE	ARM_PAGE_SIZE
8 
9 
10 #ifndef __ASSEMBLY__
11 
12 #include "cpufunc.h"
13 
14 /* klib */
15 __dead void reset(void);
16 phys_bytes vir2phys(void *);
17 vir_bytes phys_memset(phys_bytes ph, u32_t c, phys_bytes bytes);
18 
19 void __switch_address_space(struct proc *p, struct proc **__ptproc);
20 #define switch_address_space(proc)	\
21 	__switch_address_space(proc, get_cpulocal_var_ptr(ptproc))
22 
23 void __copy_msg_from_user_end(void);
24 void __copy_msg_to_user_end(void);
25 void __user_copy_msg_pointer_failure(void);
26 
27 /* multiboot.c */
28 void multiboot_init(void);
29 
30 /* protect.c */
31 struct tss_s {
32   reg_t sp0;                    /* stack pointer to use during interrupt */
33 } __attribute__((packed));
34 int tss_init(unsigned cpu, void * kernel_stack);
35 
36 void add_memmap(kinfo_t *cbi, u64_t addr, u64_t len);
37 phys_bytes alloc_lowest(kinfo_t *cbi, phys_bytes len);
38 void vm_enable_paging(void);
39 void cut_memmap(kinfo_t *cbi, phys_bytes start, phys_bytes end);
40 phys_bytes pg_roundup(phys_bytes b);
41 void pg_info(reg_t *, u32_t **);
42 void pg_clear(void);
43 void pg_identity(kinfo_t *);
44 phys_bytes pg_load(void);
45 void pg_map(phys_bytes phys, vir_bytes vaddr, vir_bytes vaddr_end, kinfo_t *cbi);
46 int pg_mapkernel(void);
47 void pg_mapproc(struct proc *p, struct boot_image *ip, kinfo_t *cbi);
48 
49 EXTERN void * k_stacks_start;
50 extern void * k_stacks;
51 
52 #define get_k_stack_top(cpu)	((void *)(((char*)(k_stacks)) \
53 					+ 2 * ((cpu) + 1) * K_STACK_SIZE))
54 
55 
56 /*
57  * Definition of a callback used when a memory map changed it's base address
58  */
59 typedef int (*kern_phys_map_mapped)(vir_bytes id, vir_bytes new_addr );
60 
61 /*
62  * struct used internally by memory.c to keep a list of
63  * items to map. These should be statically allocated
64  * in the individual files and passed as argument.
65  * The data doesn't need to be initialized. See omap_serial for
66  * and example usage.
67  */
68 typedef struct kern_phys_map{
69 	phys_bytes addr; /* The physical address to map */
70 	vir_bytes size;  /* The size of the mapping */
71 	vir_bytes id;	 /* an id passed to the callback */
72 	int vm_flags;	 /* flags to be passed to vm map */
73 	kern_phys_map_mapped cb; /* the callback itself */
74 	phys_bytes vir; /* The virtual address once remapped */
75 	int index; 	/* index */
76 	struct kern_phys_map *next; /* pointer to the next */
77 } kern_phys_map ;
78 
79 
80 /*
81  * Request an in kernel physical mapping.
82  *
83  * On ARM many devices are memory mapped and some of these devices
84  * are used in the kernel. These device can be things like serial
85  * lines, interrupt controller and clocks. The kernel needs to be
86  * able to access these devices at the various stages of booting.
87  * During startup, until arch_enable_paging is called, it is the
88  * kernel whom is controlling the mappings and it often needs to
89  * access the memory using a 1:1 mapping between virtual and
90  * physical memory.
91  *
92  * Once processes start to run it is no longer desirable for the
93  * kernel to have devices mapped in the middle of the process
94  * address space.
95  *
96  * This method requests the memory manager to map base_address/size
97  * in the kernel address space and call back the kernel when this
98  * mapping takes effect (after enable_paging).
99  *
100  * Before the callback is called it is up to the kernel to use it's
101  * own addressing. The callback will happen *after* the kernel lost
102  * it's initial mapping. It it therefore not safe to use the initial
103  * mapping in the callback. It also is not possible to use printf for
104  * the same reason.
105  */
106 int kern_req_phys_map( phys_bytes base_address, vir_bytes io_size,
107 		   int vm_flags, kern_phys_map * priv,
108 		   kern_phys_map_mapped cb, vir_bytes id);
109 
110 /*
111  * Request a physical mapping and put the result in the given prt
112  * Note that ptr will only be valid once the callback happened.
113  */
114 int kern_phys_map_ptr( phys_bytes base_address, vir_bytes io_size,
115 		       int vm_flags, kern_phys_map * priv,
116 		       vir_bytes ptr);
117 
118 void arch_ser_init();
119 
120 /* functions defined in architecture-independent kernel source. */
121 #include "kernel/proto.h"
122 
123 #endif /* __ASSEMBLY__ */
124 
125 #endif
126