17f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#include <stdio.h> 27f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#include <stdlib.h> 37f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 47f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#include "cpu-features.h" 57f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 67f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#ifndef __arm__ 77f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#error "This source file should only be compiled on ARM!" 87f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner#endif 97f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 107f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turnerstatic void panic(const char* msg) { 117f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner fprintf(stderr, "ERROR: %s\n", msg); 127f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner exit(1); 137f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner} 147f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 157f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turnerint main(void) { 167f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner int count, cpu_count = 10; 177f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner uint64_t features, cpu_features = 0xaabdedf012934839ULL; 187f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner uint32_t id, cpu_id = 0x436723ee; 197f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 207f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner // Check that android_setCpuArm() can be called at program startup 217f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner // and that android_getCpuCount() and android_getCpuFeatures() 227f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner // will return the corresponding values. 237f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner // 247f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner printf("Setting cpu_count=%d, features=%08llx cpu_id=%08x\n", 257f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner cpu_count, cpu_features, cpu_id); 267f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 277f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner if (!android_setCpuArm(cpu_count, cpu_features, cpu_id)) 287f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner panic("Cannot call android_setCpu() at program startup!"); 297f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 307f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner count = android_getCpuCount(); 317f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner features = android_getCpuFeatures(); 327f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner id = android_getCpuIdArm(); 337f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 347f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner printf("Retrieved cpu_count=%d, features=%08llx cpu_id=%08x\n", 357f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner count, features, id); 367f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 377f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner if (count != cpu_count) 387f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner panic("android_getCpuCount() didn't return expected value!"); 397f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 407f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner if (features != cpu_features) 417f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner panic("android_getCpuFeatures() didn't return expected value!"); 427f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 437f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner if (id != cpu_id) 447f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner panic("android_getCpuIdArm() didn't return expected value!"); 457f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 467f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner // Once one of the android_getXXX functions has been called, 477f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner // android_setCpu() should always fail. 487f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner if (android_setCpuArm(cpu_count, cpu_features, cpu_id)) 497f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner panic("android_setCpuArm() could be called twice!"); 507f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 517f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner printf("Second call to android_setCpu() failed as expected.\n"); 527f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 537f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner if (android_setCpu(cpu_count, cpu_features)) 547f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner panic("android_setCpu() could be called after android_setCpuArm()!"); 557f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 567f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner printf("Call to android_setCpu() failed as expected.\n"); 577f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 587f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner return 0; 597f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner} 607f26cc56c2345217c63b88283be03aa549dd71a6David 'Digit' Turner 61