Index: generic/src/mm/frame.c
===================================================================
--- generic/src/mm/frame.c	(revision 2d93f1f9242c39f6e8a125f6fc3f2297727f4f04)
+++ generic/src/mm/frame.c	(revision b87f41860c88213bb9dc599f59adedde6615550b)
@@ -1,4 +1,5 @@
 /*
- * Copyright (C) 2001-2004 Jakub Jermar
+ * Copyright (C) 2001-2005 Jakub Jermar
+ * Copyright (C) 2005 Sergey Bondari
  * All rights reserved.
  *
@@ -226,9 +227,9 @@
 
 	/* Force base to the nearest lower address frame boundary. */
-	base &= ~(FRAME_SIZE - 1);
+	base = ALIGN_DOWN(base, FRAME_SIZE);
 	/* Align size to frame boundary. */
-	size = ALIGN(size, FRAME_SIZE);
-
-	ASSERT(zone_blacklist_count <= ZONE_BLACKLIST_SIZE);
+	size = ALIGN_UP(size, FRAME_SIZE);
+
+	ASSERT(index < ZONE_BLACKLIST_SIZE);
 	zone_blacklist[index].base = base;
 	zone_blacklist[index].size = size;
@@ -285,5 +286,5 @@
 
 	if (!z) {
-		panic("Cannot allocate zone (%dB).\n", size);
+		panic("Cannot allocate zone (base=%P, size=%d).\n", base, size);
 	}
 	
@@ -394,5 +395,5 @@
 	frame_t * frame;
 	zone_t * zone;
-	count_t index;
+	index_t index;
 	bool is_left, is_right;
 
@@ -400,10 +401,11 @@
 	zone = (zone_t *) b->data;
 	
+	ASSERT(IS_BUDDY_ORDER_OK(FRAME_INDEX(zone, frame), frame->buddy_order));
+	
 	is_left = IS_BUDDY_LEFT_BLOCK(zone, frame);
-	is_right = !is_left;
-	
-	/*
-	 * test left buddy
-	 */
+	is_right = IS_BUDDY_RIGHT_BLOCK(zone, frame);
+	
+	ASSERT(is_left ^ is_right);
+	
 	if (is_left) {
 		index = (FRAME_INDEX(zone, frame)) + (1 << frame->buddy_order);
@@ -431,6 +433,8 @@
 link_t * zone_buddy_bisect(buddy_system_t *b, link_t * block) {
 	frame_t * frame_l, * frame_r;
+
 	frame_l = list_get_instance(block, frame_t, buddy_link);
 	frame_r = (frame_l + (1 << (frame_l->buddy_order - 1)));
+	
 	return &frame_r->buddy_link;
 }
@@ -446,6 +450,8 @@
 link_t * zone_buddy_coalesce(buddy_system_t *b, link_t * block_1, link_t * block_2) {
 	frame_t * frame1, * frame2;
+	
 	frame1 = list_get_instance(block_1, frame_t, buddy_link);
 	frame2 = list_get_instance(block_2, frame_t, buddy_link);
+	
 	return frame1 < frame2 ? block_1 : block_2;
 }
