#Eviter le message "Unofficial software"
1 messages · Page 1 of 1 (latest)
Ah oui, c'était moi qui avait du parler de ça. L'idée, c'est d'écrire une application externe qui jump à l'adresse de l'autre userland (0x90410040 pour le slot B, si je calcule bien) pour n'être qu'en mode d'application externe et pas userland modifié. Je n'ai pas testé en pratique, mais je ne vois pas ce qui empêcherait ça
En reprenant un peu de code d'Epsilon, ce code devrait marcher si je ne me trompe pas
void jump(uint32_t jumpIsrVectorAddress) {
uint32_t * stackPointerAddress = reinterpret_cast<uint32_t *>(jumpIsrVectorAddress);
uint32_t * resetHandlerAddress = stackPointerAddress + 1;
asm volatile (
"msr MSP, %[stackPointer] ; bx %[resetHandler]"
: :
[stackPointer] "r" (*stackPointerAddress),
[resetHandler] "r" (*resetHandlerAddress)
);
}
void main() {
// jump(0x90010040); // Exécution slot A
jump(0x90410040); // Exécution slot B
}
En soit je ne me suis pas trompé ? Lorsque je lance l'app, elle crash.
Pour tester, j'ai ajouter du texte a l'écran, puis un sleep. Le texte s'affiche et après le sleep l'app crash.
Ce serait bloquer par le noyau ?
extern const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "Voord";
extern const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0;
using namespace EADK;
void jump(uint32_t jumpIsrVectorAddress) {
uint32_t * stackPointerAddress = reinterpret_cast<uint32_t *>(jumpIsrVectorAddress);
uint32_t * resetHandlerAddress = stackPointerAddress + 1;
asm volatile (
"msr MSP, %[stackPointer] ; bx %[resetHandler]"
: :
[stackPointer] "r" (*stackPointerAddress),
[resetHandler] "r" (*resetHandlerAddress)
);
}
int main(int argc, char * argv[]) {
// jump(0x90010040); // Exécution slot A
jump(0x90410040); // Exécution slot B
}
Tu peux essayer de remplacer le contenu du main par ça ? ((void)0x90410041)();
Pas sûr que ça marche aussi bien
Peut-être ((void *)0x90410041)(); si il ne veut pas compiler
Pour les deux cas j'ai une erreur de compile :
- ((void)0x90410041)(); => error: void value not ignored as it ought to be
- ((void *)0x90410041)(); => error: expression cannot be used as a function
Et ça ? ((uint32_t *)0x90410041)();
même erreur que pour : ((void *)0x90410041)(); => error: expression cannot be used as a function
Sans le pointeur, alors ? ((uint32_t)0x90410041)();
toujours la même erreur
Et ça ? (en se basant sur du code d'Upsilon)
typedef void (*entrypoint)();
void main() {
return ((entrypoint)(const uint32_t*)0x90410041)();
}
Je l'ai implémenté comme ça :
extern const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "Voord";
extern const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0;
using namespace EADK;
typedef void (*entrypoint)();
void main_jump() {
return ((entrypoint)(const uint32_t*)0x90410041)();
}
int main(int argc, char * argv[]) {
main_jump();
}
Mais ça crash quand même.
Peut-être que le jump est bloqué par Epsilon ? 🤔
Possible, mais ça m'étonne, car c'est ce que fait KhiCAS (s'exécuter depuis le slot B)
Que ce code là crash, ça ne m'étonne pas forcément (il faudrait toucher à la stack pour que ça marche bien)
Mais celui-là devrait marcher
Ou alors j'ai mal calculé mes adresses de jump
Tu essayes d'exécuter quelle version d'Epsilon ?
Je suis sur Epsilon 23.2.6
Essaye avec cette adresse-là à la place : 0x90410059
J'obtient toujours un crash.
extern const char eadk_app_name[] __attribute__((section(".rodata.eadk_app_name"))) = "Voord";
extern const uint32_t eadk_api_level __attribute__((section(".rodata.eadk_api_level"))) = 0;
using namespace EADK;
typedef void (*entrypoint)();
void main_jump() {
return ((entrypoint)(const uint32_t*)0x90410059)();
}
int main(int argc, char * argv[]) {
Display::pushRectUniform(Screen::Rect, Color(0x000000));
Display::drawString("Hello World !", Point(40, 120), false, Color(0xFF0000), Color(0x000000));
Timing::msleep(2000);
main_jump();
}
Mais "Hello World !" s'affiche bien
Tu as bien flashé ton userland en slot B, juste pour savoir ?
Et tu pourrais tenter avec l'implémentation du début en assembleur ? (avec jump(0x90410058);)
J'ai bien mon userland en slotB, mais ça ne marche pas malgrés jump(0x90410058);
jump(0x90410030);, c'est mieux ?
(en lisant le binaire directement, c'est là que ça devrait commencer, mais je vois pas trop pourquoi j'avais pas cette valeur ailleurs)
Ah oui, je me suis trompé en écrivant ma doc, en fait
😂 En tout cas ça y est ça fonctionne 🎉 . Merci beaucoup
J'ai juste 2 petites questions :
- c'est possible de refaire ce jump dans l'autre sens (slotb vers slotA) mais en intégrant directement un .nwa a epsilon ? Le tout pour pouvoir naviguer entre les deux slots.
- on pourrais pas jump a l'adresse du noyau b plutot qu'au slotB pour pouvoir executer un userland avec moins de restriction ? (déso si j'ai pas bien compris toute ta doc 😅 )
Tient, quelque chose d'interressant : lorsque je boot sans l'app au slotB et que je vais sur "a propos" dans les paramètres je crash. mais en jump avec l'app .nwa je crash pas dans cette option...
Pour refaire le jump dans l'autre sens, ça doit être possible (il suffit juste de jump à 0x90010030 au lieu de 0x90410030). Par contre, l'userland officiel s'exécutera avec les restrictions d'une application externe (pas de mode examen…), donc ça devient moins intéressant. Pas sûr que l'application reste visible après être retourné sur l'userland officiel (à vérifier). L'userland modifié peut dans tous les cas être modifié pour afficher un menu pour retourner sur l'userland officiel (via le même code que l'application externe) ou toujours afficher les applications externes
Pour jump au kernel du slot B, ce n'est pas possible depuis l'userland, car tu n'as pas les droits, en gros (plus précisément, le kernel n'aurait pas les droits pour fonctionner une fois exécuté, mais je ne sais pas si quelque chose empêche vraiment de jump sur le kernel, ça ne servirait pas à grand-chose)
Ok merci 😁 Je vais essayer tout ça
La suppression des apps externes se passe ici donc normalement elle disparaîtront https://github.com/numworks/epsilon/blob/9072ab80a16d4c15222699f73896282a65eecd54/ion/src/device/userland/boot/rt0.cpp#L27
Ajouté sur la version 20 https://github.com/numworks/epsilon/commit/8f298e5d375f807667d62363ad064e79235ae49c
j'ai quand même tester de repasser sur le slotA, et ducoup je me retrouve avec le message "UNOFFICIAl SOFTWARE" lorsque je suis sur l'officiel 😂
mais c'est interessant car ça fait bugs le noyau 🤔 (j'ai donc pas accès a la led sur Epsilon). Bon il suffit d'un reset et ça revient a la normal
Le fonctionnement, c'est que tu ne peux que diminuer le niveau de sécurité. Dès que tu actives les applications externes ou que tu lances un userland custom, le niveau de sécurité sera diminué jusqu'au prochain reset
Les différents niveaux, c'est officiel > applications externes > userland custom
Les applications externes ont un peu plus de droits que l'userland custom ou c'est kasi pareil ?
C'est globalement pareil (pas de LED), à part le popup qui est spécifique aux userland customs
Et bien sûr la license des applications externes permet la redistribution, contrairement à l'userland
C'est quand même dommage pour la LED, je comprends que ça évite beaucoup de problèmes (et de débordement aussi) mais ça restreint aussi beaucoup la communauté 😞. Au moins ya les apps externes, c'est mieux que rien 😐