Create
(bin: &[u8])
| 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(); |