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