mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-18 21:30:38 +01:00
Some code
This commit is contained in:
@@ -58,12 +58,16 @@ bool Boot::isKernelPatched(const Slot & s) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == (uint32_t)&_fake_isr_function_start;
|
// return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;*(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;*(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;
|
||||||
|
return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() {
|
__attribute((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() {
|
||||||
// a simple function
|
// a simple function
|
||||||
|
Ion::Device::Flash::ClearInternalFlashErrors();
|
||||||
|
asm("bx lr");
|
||||||
|
asm("ldr PC, [PC, -0x18]");
|
||||||
|
Ion::LED::setColor(KDColorBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Boot::patchKernel(const Slot & s) {
|
void Boot::patchKernel(const Slot & s) {
|
||||||
@@ -71,27 +75,27 @@ void Boot::patchKernel(const Slot & s) {
|
|||||||
// we allocate a big buffer to store the first sector
|
// we allocate a big buffer to store the first sector
|
||||||
uint8_t data[1024*4];
|
uint8_t data[1024*4];
|
||||||
memcpy(data, (void*)0x90000000, 1024*4);
|
memcpy(data, (void*)0x90000000, 1024*4);
|
||||||
uint32_t dummy_address = (uint32_t)&_fake_isr_function_start;
|
uint32_t dummy_address = (uint32_t)&_fake_isr_function_start + 1;
|
||||||
uint8_t * ptr = (uint8_t *)&dummy_address;
|
uint8_t * ptr = (uint8_t *)&dummy_address;
|
||||||
data[origin_isr + sizeof(uint32_t) * 6] = ptr[0];
|
data[origin_isr + sizeof(uint32_t) * 6] = ptr[0]; // BusFault
|
||||||
data[origin_isr + sizeof(uint32_t) * 6 + 1] = ptr[1];
|
data[origin_isr + sizeof(uint32_t) * 6 + 1] = ptr[1];
|
||||||
data[origin_isr + sizeof(uint32_t) * 6 + 2] = ptr[2];
|
data[origin_isr + sizeof(uint32_t) * 6 + 2] = ptr[2];
|
||||||
data[origin_isr + sizeof(uint32_t) * 6 + 3] = ptr[3];
|
data[origin_isr + sizeof(uint32_t) * 6 + 3] = ptr[3];
|
||||||
|
|
||||||
data[origin_isr + sizeof(uint32_t) * 5] = ptr[0];
|
// data[origin_isr + sizeof(uint32_t) * 5] = ptr[0]; // MemManage
|
||||||
data[origin_isr + sizeof(uint32_t) * 5 + 1] = ptr[1];
|
// data[origin_isr + sizeof(uint32_t) * 5 + 1] = ptr[1];
|
||||||
data[origin_isr + sizeof(uint32_t) * 5 + 2] = ptr[2];
|
// data[origin_isr + sizeof(uint32_t) * 5 + 2] = ptr[2];
|
||||||
data[origin_isr + sizeof(uint32_t) * 5 + 3] = ptr[3];
|
// data[origin_isr + sizeof(uint32_t) * 5 + 3] = ptr[3];
|
||||||
|
|
||||||
data[origin_isr + sizeof(uint32_t) * 7] = ptr[0];
|
data[origin_isr + sizeof(uint32_t) * 7] = ptr[0]; // UsageFault
|
||||||
data[origin_isr + sizeof(uint32_t) * 7 + 1] = ptr[1];
|
data[origin_isr + sizeof(uint32_t) * 7 + 1] = ptr[1];
|
||||||
data[origin_isr + sizeof(uint32_t) * 7 + 2] = ptr[2];
|
data[origin_isr + sizeof(uint32_t) * 7 + 2] = ptr[2];
|
||||||
data[origin_isr + sizeof(uint32_t) * 7 + 3] = ptr[3];
|
data[origin_isr + sizeof(uint32_t) * 7 + 3] = ptr[3];
|
||||||
|
|
||||||
data[origin_isr + sizeof(uint32_t) * 4] = ptr[0];
|
// data[origin_isr + sizeof(uint32_t) * 4] = ptr[0];//hardfault
|
||||||
data[origin_isr + sizeof(uint32_t) * 4 + 1] = ptr[1];
|
// data[origin_isr + sizeof(uint32_t) * 4 + 1] = ptr[1];
|
||||||
data[origin_isr + sizeof(uint32_t) * 4 + 2] = ptr[2];
|
// data[origin_isr + sizeof(uint32_t) * 4 + 2] = ptr[2];
|
||||||
data[origin_isr + sizeof(uint32_t) * 4 + 3] = ptr[3];
|
// data[origin_isr + sizeof(uint32_t) * 4 + 3] = ptr[3];
|
||||||
|
|
||||||
Ion::Device::ExternalFlash::EraseSector(0);
|
Ion::Device::ExternalFlash::EraseSector(0);
|
||||||
Ion::Device::ExternalFlash::WriteMemory((uint8_t*)0x90000000, data, 1024*4);
|
Ion::Device::ExternalFlash::WriteMemory((uint8_t*)0x90000000, data, 1024*4);
|
||||||
@@ -119,7 +123,7 @@ void Boot::bootSelectedSlot() {
|
|||||||
// enableFlashIntr();
|
// enableFlashIntr();
|
||||||
config()->setBooting(true);
|
config()->setBooting(true);
|
||||||
config()->slot()->boot();
|
config()->slot()->boot();
|
||||||
Ion::Device::Flash::EnableInternalSessionLock();
|
// Ion::Device::Flash::EnableInternalSessionLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((noreturn)) void Boot::boot() {
|
__attribute__((noreturn)) void Boot::boot() {
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ HANDY_TARGETS += epsilon.A epsilon.B
|
|||||||
|
|
||||||
.PHONY: epsilon
|
.PHONY: epsilon
|
||||||
epsilon: $(BUILD_DIR)/epsilon.onboarding.bin
|
epsilon: $(BUILD_DIR)/epsilon.onboarding.bin
|
||||||
$(PYTHON) build/device/secure_ext.py $(BUILD_DIR)/epsilon.onboarding.bin
|
|
||||||
.DEFAULT_GOAL := epsilon
|
.DEFAULT_GOAL := epsilon
|
||||||
|
|
||||||
.PHONY: %_flash
|
.PHONY: %_flash
|
||||||
@@ -54,4 +53,3 @@ binpack: $(BUILD_DIR)/epsilon.onboarding.bin
|
|||||||
cp $(BUILD_DIR)/epsilon.onboarding.bin $(BUILD_DIR)/binpack
|
cp $(BUILD_DIR)/epsilon.onboarding.bin $(BUILD_DIR)/binpack
|
||||||
cd $(BUILD_DIR) && for binary in epsilon.onboarding.bin; do shasum -a 256 -b binpack/$${binary} > binpack/$${binary}.sha256;done
|
cd $(BUILD_DIR) && for binary in epsilon.onboarding.bin; do shasum -a 256 -b binpack/$${binary} > binpack/$${binary}.sha256;done
|
||||||
cd $(BUILD_DIR) && tar cvfz binpack-$(MODEL)-`git rev-parse HEAD | head -c 7`.tgz binpack/*
|
cd $(BUILD_DIR) && tar cvfz binpack-$(MODEL)-`git rev-parse HEAD | head -c 7`.tgz binpack/*
|
||||||
$(PYTHON) build/device/secure_ext.py $(BUILD_DIR)/epsilon.onboarding.bin
|
|
||||||
|
|||||||
@@ -70,6 +70,10 @@ void EnableInternalFlashInterrupt() {
|
|||||||
InternalFlash::EnableFlashInterrupt();
|
InternalFlash::EnableFlashInterrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClearInternalFlashErrors() {
|
||||||
|
InternalFlash::ClearErrors();
|
||||||
|
}
|
||||||
|
|
||||||
void LockSlotA() {
|
void LockSlotA() {
|
||||||
ExternalFlash::LockSlotA();
|
ExternalFlash::LockSlotA();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ void EnableInternalProtection();
|
|||||||
void SetInternalSectorProtection(int i, bool protect);
|
void SetInternalSectorProtection(int i, bool protect);
|
||||||
void EnableInternalSessionLock(); // Will cause BUSERR when enabled
|
void EnableInternalSessionLock(); // Will cause BUSERR when enabled
|
||||||
void EnableInternalFlashInterrupt();
|
void EnableInternalFlashInterrupt();
|
||||||
|
void ClearInternalFlashErrors();
|
||||||
void LockSlotA();
|
void LockSlotA();
|
||||||
void LockSlotB();
|
void LockSlotB();
|
||||||
|
|
||||||
|
|||||||
@@ -363,6 +363,17 @@ void EnableFlashInterrupt() {
|
|||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClearErrors() {
|
||||||
|
class FLASH::SR sr(0);
|
||||||
|
// Error flags are cleared by writing 1
|
||||||
|
sr.setERSERR(true);
|
||||||
|
sr.setPGPERR(true);
|
||||||
|
sr.setPGAERR(true);
|
||||||
|
sr.setWRPERR(true);
|
||||||
|
sr.setEOP(true);
|
||||||
|
FLASH.SR()->set(sr);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ void DisableProtection();
|
|||||||
void SetSectorProtection(int i, bool protect);
|
void SetSectorProtection(int i, bool protect);
|
||||||
void EnableSessionLock();
|
void EnableSessionLock();
|
||||||
void EnableFlashInterrupt();
|
void EnableFlashInterrupt();
|
||||||
|
void ClearErrors();
|
||||||
|
|
||||||
/* The Device is powered by a 2.8V LDO. This allows us to perform writes to the
|
/* The Device is powered by a 2.8V LDO. This allows us to perform writes to the
|
||||||
* Flash 32 bits at once. */
|
* Flash 32 bits at once. */
|
||||||
|
|||||||
Reference in New Issue
Block a user