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