19 |
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
20 |
02111-1307, USA. */ |
02111-1307, USA. */ |
21 |
|
|
22 |
|
#ifdef HAVE_CONFIG_H |
23 |
|
#include <config.h> |
24 |
|
#endif |
25 |
|
|
26 |
#include <string.h> |
#include <string.h> |
27 |
#include <stddef.h> |
#include <stddef.h> |
28 |
|
#include <stdint.h> |
29 |
|
|
30 |
/* This must be included before any libl4 header. */ |
/* This must be included before any libl4 header. */ |
31 |
#include "environment.h" |
#include "environment.h" |
616 |
(1 << kip->processor_info.log2_size), proc_desc_size_ok); |
(1 << kip->processor_info.log2_size), proc_desc_size_ok); |
617 |
#endif |
#endif |
618 |
|
|
619 |
for (num = 0; num < _L4_num_processors (kip); num++) |
for (num = 0; num < processors_ok; num++) |
620 |
{ |
{ |
621 |
_L4_proc_desc_t proc_desc; |
_L4_proc_desc_t proc_desc; |
622 |
|
|
700 |
} |
} |
701 |
|
|
702 |
|
|
703 |
|
/* Test the memory info field. */ |
704 |
|
void |
705 |
|
test_memory_info (_L4_kip_t kip) |
706 |
|
{ |
707 |
|
word_t num_mem_desc_ok = 7; |
708 |
|
struct |
709 |
|
{ |
710 |
|
uintptr_t low; |
711 |
|
uintptr_t high; |
712 |
|
int virtual; |
713 |
|
int type; |
714 |
|
} mem_desc_ok[] = |
715 |
|
{ |
716 |
|
{ 0x00000000, 0xffffffff, 0, 4 }, |
717 |
|
{ 0x00000000, 0x0009fbff, 0, 1 }, |
718 |
|
{ 0x00100000, 0x07ffffff, 0, 1 }, |
719 |
|
{ 0x000a0000, 0x000effff, 0, 4 }, |
720 |
|
{ 0x07000000, 0x080003ff, 0, 2 }, |
721 |
|
{ 0x00000000, 0xbfffffff, 1, 1 }, |
722 |
|
{ 0x00100000, 0x0014efff, 0, 2 }, |
723 |
|
}; |
724 |
|
word_t num; |
725 |
|
|
726 |
|
#ifdef _L4_INTERFACE_INTERN |
727 |
|
check_nr ("[intern]", "_L4_num_memory_desc", |
728 |
|
_L4_num_memory_desc (kip), num_mem_desc_ok); |
729 |
|
check_nr ("[intern]", "_L4_MEMDESC_UNDEFINED", |
730 |
|
_L4_MEMDESC_UNDEFINED, 0x0); |
731 |
|
check_nr ("[intern]", "_L4_MEMDESC_CONVENTIONAL", |
732 |
|
_L4_MEMDESC_CONVENTIONAL, 0x1); |
733 |
|
check_nr ("[intern]", "_L4_MEMDESC_RESERVED", |
734 |
|
_L4_MEMDESC_RESERVED, 0x2); |
735 |
|
check_nr ("[intern]", "_L4_MEMDESC_DEDICATED", |
736 |
|
_L4_MEMDESC_DEDICATED, 0x3); |
737 |
|
check_nr ("[intern]", "_L4_MEMDESC_SHARED", |
738 |
|
_L4_MEMDESC_SHARED, 0x4); |
739 |
|
check_nr ("[intern]", "_L4_MEMDESC_BOOTLOADER", |
740 |
|
_L4_MEMDESC_BOOTLOADER, 0xe); |
741 |
|
check_nr ("[intern]", "_L4_MEMDESC_ARCH", |
742 |
|
_L4_MEMDESC_ARCH, 0xf); |
743 |
|
#endif |
744 |
|
|
745 |
|
#ifdef _L4_INTERFACE_GNU |
746 |
|
check_nr ("[GNU]", "l4_num_memory_desc_from", |
747 |
|
l4_num_memory_desc_from (kip), num_mem_desc_ok); |
748 |
|
check_nr ("[GNU]", "l4_num_memory_desc", |
749 |
|
l4_num_memory_desc (), num_mem_desc_ok); |
750 |
|
|
751 |
|
check_nr ("[GNU]", "L4_MEMDESC_UNDEFINED", |
752 |
|
L4_MEMDESC_UNDEFINED, _L4_MEMDESC_UNDEFINED); |
753 |
|
check_nr ("[GNU]", "L4_MEMDESC_CONVENTIONAL", |
754 |
|
L4_MEMDESC_CONVENTIONAL, _L4_MEMDESC_CONVENTIONAL); |
755 |
|
check_nr ("[GNU]", "L4_MEMDESC_RESERVED", |
756 |
|
L4_MEMDESC_RESERVED, _L4_MEMDESC_RESERVED); |
757 |
|
check_nr ("[GNU]", "L4_MEMDESC_DEDICATED", |
758 |
|
L4_MEMDESC_DEDICATED, _L4_MEMDESC_DEDICATED); |
759 |
|
check_nr ("[GNU]", "L4_MEMDESC_SHARED", |
760 |
|
L4_MEMDESC_SHARED, _L4_MEMDESC_SHARED); |
761 |
|
check_nr ("[GNU]", "L4_MEMDESC_BOOTLOADER", |
762 |
|
L4_MEMDESC_BOOTLOADER, _L4_MEMDESC_BOOTLOADER); |
763 |
|
check_nr ("[GNU]", "L4_MEMDESC_ARCH", |
764 |
|
L4_MEMDESC_ARCH, _L4_MEMDESC_ARCH); |
765 |
|
#endif |
766 |
|
|
767 |
|
#ifdef _L4_INTERFACE_L4 |
768 |
|
{ |
769 |
|
volatile L4_MemoryDesc_t mem_desc; |
770 |
|
volatile L4_Word_t raw; |
771 |
|
|
772 |
|
raw = mem_desc.raw[0]; |
773 |
|
raw = mem_desc.raw[1]; |
774 |
|
} |
775 |
|
|
776 |
|
check_nr ("[L4]", "L4_NumMemoryDescriptors", |
777 |
|
L4_NumMemoryDescriptors (kip), num_mem_desc_ok); |
778 |
|
#endif |
779 |
|
|
780 |
|
for (num = 0; num < num_mem_desc_ok; num++) |
781 |
|
{ |
782 |
|
_L4_memory_desc_t mem_desc; |
783 |
|
|
784 |
|
/* FIXME: Support [!_L4_INTERFACE_INTERN] (by code duplication?). */ |
785 |
|
mem_desc = _L4_memory_desc (kip, num); |
786 |
|
check ("[intern]", "_L4_memory_desc (once per mem desc)", |
787 |
|
(mem_desc != NULL), |
788 |
|
"_L4_memory_desc (kip, %i) == NULL != not null", num); |
789 |
|
|
790 |
|
check ("[intern]", "_L4_memory_desc_low", |
791 |
|
(_L4_memory_desc_low (mem_desc) == mem_desc_ok[num].low), |
792 |
|
"_L4_memory_desc_low (%i) == 0x%x != 0x%x", |
793 |
|
num, _L4_memory_desc_low (mem_desc), mem_desc_ok[num].low); |
794 |
|
check ("[intern]", "_L4_memory_desc_high", |
795 |
|
(_L4_memory_desc_high (mem_desc) == mem_desc_ok[num].high), |
796 |
|
"_L4_memory_desc_high (%i) == 0x%x != 0x%x", |
797 |
|
num, _L4_memory_desc_high (mem_desc), mem_desc_ok[num].high); |
798 |
|
check ("[intern]", "_L4_memory_desc_virtual", |
799 |
|
(_L4_is_memory_desc_virtual (mem_desc) |
800 |
|
== mem_desc_ok[num].virtual), |
801 |
|
"_L4_is_memory_desc_virtual (%i) == %i != %i", |
802 |
|
num, _L4_is_memory_desc_virtual (mem_desc), |
803 |
|
mem_desc_ok[num].virtual); |
804 |
|
check ("[intern]", "_L4_memory_desc_type", |
805 |
|
(_L4_memory_desc_type (mem_desc) == mem_desc_ok[num].type), |
806 |
|
"_L4_memory_desc_type (%i) == %i != %i", |
807 |
|
num, _L4_memory_desc_type (mem_desc), mem_desc_ok[num].type); |
808 |
|
|
809 |
|
#ifdef _L4_INTERFACE_GNU |
810 |
|
{ |
811 |
|
l4_memory_desc_t *mem_desc_gnu = l4_memory_desc_from (kip, num); |
812 |
|
|
813 |
|
check ("[GNU]", "l4_memory_desc_from", |
814 |
|
(mem_desc_gnu == mem_desc), |
815 |
|
"l4_memory_desc_from (kip, %i) == %p != %p", |
816 |
|
num, mem_desc_gnu, mem_desc); |
817 |
|
check ("[GNU]", "l4_memory_desc", |
818 |
|
(l4_memory_desc (num) == mem_desc), |
819 |
|
"l4_memory_desc (%i) == %p != %p", |
820 |
|
num, l4_memory_desc (num), mem_desc); |
821 |
|
|
822 |
|
check ("[GNU]", "l4_memory_desc_low", |
823 |
|
(l4_memory_desc_low (mem_desc_gnu) |
824 |
|
== mem_desc_ok[num].low), |
825 |
|
"l4_memory_desc_low (%i) == 0x%x != 0x%x", |
826 |
|
num, l4_memory_desc_low (mem_desc_gnu), |
827 |
|
mem_desc_ok[num].low); |
828 |
|
check ("[GNU]", "l4_memory_desc_high", |
829 |
|
(l4_memory_desc_high (mem_desc_gnu) |
830 |
|
== mem_desc_ok[num].high), |
831 |
|
"l4_memory_desc_high (%i) == 0x%x != 0x%x", |
832 |
|
num, l4_memory_desc_high (mem_desc_gnu), |
833 |
|
mem_desc_ok[num].high); |
834 |
|
check ("[GNU]", "l4_memory_desc_virtual", |
835 |
|
(l4_is_memory_desc_virtual (mem_desc_gnu) |
836 |
|
== mem_desc_ok[num].virtual), |
837 |
|
"l4_memory_desc_virtual (%i) == %i != %i", |
838 |
|
num, l4_is_memory_desc_virtual (mem_desc_gnu), |
839 |
|
mem_desc_ok[num].virtual); |
840 |
|
check ("[GNU]", "l4_memory_desc_type", |
841 |
|
(l4_memory_desc_type (mem_desc_gnu) |
842 |
|
== mem_desc_ok[num].type), |
843 |
|
"l4_memory_desc_type (%i) == %i != %i", |
844 |
|
num, l4_memory_desc_type (mem_desc_gnu), |
845 |
|
mem_desc_ok[num].type); |
846 |
|
} |
847 |
|
#endif |
848 |
|
|
849 |
|
|
850 |
|
#ifdef _L4_INTERFACE_L4 |
851 |
|
{ |
852 |
|
L4_MemoryDesc_t *mem_desc_l4 = L4_MemoryDesc (kip, num); |
853 |
|
|
854 |
|
check ("[L4]", "L4_MemoryDesc", |
855 |
|
((void *) mem_desc_l4 == (void *) mem_desc), |
856 |
|
"L4_MemoryDesc (kip, %i) == %p != %p", |
857 |
|
num, mem_desc_l4, mem_desc); |
858 |
|
|
859 |
|
check ("[L4]", "L4_MemoryDescLow", |
860 |
|
(L4_MemoryDescLow (mem_desc_l4) |
861 |
|
== mem_desc_ok[num].low), |
862 |
|
"L4_MemoryDescLow (kip, %i) == 0x%x != 0x%x", |
863 |
|
num, L4_MemoryDescLow (mem_desc_l4), |
864 |
|
mem_desc_ok[num].low); |
865 |
|
check ("[L4]", "L4_MemoryDescHigh", |
866 |
|
(L4_MemoryDescHigh (mem_desc_l4) |
867 |
|
== mem_desc_ok[num].high), |
868 |
|
"L4_MemoryDescHigh (kip, %i) == 0x%x != 0x%x", |
869 |
|
num, L4_MemoryDescHigh (mem_desc_l4), |
870 |
|
mem_desc_ok[num].high); |
871 |
|
check ("[L4]", "L4_MemoryDescVirtual", |
872 |
|
(L4_IsMemoryDescVirtual (mem_desc_l4) |
873 |
|
== mem_desc_ok[num].virtual), |
874 |
|
"L4_IsMemoryDescVirtual (kip, %i) == %i != %i", |
875 |
|
num, L4_IsMemoryDescVirtual (mem_desc_l4), |
876 |
|
mem_desc_ok[num].virtual); |
877 |
|
check ("[L4]", "L4_MemoryDescType", |
878 |
|
(L4_MemoryDescType (mem_desc_l4) |
879 |
|
== mem_desc_ok[num].type), |
880 |
|
"L4_MemoryDescType (kip, %i) == %i != %i", |
881 |
|
num, L4_MemoryDescType (mem_desc_l4), |
882 |
|
mem_desc_ok[num].type); |
883 |
|
} |
884 |
|
#endif |
885 |
|
} |
886 |
|
} |
887 |
|
|
888 |
|
|
889 |
/* Test the page info field. */ |
/* Test the page info field. */ |
890 |
void |
void |
891 |
test_page_info (_L4_kip_t kip) |
test_page_info (_L4_kip_t kip) |
892 |
{ |
{ |
893 |
word_t page_size_mask_ok = 0x00401000; |
word_t page_size_mask_ok = 0x00401000; |
894 |
|
/* LSB of page_size_mask_ok. */ |
895 |
|
word_t min_page_size_log2_ok = 12; |
896 |
word_t page_rights_ok = 0x6; |
word_t page_rights_ok = 0x6; |
897 |
|
|
898 |
#ifdef _L4_INTERFACE_INTERN |
#ifdef _L4_INTERFACE_INTERN |
899 |
|
check_nr ("[intern]", "_L4_MIN_PAGE_SIZE_LOG2", |
900 |
|
_L4_MIN_PAGE_SIZE_LOG2, 10); |
901 |
|
check_nr ("[intern]", "_L4_MIN_PAGE_SIZE", |
902 |
|
_L4_MIN_PAGE_SIZE, 1 << 10); |
903 |
|
|
904 |
check_nr ("[intern]", "_L4_page_size_mask", |
check_nr ("[intern]", "_L4_page_size_mask", |
905 |
_L4_page_size_mask (kip), page_size_mask_ok); |
_L4_page_size_mask (kip), page_size_mask_ok); |
906 |
check_nr ("[intern]", "_L4_page_rights", |
check_nr ("[intern]", "_L4_page_rights", |
908 |
#endif |
#endif |
909 |
|
|
910 |
#ifdef _L4_INTERFACE_GNU |
#ifdef _L4_INTERFACE_GNU |
911 |
|
check_nr ("[GNU]", "L4_MIN_PAGE_SIZE_LOG2", |
912 |
|
L4_MIN_PAGE_SIZE_LOG2, _L4_MIN_PAGE_SIZE_LOG2); |
913 |
|
check_nr ("[GNU]", "L4_MIN_PAGE_SIZE", |
914 |
|
L4_MIN_PAGE_SIZE, _L4_MIN_PAGE_SIZE); |
915 |
|
check_nr ("[GNU]", "l4_min_page_size_log2", |
916 |
|
l4_min_page_size_log2 (), min_page_size_log2_ok); |
917 |
|
check_nr ("[GNU]", "l4_min_page_size", |
918 |
|
l4_min_page_size (), 1 << min_page_size_log2_ok); |
919 |
|
|
920 |
check_nr ("[GNU]", "l4_page_size_mask_from", |
check_nr ("[GNU]", "l4_page_size_mask_from", |
921 |
l4_page_size_mask_from (kip), page_size_mask_ok); |
l4_page_size_mask_from (kip), page_size_mask_ok); |
922 |
check_nr ("[GNU]", "l4_page_size_mask", |
check_nr ("[GNU]", "l4_page_size_mask", |
924 |
check_nr ("[GNU]", "l4_page_rights_from", |
check_nr ("[GNU]", "l4_page_rights_from", |
925 |
l4_page_rights_from (kip), page_rights_ok); |
l4_page_rights_from (kip), page_rights_ok); |
926 |
check_nr ("[GNU]", "l4_page_rights", l4_page_rights (), page_rights_ok); |
check_nr ("[GNU]", "l4_page_rights", l4_page_rights (), page_rights_ok); |
927 |
|
|
928 |
|
{ |
929 |
|
l4_word_t addr[] = { 0x00000000, 0x00000001, 0x00000010, 0x00000011, |
930 |
|
0x00000100, 0x00001000, 0x00010000, 0x00100000, |
931 |
|
0x01000000, 0x10000000, 0x2badb002, 0xffffffff }; |
932 |
|
/* The min page size mask. */ |
933 |
|
l4_word_t psm = l4_min_page_size () - 1; |
934 |
|
int i; |
935 |
|
|
936 |
|
for (i = 0; i < sizeof (addr) / sizeof (addr[0]); i++) |
937 |
|
{ |
938 |
|
char *msg; |
939 |
|
l4_word_t addr_trunc = addr[i] & ~psm; |
940 |
|
l4_word_t addr_round = (addr[i] + psm) & ~psm; |
941 |
|
l4_word_t addr_atop = addr[i] >> l4_min_page_size_log2 (); |
942 |
|
|
943 |
|
asprintf (&msg, "l4_page_trunc (0x%x)", addr[i]); |
944 |
|
check_nr ("[GNU]", msg, |
945 |
|
l4_page_trunc (addr[i]), addr_trunc); |
946 |
|
|
947 |
|
asprintf (&msg, "l4_page_round (0x%x)", addr[i]); |
948 |
|
check_nr ("[GNU]", msg, |
949 |
|
l4_page_round (addr[i]), addr_round); |
950 |
|
|
951 |
|
asprintf (&msg, "l4_atop (0x%x)", addr[i]); |
952 |
|
check_nr ("[GNU]", msg, |
953 |
|
l4_atop (addr[i]), addr_atop); |
954 |
|
|
955 |
|
asprintf (&msg, "l4_ptoa (0x%x)", addr_atop); |
956 |
|
check_nr ("[GNU]", msg, |
957 |
|
l4_ptoa (addr_atop), addr_trunc); |
958 |
|
} |
959 |
|
} |
960 |
#endif |
#endif |
961 |
|
|
962 |
#ifdef _L4_INTERFACE_L4 |
#ifdef _L4_INTERFACE_L4 |
1205 |
test_kernel_feature (kip); |
test_kernel_feature (kip); |
1206 |
|
|
1207 |
test_processor_info (kip); |
test_processor_info (kip); |
1208 |
|
test_memory_info (kip); |
1209 |
test_page_info (kip); |
test_page_info (kip); |
1210 |
test_thread_info (kip); |
test_thread_info (kip); |
1211 |
test_clock_info (kip); |
test_clock_info (kip); |