diff options
Diffstat (limited to 'arch/i386/kernel/cpu')
-rw-r--r-- | arch/i386/kernel/cpu/mtrr/main.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index e1c2042b9b7..d66b09e0c82 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
@@ -375,6 +375,19 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
375 | return error; | 375 | return error; |
376 | } | 376 | } |
377 | 377 | ||
378 | static int mtrr_check(unsigned long base, unsigned long size) | ||
379 | { | ||
380 | if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) { | ||
381 | printk(KERN_WARNING | ||
382 | "mtrr: size and base must be multiples of 4 kiB\n"); | ||
383 | printk(KERN_DEBUG | ||
384 | "mtrr: size: 0x%lx base: 0x%lx\n", size, base); | ||
385 | dump_stack(); | ||
386 | return -1; | ||
387 | } | ||
388 | return 0; | ||
389 | } | ||
390 | |||
378 | /** | 391 | /** |
379 | * mtrr_add - Add a memory type region | 392 | * mtrr_add - Add a memory type region |
380 | * @base: Physical base address of region | 393 | * @base: Physical base address of region |
@@ -415,11 +428,8 @@ int | |||
415 | mtrr_add(unsigned long base, unsigned long size, unsigned int type, | 428 | mtrr_add(unsigned long base, unsigned long size, unsigned int type, |
416 | char increment) | 429 | char increment) |
417 | { | 430 | { |
418 | if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) { | 431 | if (mtrr_check(base, size)) |
419 | printk(KERN_WARNING "mtrr: size and base must be multiples of 4 kiB\n"); | ||
420 | printk(KERN_DEBUG "mtrr: size: 0x%lx base: 0x%lx\n", size, base); | ||
421 | return -EINVAL; | 432 | return -EINVAL; |
422 | } | ||
423 | return mtrr_add_page(base >> PAGE_SHIFT, size >> PAGE_SHIFT, type, | 433 | return mtrr_add_page(base >> PAGE_SHIFT, size >> PAGE_SHIFT, type, |
424 | increment); | 434 | increment); |
425 | } | 435 | } |
@@ -511,11 +521,8 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
511 | int | 521 | int |
512 | mtrr_del(int reg, unsigned long base, unsigned long size) | 522 | mtrr_del(int reg, unsigned long base, unsigned long size) |
513 | { | 523 | { |
514 | if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) { | 524 | if (mtrr_check(base, size)) |
515 | printk(KERN_INFO "mtrr: size and base must be multiples of 4 kiB\n"); | ||
516 | printk(KERN_DEBUG "mtrr: size: 0x%lx base: 0x%lx\n", size, base); | ||
517 | return -EINVAL; | 525 | return -EINVAL; |
518 | } | ||
519 | return mtrr_del_page(reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT); | 526 | return mtrr_del_page(reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT); |
520 | } | 527 | } |
521 | 528 | ||