MCPcopy Index your code
hub / github.com/LibertyOS-Development/kernel / create

Method create

src/sys/proc.rs:95–167  ·  view source on GitHub ↗

Create

(bin: &[u8])

Source from the content-addressed store, hash-verified

93{
94 // Create
95 pub fn create(bin: &[u8]) -> Result<usize, ()>
96 {
97 // Code size
98 let code_size = 1024 * PAGESIZE;
99
100 // Code address
101 let code_address = CODEADDRESS.fetch_add(code_size, Ordering::SeqCst);
102
103 // Allocate pages, using code address and code size
104 crate::allocator::palloc(code_address, code_size);
105
106 // Entry point
107 let mut entrypt = 0;
108
109 // Code pointer
110 let cptr = code_address as *mut u8;
111
112 // If binary is an ELF binary
113 if bin[0..4] == ELFMAG
114 {
115 if let Ok(obj) = object::File::parse(bin)
116 {
117 entrypt = obj.entry();
118 for seg in obj.segments()
119 {
120 let address = seg.address() as usize;
121 if let Ok(data) = seg.data()
122 {
123 for (i, op) in data.iter().enumerate()
124 {
125 unsafe
126 {
127 let ptr = cptr.add(address + i);
128 core::ptr::write(ptr, *op);
129 }
130 }
131 }
132 }
133 }
134 }
135 else
136 {
137 // If binary is a raw binary
138 for (i, op) in bin.iter().enumerate()
139 {
140 unsafe
141 {
142 let ptr = cptr.add(i);
143 core::ptr::write(ptr, *op);
144 }
145 }
146 }
147
148 let mut tab = PROCTAB.write();
149 let parent = &tab[id()];
150 let data = parent.data.clone();
151 let reg = parent.reg;
152 let sf = parent.sf.clone();

Callers

nothing calls this directly

Calls 7

pallocFunction · 0.85
idFunction · 0.85
dataMethod · 0.80
writeFunction · 0.50
addressMethod · 0.45
addMethod · 0.45
writeMethod · 0.45

Tested by

no test coverage detected