kern
diff src/mem.c @ 25:9939a6d7a45a
protected critical sections in VM and the physical memory manager by disabling interrupts
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 06 Apr 2011 07:42:44 +0300 |
parents | 5454cee245a3 |
children | b793b8fcba7d |
line diff
1.1 --- a/src/mem.c Tue Apr 05 02:09:02 2011 +0300 1.2 +++ b/src/mem.c Wed Apr 06 07:42:44 2011 +0300 1.3 @@ -3,6 +3,7 @@ 1.4 #include "mem.h" 1.5 #include "panic.h" 1.6 #include "vm.h" 1.7 +#include "intr.h" 1.8 1.9 #define FREE 0 1.10 #define USED 1 1.11 @@ -120,7 +121,10 @@ 1.12 */ 1.13 uint32_t alloc_phys_page(void) 1.14 { 1.15 - int i, idx, max; 1.16 + int i, idx, max, intr_state; 1.17 + 1.18 + intr_state = get_intr_state(); 1.19 + disable_intr(); 1.20 1.21 idx = last_alloc_idx; 1.22 max = bmsize / 4; 1.23 @@ -139,6 +143,8 @@ 1.24 last_alloc_idx = idx; 1.25 1.26 printf("alloc_phys_page() -> %x (page: %d)\n", PAGE_TO_ADDR(pg), pg); 1.27 + 1.28 + set_intr_state(intr_state); 1.29 return PAGE_TO_ADDR(pg); 1.30 } 1.31 } 1.32 @@ -147,6 +153,7 @@ 1.33 idx++; 1.34 } 1.35 1.36 + set_intr_state(intr_state); 1.37 return 0; 1.38 } 1.39 1.40 @@ -163,6 +170,9 @@ 1.41 int pg = ADDR_TO_PAGE(addr); 1.42 int bmidx = BM_IDX(pg); 1.43 1.44 + int intr_state = get_intr_state(); 1.45 + disable_intr(); 1.46 + 1.47 if(!IS_FREE(pg)) { 1.48 panic("free_phys_page(%d): I thought that was already free!\n", pg); 1.49 } 1.50 @@ -171,6 +181,8 @@ 1.51 if(bmidx < last_alloc_idx) { 1.52 last_alloc_idx = bmidx; 1.53 } 1.54 + 1.55 + set_intr_state(intr_state); 1.56 } 1.57 1.58 /* this is only ever used by the VM init code to find out what the extends of